TOTPジェネレーター

結果

Google 認証システム(Google Authenticator)やAuthyが30秒ごとに変わる6桁のコードを表示するとき、それがTOTPです。共有シークレットと現在のUnix時間から計算されるHMACで、RFC 6238として標準化されています。このジェネレーターは任意のBase32シークレットから同じコードを計算するので、新しい二段階認証(2FA)連携のデバッグ、サービスがコードを拒否する原因の切り分け、パラメーターを変えたときのアルゴリズムの挙動確認に役立ちます。使うのはテスト用シークレットにしてください。コードは当社のサーバーで計算されるため、アカウントを守る本物のシークレットの置き場所はWebページではなく認証アプリです。

このTOTPジェネレーターの使い方

  1. 1

    Base32シークレットを貼り付ける

    A~Zの文字と2~7の数字で、otpauth:// QRコードの中で使われる形式です。スペースと小文字は問題ありません。それ以外の文字は無効なBase32として表示されます。

  2. 2

    ハッシュアルゴリズムを選ぶ

    ほぼすべてのサービスがSHA-1を使います。SHA-256やSHA-512に切り替えるのは、サービスが明示的に要求している場合だけにしてください。

  3. 3

    桁数と期間を設定する

    6桁・7桁・8桁と、30秒または60秒のウィンドウを選びます。標準の組み合わせは30秒ごとの6桁です。

  4. 4

    現在のコードを読み取る

    コードは毎秒更新され、カウントダウンが現在のウィンドウの残り秒数を表示します。

  5. 5

    otpauth URIを比較する

    設定したパラメーターに対応するotpauth:// URIを表示するので、サービスのセットアップQRコードがエンコードしている内容と照合できます。

アルゴリズムをやさしい言葉で

TOTPはHOTP(HMACベースのワンタイムパスワード、RFC 4226)のカウンターを、現在のUnix時間をタイムステップ(通常30秒)で割った値に置き換えたものです。

counter = floor(unix_time / 30)
hash = HMAC-SHA1(secret, counter_as_8_byte_big_endian)
offset = last byte of hash AND 0x0F
truncated = 4 bytes from offset, with the top bit zeroed
code = truncated mod 10^digits

デバイスとサーバーが同じシークレットと同じ時計で同じ計算をするため、コード自体をどこにも送らずに両者が同じコードにたどり着きます。6桁のコードは、切り詰めたHMACを10^6で割った余りにすぎません。魔法ではなく、ただのハッシュ計算です。

一般的なパラメーター

サービス アルゴリズム 桁数 期間
ほとんどのサイトとアプリ SHA-1 6 30秒
GitHub SHA-1 6 30秒
Cloudflare SHA-1 6 30秒
Microsoftアカウント SHA-1 6 30秒
一部の銀行や企業VPN SHA-256またはSHA-512 8 60秒

サービスにコードを拒否されたら、まず桁数と期間、次にアルゴリズムを確認してください。また、一部の認証アプリは標準外のパラメーターを黙って無視します(Google 認証システムは歴史的にすべてをSHA-1・6桁・30秒として扱っていました)。必ず、利用者が実際に使うアプリそのもので試してください。

シークレットを安全に保管する

  • 2FAシークレットをメールやメッセージで送らない。 受信トレイに入った瞬間から、プロバイダーのログとバックアップに残り続けます。
  • 登録はQRコードのスキャンで行う。 QRコードには、シークレット・アルゴリズム・桁数・期間を一つの明確なパッケージにまとめたotpauth://totp/... URIが入っています。
  • 登録した時点でバックアップする。 復元コード、またはシークレットそのものをパスワードマネージャーに保管してください。それが無いままスマートフォンを失うと、締め出されます。
  • サービスごとにシークレットは一つ。 どのサービスも設定時に固有のシークレットを発行します。漏えいしたら、そのサービスで2FAを登録し直して古いシークレットを無効にしてください。

時刻のずれ

TOTPは双方の時計が一致している間だけ機能します。このページはサーバーの時計でコードを計算するため、ここのコードがスマートフォンの認証アプリと違う場合、最初に疑うべきはデバイスの時計です。ほとんどの検証システムは前後1ウィンドウ(30~60秒)のずれを許容します。それを超えるなら、シークレットを疑う前にデバイスの時刻をNTPで同期してください。

ここではテスト用シークレットを使う

このツールはコードを当社のサーバーで計算します。入力したシークレットは更新のたびにHTTPSで送信され、ツールのステップを移動するとページのURLにも現れます。使い捨てのシークレットでの開発・デモ・デバッグにはそれで十分です。しかし、メールや銀行口座を守っている本物のシークレットを入れる場所ではありません。それはスマートフォンの専用認証アプリに置くべきものです。もし本物のシークレットを認証アプリの外に貼り付けてしまったなら、そのサービスで2FAを登録し直してシークレットを更新してください。

よくある質問

このページは金庫ではなく、開発・テスト用のユーティリティとして扱ってください。コードはサーバー側で計算されるため、シークレットはHTTPSで当社のサーバーへ送られ、ステップ間ではページのURLに現れることがあります。デモや開発用のシークレットなら自由に使えますが、大切なアカウントの本物のシークレットは決して貼り付けないでください。すでに貼り付けてしまった場合は、そのサービスで2FAを登録し直してシークレットを交換してください。

まずパラメーターを確認してください。アルゴリズム・桁数・期間は、サービスが発行した値と完全に一致している必要があります。次に時計です。このページはサーバーの時計を使うので、ずれている場合はたいてい相手側デバイスの時計が原因です。最後に、一部のアプリが標準外パラメーターを無視することも思い出してください。代表例はGoogle 認証システムです。

Base32のみです。AからZの文字と2から7の数字で、=のパディングは任意です。スペースは取り除かれ、小文字は自動的に変換されます。16進数や生バイトのシークレットは先にBase32へ変換してください。そうでないと無効なBase32シークレットと表示されます。

そのアカウントの2FAから締め出されます。サービスの復旧手続き(復元コード、本人確認、SMSによる代替手段)を使ってください。設定時には、復元コードか最初のQRコードを必ず安全な場所に保管しておきましょう。

使えます。サーバー側で128ビット以上(RFC 4226は160ビットを推奨)のランダムなシークレットを生成し、QRコードとして一度だけ表示し、送信されたコードは同じHMACを計算して検証します。通常は前後1ウィンドウの許容幅を設けます。成熟したライブラリがどのスタックにもあります:pyotp(Python)、otplib(JavaScript)、rotp(Ruby)。

関連ツール

このツールは他の言語でも利用できます