本文へスキップ
App Museum
English

TOTP生成ツール(ワンタイムパスワード)

Base32の秘密鍵から、2段階認証で使う6桁のワンタイムパスワード(TOTP)をブラウザ内で計算。前後のコードとの照合、SHA-256・8桁などの設定、otpauth:// URIの読み込みと作成、認証アプリで読み取るQRコードの表示に対応。

サービスの2段階認証の設定画面に出る「セットアップキー」です。空白やハイフンで区切られていても、小文字でもそのまま使えます。

コードの設定

ハッシュ関数

桁数

アカウント名を入れると、認証アプリに登録するための otpauth:// のURIを表示します。

認証アプリやサーバーが出したコードを入れると、このページのコードと比べます。

使い方

  1. 「秘密鍵」に、Base32で書かれた鍵(セットアップキー)を貼り付けます。試すだけなら「ランダムな鍵を作る」を押します
  2. 「現在のコード」に、いま有効なワンタイムパスワードが表示されます。その左に1つ前のコード、右に次のコードが、時間の順に並びます。下の線は太いところが過ぎた時間で、縦の短い線がいまの時刻です。「あと◯秒で切り替わります」が、次のコードに替わるまでの時間です
  3. 「コピー」で、現在のコードを区切りの空白なしでコピーできます
  4. サービスが指定している場合だけ、「コードの設定」でハッシュ関数・桁数・更新の間隔を変えます。指定がなければ、初期値(SHA-1・6桁・30秒)のままで認証アプリと同じコードになります
  5. 認証アプリやサーバーが出したコードと比べたいときは、「確かめるコード」に入力します
  6. 認証アプリに登録したいときは、「アカウント名」を入力します。登録用のURIと、そのURIのQRコードが表示されるので、認証アプリで読み取ります

計算はすべてブラウザ内で行われ、鍵やコードがサーバーへ送信されることはありません。

TOTPとは

TOTP(Time-based One-Time Password)は、2段階認証(2要素認証)で使う「30秒ごとに変わる6桁の数字」を作る方式です。RFC 6238 で決められていて、Google Authenticator、Microsoft Authenticator、1Password などの認証アプリが同じ方式を使っています。

サービスと認証アプリは、最初に同じ秘密鍵を持ち合います(QRコードの読み取りがこれにあたります)。そのあとは両者が「秘密鍵」と「現在の時刻」から同じ計算をするので、通信しなくても同じ数字になります。

計算は次の順に行います。

  1. 現在のUnix時刻(秒)を更新の間隔(ふつうは30)で割り、小数点以下を切り捨てます。これがカウンターです
  2. 秘密鍵を鍵にして、カウンター(8バイト)の HMAC を計算します
  3. HMAC の最後の4ビットが示す位置から4バイトを取り出し、先頭の1ビットを落とした31ビットの数にします
  4. その数の下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
  • パスワード生成ツール

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

    ユーティリティ開発者向けpasswordpassphrasegeneratorsecurityrandom
  • UUID・ULID生成ツール

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

    ユーティリティ開発者向けuuidguiduuidv4uuidv7ulidgeneratordecodertimestampdeveloperid
  • カレンダー予定作成ツール(ICSファイル・Googleカレンダー追加リンク)

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

    ユーティリティ開発者向けicsicalendarcalendargoogle-calendaroutlookeventgeneratorschedule