5月26日、ProtonがセキュリティブログでHMAC-based one-time password(HOTP)について解説した記事「What is an HMAC-based one-time password (HOTP)?」を公開した。
Google Authenticatorのコードは30秒で切り替わるが、YubiKeyのコードは使うまで有効だ。この違いの背景には、TOTP(時刻ベース)とHOTP(カウンターベース)という根本的に異なる認証技術がある。近年のゼロトラスト戦略や産業システムのセキュリティ強化において、時刻同期に依存しないHOTPへの注目が高まっている理由を探ってみよう。
なぜ今「時間に依存しない認証」が求められるのか
2023年以降、製造業や金融機関でのサイバー攻撃が相次ぐ中、従来のTOTP認証では対応困難な課題が浮上している。工場の制御システムや僻地の設備では、ネットワーク接続が不安定で正確な時刻同期が困難だ。また、長時間の海外出張や災害時の緊急アクセスでは、30秒という時間制約が致命的な問題となる場合がある。
HOTP(HMAC-based one-time password)は、こうした課題を解決する技術として再注目されている。時刻ではなく「カウンター値」に基づいてパスワードを生成するため、生成されたコードは使用されるまで有効であり続ける。
HOTPの核心技術:「番号付きクーポン券」システム
HOTPの仕組みは、記事中で「番号付きクーポン券の束」と例えられている。使用済みのクーポンは再利用できず、次のものを順番に使用しなければならない。この比喩は、HOTPの本質を的確に表している。
技術的には、HMAC(Hash-based Message Authentication Code)という暗号化技術を使用して、秘密鍵とカウンター値の組み合わせから改ざん耐性のある一意のコードを生成する。
3段階の認証プロセス
1. セットアップ段階
ハードウェアトークンの初期設定時に、デバイスと認証サーバー間で秘密鍵を安全に共有・保存する。この秘密鍵は以降の全ての認証で使用される。
2. コード生成段階
デバイスがHMAC暗号化ハッシュ関数を使用して、共有秘密鍵と現在のカウンター値を組み合わせ、6〜8桁の予測不可能なワンタイムパスワードを生成する。
3. 認証段階
ユーザーがHOTPコードを入力すると、サーバーが独自の秘密鍵とカウンターのコピーを使用して同じ計算を実行する。コードが一致すれば、両者のカウンターが同期してアクセスが許可される。
YubiKeyでの実装:物理ボタンが生む信頼性
YubiKeyなどのハードウェアセキュリティキーでは、HOTPの特性を最大限に活かした実装が行われている。物理的なボタンを押すことでコードを生成し、デバイスの内蔵時計の精度に関係なく確実な認証が可能だ。
この特性は以下のような実環境で威力を発揮する:
- 工場制御システム:ネットワーク接続が制限された産業環境
- 災害対応:通信インフラが不安定な緊急時のシステムアクセス
- 長期出張:時差や移動中でも確実に認証したい場合
- 組み込みシステム:時刻同期機能を持たないIoTデバイス
HOTP vs. TOTP:使い分けの実践指針
TOTP(Time-based one-time password)との使い分けは、利用環境によって決まる:
TOTPが適している場面:
- 一般的なWebサービスへの日常アクセス
- 安定したネットワーク環境での利用
- セキュリティと利便性のバランスを重視する場合
HOTPが適している場面:
- オフライン環境や不安定なネットワークでの利用
- 時間的プレッシャーを避けたい重要な認証
- 長期間有効なアクセスコードが必要な場合
制限事項への対処法
HOTPには以下の注意点がある:
- 無期限の有効性:新しいコードを生成しない限り、HOTPコードは有効であり続ける
- カウンター同期ずれ:使用せずにコードを複数回生成すると、デバイスとサーバーの同期が崩れる可能性
- 手動管理の必要性:使用後に新しいコードを生成することを忘れやすい
多くの実装では、サーバー側で複数のカウンター値を許容する「ルックアヘッド・ウィンドウ」機能により、軽度の同期ずれを自動修正している。
標準化と今後の展望
HOTPはRFC 4226で標準化されており、TOTP(RFC 6238)の基盤技術でもある。現在、FIDO Allianceの次世代認証規格においても、HOTPの特性を活かした拡張仕様の検討が進められている。
クラウドファーストの時代においても、確実なオフラインアクセスと時間的制約の少なさは、ミッションクリティカルなシステムにおいて重要な価値を提供し続けている。
詳細はWhat is an HMAC-based one-time password (HOTP)?を参照していただきたい。