コンテンツへスキップ
uencoder

暗号操作に対するタイミング攻撃を防ぐ

タイミング攻撃は実行時間の揺らぎを利用して秘密情報を漏洩させます。定数時間比較、均一な処理、ブラインディングの手法を学びましょう。

  1. 1

    タイミング攻撃は、操作にかかる時間を測定して、シークレットに関する情報を推測します。例えば、最初の不一致で早期に返る文字列比較は、何文字一致したかを漏らします。防御:シークレットデータに対するすべての操作は、データ値に依存しない時間で完了しなければなりません。

  2. 2
    ハッシュ比較ツール →

    ハッシュを一定時間で比較します。このツールは、最初の不一致位置に関係なく、常にすべてのバイトを処理するバイト単位の比較を行います。ハッシュや HMAC の比較に === を使わないでください。短絡評価されてタイミング情報が漏れます。

  3. 3
    HMAC ジェネレーター →

    認証用の HMAC を生成します。検証時には、一定時間比較の関数(Node.js の crypto.timingSafeEqual)を使ってください。比較は、一致位置に関係なくすべてのバイトに触れなければなりません。

  4. 4

    RSA ではブランキングを使います。署名前にメッセージにランダム値 r^e を掛け、結果を r で割ります。これにより計算時間がランダム化され、タイミングベースの鍵復元を防ぎます。最近の暗号ライブラリ(OpenSSL、Web Crypto)はこれを内部で行います。常にライブラリの関数を使い、暗号を独自に実装しないでください。

よくある質問

タイミング攻撃はどう動作しますか?
攻撃者は多数のリクエストを送り、応答時間を測定します。シークレットの先頭バイトが一致すると、比較にわずかに長くかかります。各バイトですべての値を試してタイミングを観察することで、攻撃者はシークレットを 1 バイトずつ復元します。ネットワーク経由での実証もあります(精度約 15 ミリ秒)。
非シークレットデータの比較に === は安全ですか?
はい。タイミング攻撃が問題になるのは、比較対象の値がシークレット(パスワード、ハッシュ、トークン)のときだけです。機密性のない比較(例:ユーザーロールが "admin" かの確認)では === で問題ありません。ルール:一定時間比較はシークレットにのみ使ってください。

このタスクを解決するワークフロー

関連ツール