TOTP生成ツール(ワンタイムパスワード)
Base32の秘密鍵から、2段階認証で使う6桁のワンタイムパスワード(TOTP)をブラウザ内で計算。前後のコードとの照合、SHA-256・8桁などの設定、otpauth:// URIの読み込みと作成、認証アプリで読み取るQRコードの表示に対応。
サービスの2段階認証の設定画面に出る「セットアップキー」です。空白やハイフンで区切られていても、小文字でもそのまま使えます。
アカウント名を入れると、認証アプリに登録するための otpauth:// のURIを表示します。
認証アプリやサーバーが出したコードを入れると、このページのコードと比べます。
使い方
- 「秘密鍵」に、Base32で書かれた鍵(セットアップキー)を貼り付けます。試すだけなら「ランダムな鍵を作る」を押します
- 「現在のコード」に、いま有効なワンタイムパスワードが表示されます。その左に1つ前のコード、右に次のコードが、時間の順に並びます。下の線は太いところが過ぎた時間で、縦の短い線がいまの時刻です。「あと◯秒で切り替わります」が、次のコードに替わるまでの時間です
- 「コピー」で、現在のコードを区切りの空白なしでコピーできます
- サービスが指定している場合だけ、「コードの設定」でハッシュ関数・桁数・更新の間隔を変えます。指定がなければ、初期値(SHA-1・6桁・30秒)のままで認証アプリと同じコードになります
- 認証アプリやサーバーが出したコードと比べたいときは、「確かめるコード」に入力します
- 認証アプリに登録したいときは、「アカウント名」を入力します。登録用のURIと、そのURIのQRコードが表示されるので、認証アプリで読み取ります
計算はすべてブラウザ内で行われ、鍵やコードがサーバーへ送信されることはありません。
TOTPとは
TOTP(Time-based One-Time Password)は、2段階認証(2要素認証)で使う「30秒ごとに変わる6桁の数字」を作る方式です。RFC 6238 で決められていて、Google Authenticator、Microsoft Authenticator、1Password などの認証アプリが同じ方式を使っています。
サービスと認証アプリは、最初に同じ秘密鍵を持ち合います(QRコードの読み取りがこれにあたります)。そのあとは両者が「秘密鍵」と「現在の時刻」から同じ計算をするので、通信しなくても同じ数字になります。
計算は次の順に行います。
- 現在のUnix時刻(秒)を更新の間隔(ふつうは30)で割り、小数点以下を切り捨てます。これがカウンターです
- 秘密鍵を鍵にして、カウンター(8バイト)の HMAC を計算します
- HMAC の最後の4ビットが示す位置から4バイトを取り出し、先頭の1ビットを落とした31ビットの数にします
- その数の下6桁(8桁の設定なら下8桁)がコードです。桁が足りなければ先頭を0で埋めます
具体例
RFC 6238 に載っているテスト用の値です。鍵は、文字列 12345678901234567890 をBase32にした GEZDGNBVGY3TQOJQGEZDGNBVGY3TQOJQ です。
- Unix時刻
59秒は、30秒ごとに数えて1番目の区間です(59 ÷ 30 = 1.96…を切り捨て) - この区間のコードは、SHA-1・8桁の設定で
94287082、6桁の設定ではその下6桁の287082です - 1つ前の区間(
0〜29秒)のコードは755224、次の区間(60〜89秒)のコードは359152です - Unix時刻
1111111109秒のコードは、SHA-1・8桁で07081804です。先頭の0もコードの一部です
このページは現在の時刻のコードを表示するので、上の値がそのまま画面に出ることはありません。同じ鍵を認証アプリにも登録すると、アプリとこのページに同じコードが並ぶことを確かめられます。
コードを確かめる
「確かめるコード」に数字を入れると、現在のコードと、その1つ前・1つ次のコードの3つと比べます。空白は無視します。一致したコードの欄には「✓ 一致」の印が付きます。
- 現在のコードと一致: 鍵・設定・時計がそろっています
- 1つ前のコードと一致: コードを出した側の時計が遅れているか、コードが出てから入力するまでに区間をまたいでいます
- 次のコードと一致: コードを出した側の時計が進んでいます
- どれとも一致しない: 鍵か設定が違うか、時計が1区間より大きくずれています
多くのサービスは、時計のずれや入力の遅れを見込んで、前後1つずつのコードも受け付けます。自分でサーバー側を実装するときも、同じ幅を持たせるのが一般的です。
otpauth:// のURIを読み込む・作る
認証アプリが読み取るQRコードの中身は、次のようなURIです。
otpauth://totp/Example:alice@example.com?secret=JBSWY3DPEHPK3PXP&issuer=Example&algorithm=SHA1&digits=6&period=30
- 読み込む: このURIを「秘密鍵」の欄に貼り付けると、鍵・サービス名・アカウント名・ハッシュ関数・桁数・更新の間隔をまとめて読み込みます。
algorithm・digits・periodが書かれていないURIは、SHA-1・6桁・30秒として扱います - 作る: 鍵と「アカウント名」を入力すると、いまの設定のURIを表示します。「サービス名」は、認証アプリの一覧に出る名前になります。2つの名前に
:(コロン)は使えません。また、この形式で指定できる桁数は6と8だけなので、7桁の設定ではURIを表示しません
作ったURIは、すぐ下にQRコードとしても表示します。認証アプリの「QRコードをスキャン」でカメラを向けると、そのまま登録できます。QRコードは誤り訂正レベルM(約15%)で、周りに読み取りに必要な白い余白を付け、ダークモードでも白地に黒で描きます。
QRコードには秘密鍵がそのまま入っています。画面を写真に撮られたり、画像を共有したりしないでください。PNGやSVGの画像として保存したいときは、URIをコピーしてQRコード生成ツールに貼り付けます。
otpauth://hotp/ で始まるカウンター式(HOTP)のURIは扱いません。
設定の選び方
- ハッシュ関数: ほとんどのサービスは SHA-1 です。SHA-256・SHA-512 は、サービスが明示している場合だけ選びます。認証アプリの中にはこの指定を無視して常に SHA-1 で計算するものがあるので、自分で設計するときは SHA-1 のままにしておくと、どのアプリでも動きます
- 桁数: 6桁が標準です。8桁は一部のサービスが使います。7桁は計算できますが、otpauth:// のURIでは指定できません
- 更新の間隔: 30秒が標準です。60秒のサービスもあります
TOTP が SHA-1 を使うことは、いまのところ問題になっていません。SHA-1 で見つかっている弱点は「同じハッシュ値になる2つのデータを作れる」というもので、鍵を知らない人が HMAC の値を当てられるわけではないためです。
FAQ
認証アプリと違うコードが表示されます
次の順に確かめてください。
- 時計: このページは、使っている端末の時計でコードを計算します。端末の時刻が30秒以上ずれていると、別のコードになります。OSの「時刻を自動的に設定」を有効にしてください
- 鍵: 途中で切れていないか、
0(ゼロ)とO(オー)、1とI・Lを取り違えていないかを確かめます。Base32の鍵に0・1・8・9は出てきません - 設定: サービスが8桁や SHA-256 を指定しているのに、初期値のままになっていないかを確かめます
「確かめるコード」に認証アプリのコードを入れて「1つ前」か「次」と一致するなら、鍵と設定は合っていて、時計だけがずれています。
QRコードが表示されません
QRコードは、認証アプリ用のURIが表示されているときだけ出ます。次のどれかにあたっていないかを確かめてください。
- 「アカウント名」が空になっている
- 桁数が7桁になっている(otpauth:// のURIで指定できるのは6桁と8桁だけです)
- サービス名かアカウント名に
:(コロン)が入っている - 秘密鍵か更新の間隔にエラーが出ている
URIが長すぎてQRコードに入りきらない場合は、URIだけを表示して、そのことをお知らせします。サービス名かアカウント名を短くしてください。
本番で使っている秘密鍵を入力しても大丈夫ですか?
鍵はブラウザ内だけで処理し、送信も保存もしません。ただし、秘密鍵は2段階認証の「2つ目の要素」そのものです。鍵を知っている人は、いつでも正しいコードを作れます。画面を見られる場所や共用のパソコンでは入力せず、動作の確認にはテスト用のアカウントの鍵を使ってください。
「ランダムな鍵を作る」の鍵は、そのまま使えますか?
ブラウザの暗号用の乱数(crypto.getRandomValues)で作った160ビット(Base32で32文字)の鍵で、RFC 4226 が勧める長さです。開発中の動作確認や、自分のサービスの試作には使えます。本番のユーザーの鍵は、サーバー側で作って安全に保存してください。
鍵が16進数(hex)やBase64で書かれています
このページが読めるのはBase32の鍵だけです。Base32の鍵は、英字のA〜Zと数字の2〜7でできています。16進数の鍵(0〜9 と a〜f)は、先にBase32へ変換してください。
鍵に空白やハイフン、= が入っています
そのまま貼り付けて大丈夫です。jbsw y3dp ehpk 3pxp のように4文字ずつ区切られた鍵、小文字の鍵、末尾に = が付いた鍵は、どれも同じ鍵として読み取ります。
「鍵の文字数が合いません」と表示されます
Base32は8文字で5バイトを表すので、余りが1・3・6文字になる長さの鍵は存在しません。その長さの鍵は、写すときに文字が抜けたか、余分な文字が入っています。足りないまま計算すると別の鍵のコードになるため、このページでは計算せずにエラーにしています。
HOTPとは何が違いますか?
HOTP(RFC 4226)は、ボタンを押すたびに1ずつ増えるカウンターからコードを作ります。TOTP は、そのカウンターを「現在の時刻 ÷ 更新の間隔」に置き換えたものです。計算の中身は同じです。
SMSやメールで届く認証コードも計算できますか?
いいえ。SMSやメールのコードは、サービスがその場で作って送っている乱数で、秘密鍵から計算するものではありません。このページで扱えるのは、認証アプリに登録して使うTOTPだけです。
Steamのコードや、5桁のコードは作れますか?
いいえ。Steamガードは数字ではなく独自の文字を使う別の形式です。このページは、数字6・7・8桁のTOTPに対応しています。
コードは何秒ごとに変わりますか?
更新の間隔(初期値は30秒)ごとです。鍵を入力した時点から数えるのではなく、Unix時刻の0秒(1970年1月1日 0時 UTC)から間隔ごとに区切ります。間隔が30秒なら、時計の秒が 00 と 30 になったときに切り替わります。60秒なら、毎分 00 秒です。
入力した鍵は保存されますか?
いいえ。処理はすべてブラウザ内で完結し、ページを再読み込みすると消えます。
- 種別
- ユーティリティ
- カテゴリ
- 開発者向け
- タグ
- totp
- otp
- 2fa
- authenticator
- security
- generator
- qr
関連アプリ

パスワード生成ツール
文字数と文字の種類を選んで、安全なランダムパスワードをまとめて生成。英単語をつなげたパスフレーズ、使う記号の指定、紛らわしい文字の除外、強度の目安にも対応。

UUID・ULID生成ツール
UUID v4 と、時刻順に並ぶ UUID v7・ULID をまとめて生成。ボタンひとつで最大100件を作成し、UUIDは大文字・ハイフンなし・波かっこ付きの形式に切り替えてコピーできます。貼り付けたUUID・ULIDのバージョンと作成時刻を調べ、ULIDとUUIDの書き方を相互に変換することもできます。

カレンダー予定作成ツール(ICSファイル・Googleカレンダー追加リンク)
予定名・日時・場所から、iPhone・Mac・Outlook・Googleカレンダーに読み込める .ics ファイルと、Googleカレンダー・Outlookに追加するリンクを作成。終日・繰り返し(毎週の曜日・第○曜日・回数・終了日)・通知・タイムゾーンに対応します。


