日本語
  • passwordless
  • ワンタイムパスワード
  • otp
  • 時間ベースの otp
  • ハッシュベースの otp

ワンタイムパスワード (OTP) はどのように機能するのか?

この記事では、2つの異なるワンタイムパスワードの方法、メール/電話 + 認証コードと動的コードを紹介します。

Darcy Ye
Darcy Ye
Developer

インターネットが進化するにつれて、私たちはほぼすべてのニーズを満たすために多様なオンラインサービスを利用してきました。これらのサービスを利用する最初のステップは、多くの場合、登録とログインです。登録とサインインに関しては、ユーザーIDとパスワードの認証が依然として広く使用されていますが、スタンドアロンのデスクトップコンピュータがまだインターネットに接続できなかった時代から30年以上が経過しています。

過去には、メールアカウントのパスワードだけを覚えればよかったこともありましたが、今では数十、さらには数百のオンラインサービスを使用しており、すべてに同じパスワードを使用することはできません(あるアカウントのパスワードが侵害されると、同じパスワードを使用しているすべてのアカウントが危険にさらされます)。その結果、パスワードなしのサインインがますます人気となり、徐々に主流のアプローチとなっています。

ソーシャルサインイン、メール/電話 + 認証コード、動的パスワードを使用した認証アプリなど、さまざまな パスワードなし認証 方法がありますが、これらは限定されません。後者の2つの方法はワンタイムパスワード (OTPs) として分類できます。

ワンタイムパスワード (OTP) とは?

OTP は自動生成される文字列で、単一のログインセッションまたは短期間のみ有効です。OTP は一度しか使用できないため、紛失や盗難などの資格情報漏洩のリスクを防ぐことができます。

理論的には、OTP は特定の長さのランダムな文字列であり、大文字や小文字、さらには特殊記号を含むことができます。しかしユーザー体験のために、ほとんどのサービスは OTP を使用するときに純粋な数字を使用します。

メール / 電話 + 認証コード

多くのウェブサイトでは、登録したメールまたは電話番号に認証コード(またはパスコード)を送信することで本人確認を求められます。

ジャックとジョーが数字当てゲームをしているとしましょう。ジャックは0から999の間の数字を考え、ジョーに1分以内で3回当てるチャンスを与えます。ジョーにはその数字の範囲以外の情報はありません。

私たちは皆、ジョーが1分以内に3回の試みだけで数字を正しく当てるのはほとんど不可能だと知っています。

メール / 電話 + 認証コードは同じ原理で動作します。認証コードは一般的に非常に短期間有効で、通常10分以内です(ジャックがジョーに「1分」を与えるのと同様)。さらに、認証コードを検証するための API や方法には通常、ブルートフォース攻撃を防ぐためのレート制限があります(ジャックがジョーに「3回のチャンス」しか与えないのと同様)。

潜在的な攻撃者にとって、この方法を破るのはほとんど不可能です。しかし、システムは信頼されたチャンネル(メールまたは電話)を通じてユーザーに認証コードを伝え、ユーザーが直接それを確認できるようにします。

動的コード

動的コード、別名時間ベース OTP (TOTP)、は「動的」な意味で時間とともに変わります。一般的に、ウェブアプリが TOTP を使用する場合、RFC6238 - TOTP: Time-Based One-Time Password Algorithm に従います。

ハッシュベースのワンタイムパスワード

TOTP を紹介する前に、RFC4226 - HOTP: An HMAC-Based One-Time Password Algorithm を簡単に説明する必要があります(HMAC は ハッシュアルゴリズム の一つです)。HOTP アルゴリズムは次のように動作します。

  1. 秘密: HOTP は共有秘密キー K を必要とし、サーバーとクライアントの間で同じです。

  2. カウンター: HOTP の核心はカウンター C で、新しいパスワードが生成されるたびにカウントアップされます。

  3. HMAC 計算:

    • HMAC-SHA-1(または他のハッシュ関数)を使用して認証コードを計算します:

      hmac 計算
    • ここで、H は160ビットのハッシュ値です。

  4. 切り捨て: ハッシュ値 H の一部を抽出して OTP を生成します。6桁の OTP を望む場合、プロセスは次の通りです:

    • H の最後のバイトを切り捨てオフセット O として抽出します。
    • O から始まる4バイトを抽出し、整数 T に変換します。
    • T の最後の d 桁を取り、すなわち OTP = T mod 10^d。

要約すると、HOTP の公式は次の通りです:

ハッシュベースの otp 計算

ここで d は希望する OTP の長さ(通常6-8桁)です。

時間ベースのワンタイムパスワード

TOTP は HOTP の拡張であり、カウンターが時間ステップに置き換えられます。それは現在の時間を使用して動的な認証コードを生成し、OTP は時間とともに自動的に期限切れになります。動作原理は次の通りです。

  1. 時間ステップ: TOTP は HOTP カウンター C の代わりに現在の時間 T を使用します。時間ステップは設定された固定時間間隔(通常30秒)です。

    • 例として、時間ステップが30秒で、現在の Unix タイムスタンプが T の場合、TOTP カウンターは次のように計算されます:T' = T / time_step
    • ここで T′ は時間ステップカウンターで、30秒単位です。
  2. OTP 生成: T′ を HOTP アルゴリズムに代入して OTP を生成します:

    totp 生成
  3. 動的な更新: TOTP は時間ステップに基づいているため、OTP は時間とともに変わり、サーバーはその OTP が有効な時間枠内であればその有効性を確認できます。

要約すると、TOTP の公式は次の通りです:

totp 計算

認証アプリを使用した経験に基づいて、QR コードをスキャンするか、直接コピー&ペーストすることで、デバイスとサーバー間で秘密値を同期でき、その後現在の動的コードを一度入力して秘密値が同じであることを確認する必要があります。

モバイルデバイスを最初に使用する頃は、異なるデバイスの時間が同じではないことがあり、定期的に手動で時間を調整する必要がありました。近年では、ほぼすべてのデバイスがネットワーク時間サービス (NTP) を使用してデバイスの時間を定期的に同期および更新しています。デバイスの時計が完全に正確でなくても、頻繁な更新により異なるデバイス間で時間の整合性が保たれます。この仮定に基づいて、デバイスがオフラインでも動的コードは使用できますが、オフライン状態で認証コードを受信するのは難しいです。

終わりに

この記事では、2つの異なるワンタイムパスワードの方法、メール/電話 + 認証コードと動的コードを紹介しました。

メール/電話 + 認証コードは通信インフラとサードパーティのメールまたはショートメッセージサービス (SMS) に依存して実装されますが、動的コードは外部サービスや通信設備に依存せず、オフラインでも使用できます。

Logto は人気があり強力で高度に拡張可能な IAM (Identity and Access Management) サービスとして、両方の OTP 方法をサポートし、ユーザーがビジネスの観点から最適なソリューションを選択できるようにします。