タイミング攻撃(Timing Attack)とは?新人エンジニア向けにやさしく解説!

こんにちは。ゆうせいです。

今回はセキュリティの世界でよく聞くけれど、「名前だけ知ってる」という人も多いタイミング攻撃(Timing Attack)について、やさしく、丁寧に、例え話をまじえて説明していきます。


タイミング攻撃とは?

定義とざっくり概要

タイミング攻撃とは、処理にかかる時間のわずかな差から、本来見えないはずの情報を盗み出そうとする攻撃です。

「えっ?処理時間なんてどうでもよくない?」と思うかもしれませんが、実はこの“ほんの少しの遅さ”が、攻撃者にとって大きなヒントになることがあります。


例え話:鍵の暗証番号を破る泥棒

あなたが暗証番号付きの金庫を使っているとしましょう。

  • 正しい暗証番号を入れると、すぐに「カチャッ」と開きます。
  • 1桁目が正しいと、次の桁の処理に進むので、わずかに遅くなる
  • 全部間違っていると、すぐにエラーになります。

この微妙な時間差をストップウォッチで測りながら試すと…

泥棒は「お、この桁は正しそうだな」と見抜けてしまう!

これがタイミング攻撃の本質です。


なぜタイミング攻撃が成り立つの?

プログラムの「if文」が落とし穴になる

多くの認証処理では、以下のような単純な比較が使われます。

if (input.equals(correct)) {
    // 正解処理
}

でも内部的には、1文字ずつ比較しているため、違う位置で止まると処理時間にわずかな差が出ます。

攻撃者はその時間差を何度も測定・統計分析することで、次第に正しいパスワードやトークンを推測できてしまうのです。


どれくらい差が出るの?

差は本当にわずか、数十ナノ秒〜数マイクロ秒のレベルです。

でも、攻撃者が100万回、1000万回と試せば――
「この桁は正しそう」「この桁は違う」ということが統計的にわかってしまうのです。


実際に狙われやすい例

攻撃対象説明
パスワード比較一致文字の数で処理時間が変わると危険
認証トークン(JWTなど)HMAC署名が一致するかどうかの比較
APIキーや署名の検証署名が部分一致しているかどうかでタイミング差発生

対策:時間一定の比較処理(定数時間比較)

最も効果的な対策は、処理時間が入力に関係なく“常に一定”になるようにすることです。

Javaでの例(タイミング攻撃に強い比較)

/**
 * タイミング攻撃を防ぐための安全なバイト配列比較メソッド。
 * 配列aとbが完全に一致しているかどうかを、一定の処理時間で判定する。
 * 
 * @param a 比較対象のバイト配列1
 * @param b 比較対象のバイト配列2
 * @return 一致していればtrue、そうでなければfalse
 */
public static boolean safeEquals(byte[] a, byte[] b) {
    // 長さが異なる場合は即座にfalseを返す(ここはタイミング攻撃に影響しない)
    if (a.length != b.length) return false;

    int result = 0;

    // 配列全体を通して、各バイトをXORで比較
    for (int i = 0; i < a.length; i++) {
        // 各バイトのXOR結果をresultに蓄積(1つでも違えば最終結果は0にならない)
        result |= a[i] ^ b[i];
    }

    // 最終的に差分が一つもなければresultは0 → 完全一致
    // 差分が1ビットでもあればresultは0以外 → 不一致
    return result == 0;
}

どうして安全?

  • すべてのバイトを必ず最後まで比較する
  • 差が見つかっても、即座に終了しない
  • 比較時間が“入力の内容に左右されない”

これにより、攻撃者が処理時間から中身を推測することが非常に困難になります。


よくある誤解

誤解実際は…
「処理時間の差なんて微々たるもの」高速なマシン・高精度な計測で差が見えてしまう
「認証が失敗すればいいでしょ?」処理時間が“どこで失敗したか”を教えてしまう可能性がある
「SSL/TLSで守られてるから安全」通信内容は暗号化されても、“処理時間”までは隠せない

まとめ

  • タイミング攻撃は、処理の遅さ・速さを手がかりに機密情報を探る手法
  • 特にパスワードやトークンなど、認証まわりで注意が必要
  • 対策には、定数時間比較(constant-time comparison)を使おう
  • Javaでは byte[] を使い、最後まで走査して結果をまとめるのが基本

今後の学習のポイント

  1. 定数時間比較をフレームワークでも意識できるようにする
  2. ライブラリを選ぶときは「タイミング攻撃への耐性があるか?」を確認
  3. パスワードだけでなくHMAC・署名・JWTの検証にも応用する

タイミング攻撃は、一見マニアックなようでいて、ちょっとしたコードの油断から大きな事故につながる危険があります。

「そんな細かいところまで気にするの?」
はい、気にすべきです。

セイ・コンサルティング・グループの新人エンジニア研修のメニューへのリンク

投稿者プロフィール

山崎講師
山崎講師代表取締役
セイ・コンサルティング・グループ株式会社代表取締役。
岐阜県出身。
2000年創業、2004年会社設立。
IT企業向け人材育成研修歴業界歴20年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。