レインボーテーブル攻撃とは?仕組みや総当たり攻撃との違い、ソルトによる対策を初心者向けにわかりやすく解説
はじめに
情報セキュリティについて学んでいると、レインボーテーブル攻撃という言葉が登場します。
レインボーテーブル攻撃とは、パスワードそのものではなく、パスワードをハッシュ化した値を狙う攻撃手法です。
あらかじめ大量の文字列とハッシュ値の対応関係を計算しておき、漏えいしたハッシュ値と照合することで、元のパスワードを効率よく推測します。
しかし、初めて学ぶ方にとっては、
- レインボーテーブルとは何なのか
- パスワードそのものを盗む攻撃なのか
- ハッシュ値から本当に元のパスワードが分かるのか
- 総当たり攻撃や辞書攻撃とは何が違うのか
- なぜソルトを付けると対策になるのか
- MD5やSHA-1とどのような関係があるのか
- 長いパスワードなら安全なのか
- 現在でもレインボーテーブル攻撃は使われるのか
といった点が分かりにくいのではないでしょうか。
レインボーテーブル攻撃を一言で表すと、
「あらかじめ計算しておいたハッシュ値の対応情報を使い、漏えいしたパスワードハッシュから元のパスワードを推測する攻撃」
です。

この攻撃を理解するには、まずハッシュ化とソルトの考え方を押さえることが重要です。
この記事では、レインボーテーブル攻撃の仕組み、ハッシュとの関係、総当たり攻撃・辞書攻撃との違い、ソルトによる対策、試験で押さえておきたいポイントまで、会話を中心に初心者向けにわかりやすく解説します。
レインボーテーブル攻撃とは?

レインボーテーブル攻撃とは、漏えいしたパスワードのハッシュ値を、あらかじめ作っておいた対応情報と照合して、元のパスワードを探す攻撃だよ。

パスワードを直接盗むわけではないの?

そう。狙うのは、システムに保存されているパスワードのハッシュ値なんだ。
多くのシステムでは、利用者のパスワードをそのまま保存しません。
例えば、パスワードが
kumablog123
だったとしても、その文字列をそのままデータベースへ保存するのではなく、ハッシュ関数へ入力して別の値へ変換します。
kumablog123
↓
ハッシュ関数
↓
a8f3...のようなハッシュ値
ログイン時には、入力されたパスワードを同じ方法でハッシュ化し、保存済みのハッシュ値と一致するか確認します。
そのため、データベースが漏えいしても、パスワードそのものが直接見えるとは限りません。

しかし、攻撃者がハッシュ値から元のパスワードを推測しようとすることがあります。
その方法の一つが、レインボーテーブル攻撃です。
そもそもハッシュとは?
元のデータを一定の値へ変換する仕組み

ハッシュって暗号化と同じなの?

似て見えるけれど、基本的には違うよ。
ハッシュとは、入力データを一定の長さの値へ変換する仕組みです。
例えば、
password
という文字列をハッシュ関数へ入力すると、
5f4dcc3b5aa765d61d8327deb882cf99
のような値になります。
ハッシュ関数には、次のような特徴があります。
- 同じ入力からは同じハッシュ値が得られる
- 入力が少し変わるとハッシュ値が大きく変わる
- ハッシュ値から元の入力を直接逆算するのは困難
- 入力データの長さが違っても一定長の値になる

ハッシュと暗号化の違い
暗号化は、正しい鍵があれば元のデータへ戻せます。
一方、ハッシュ化は基本的に元へ戻すことを目的としていません。
| 項目 | ハッシュ化 | 暗号化 |
|---|---|---|
| 主な目的 | データ照合、改ざん検知など | 内容を読めなくする |
| 元に戻す | 基本的に戻さない | 鍵があれば復号できる |
| 鍵 | 原則不要 | 必要 |
| パスワード保存 | 利用される | 通常はハッシュ化を利用 |
| 代表例 | SHA-256など | AESなど |

じゃあ、ハッシュ値から元のパスワードは戻せないんだよね?

ハッシュ関数を逆向きに計算するわけではないよ。ただし、候補となる文字列をハッシュ化して同じ値になるか調べれば、元のパスワードを推測できる場合があるんだ。

レインボーテーブルを鍵の一覧表で例えてみよう

もう少し身近な例で説明できる?

大量の鍵とロッカー番号の対応表で考えてみよう。
ある施設に、たくさんのロッカーがあるとします。
利用者は、自分だけの鍵を使ってロッカーを開けます。
攻撃者は事前に、
- 鍵A → ロッカー102
- 鍵B → ロッカー405
- 鍵C → ロッカー712
のような対応関係を大量に調べて一覧表を作っていました。
その後、施設から
「狙いたいロッカーは405番」
という情報だけが漏えいしたとします。
攻撃者は一からすべての鍵を試すのではなく、事前に作った表を確認します。
ロッカー405
↓
一覧表を検索
↓
鍵B
レインボーテーブル攻撃もこれに近い考え方です。

| 鍵の例 | レインボーテーブル攻撃 |
|---|---|
| パスワード候補 | 鍵 |
| ハッシュ値 | ロッカー番号 |
| 対応表 | レインボーテーブル |
| 漏えいしたハッシュ | 狙うロッカー番号 |
| 元の鍵を特定 | 元のパスワードを推測 |

毎回ゼロから計算するのではなく、事前に準備した情報を利用するんだね。

そう。計算時間と保存容量のバランスを取って効率化するのがレインボーテーブルの考え方なんだ。
レインボーテーブルとは?
レインボーテーブルとは、パスワード候補とハッシュ値の関係を効率よく検索するために、事前計算した情報を保存した表です。
ただし、単純に
password → ハッシュ値
123456 → ハッシュ値
qwerty → ハッシュ値
というすべての組み合わせをそのまま保存すると、非常に大きな容量が必要になります。
そこでレインボーテーブルでは、ハッシュ関数とリダクション関数を繰り返してチェーンを作り、その一部だけを保存することで、必要な保存容量を減らします。

リダクション関数とは?
ハッシュ値を新しいパスワード候補へ変換する
レインボーテーブルでは、ハッシュ関数だけでなくリダクション関数と呼ばれる仕組みを利用します。
リダクション関数は、ハッシュ値をパスワード候補の形式へ変換します。
パスワード候補
↓
ハッシュ化
↓
ハッシュ値
↓
リダクション
↓
新しいパスワード候補
これを何度も繰り返します。
例えば、イメージとしては次のようになります。
abc123
↓ ハッシュ
H1
↓ リダクション
dog789
↓ ハッシュ
H2
↓ リダクション
bear55
↓ ハッシュ
H3
このような一連のつながりをチェーンと呼びます。
レインボーテーブルでは、すべての途中結果を保存するのではなく、主にチェーンの開始点と終了点を保存します。

なぜ「レインボー」と呼ぶの?

ところで、どうしてレインボーなの?

チェーンの各段階で異なるリダクション関数を使うところが名前の由来なんだ。
従来のハッシュチェーンでは同じリダクション関数を使うと、異なるチェーンが途中で合流しやすいという問題がありました。
レインボーテーブルでは、チェーンの位置ごとに異なるリダクション関数を使います。
H1 → R1
H2 → R2
H3 → R3
H4 → R4
異なる処理を段階ごとに使う様子を色の違いになぞらえ、レインボーテーブルと呼ばれます。

レインボーテーブル攻撃の仕組み
攻撃の流れを単純化すると、次のようになります。
- 攻撃者が大量のパスワード候補を用意する
- ハッシュ値を事前計算する
- レインボーテーブルを作成する
- パスワードデータベースなどからハッシュ値を入手する
- 漏えいしたハッシュ値をレインボーテーブルで検索する
- 対応するパスワード候補を特定する
事前準備
大量のパスワード候補
↓
ハッシュを事前計算
↓
レインボーテーブル作成
攻撃時
漏えいしたハッシュ値
↓
レインボーテーブル検索
↓
元のパスワード候補を発見

なぜ事前計算するの?

攻撃するときに計算すればいいのでは?

もちろんそれもできるけれど、同じハッシュ方式を使う対象が多ければ、計算結果を再利用できるんだ。
例えば、同じハッシュ関数を使ってパスワードを保存している複数のデータベースがあったとします。
攻撃するたびに、
000000
000001
000002
...
と計算するのは時間がかかります。
あらかじめ計算しておけば、漏えいしたハッシュを検索するだけで候補を見つけられる可能性があります。
つまりレインボーテーブルは、
計算時間を事前計算へ移し、攻撃時の探索を高速化する
という考え方です。

タイムメモリトレードオフとは?
レインボーテーブルを理解するうえで重要なのが、タイムメモリトレードオフという考え方です。
パスワード解析では、
- 計算時間を増やせば保存容量を減らせる
- 保存容量を増やせば計算時間を減らせる
という関係があります。
例えば、すべてのパスワード候補とハッシュ値を完全に保存すれば、検索は非常に速くなります。
しかし、膨大な保存容量が必要です。
反対に、何も保存しなければ容量は不要ですが、攻撃のたびに最初から計算する必要があります。
レインボーテーブルは、その中間に位置する方法です。
| 方法 | 計算時間 | 保存容量 |
|---|---|---|
| 毎回総当たり | 大きい | 小さい |
| 全対応表を保存 | 小さい | 非常に大きい |
| レインボーテーブル | 中程度 | 中程度 |

他の攻撃方法との違い
レインボーテーブル攻撃と総当たり攻撃の違い
総当たり攻撃は、考えられる文字列を一つずつ試す攻撃です。
ブルートフォース攻撃とも呼ばれます。
例えば、
aaaa
aaab
aaac
...
zzzz
と順番に試します。
| 項目 | レインボーテーブル攻撃 | 総当たり攻撃 |
|---|---|---|
| 主な対象 | ハッシュ値 | 認証画面やハッシュ値 |
| 方法 | 事前計算した表を利用 | 候補を順番に試す |
| 事前準備 | 必要 | 少ない |
| 保存容量 | 必要 | 比較的小さい |
| 計算 | 事前に多く行う | 攻撃時に行う |
| ソルトへの耐性 | 弱い | ソルトがあっても試行可能 |


総当たりはその場で全部試して、レインボーテーブルは前もって準備しておくんだね。

大まかにはその理解でいいよ。
レインボーテーブル攻撃と辞書攻撃の違い
辞書攻撃は、よく使われるパスワードや単語をまとめたリストを利用します。
例えば、
- password
- 123456
- qwerty
- admin
- baseball
- iloveyou
などです。
| 項目 | レインボーテーブル | 辞書攻撃 |
|---|---|---|
| 主な情報 | 事前計算したハッシュチェーン | パスワード候補一覧 |
| 対象 | 主にハッシュ値 | ログイン画面、ハッシュ値 |
| 計算 | 事前計算を利用 | 候補ごとにハッシュ化する場合がある |
| 特徴 | 時間と容量の効率化 | よく使われる文字列を重点的に試す |
辞書攻撃では「人が使いそうなパスワード」を優先するため、単純な総当たりより効率がよい場合があります。

レインボーテーブル攻撃とパスワードリスト攻撃の違い
パスワードリスト攻撃は、別のサービスから漏えいしたIDとパスワードの組み合わせを使い、ほかのサービスへログインを試みる攻撃です。
| 攻撃 | 主な特徴 |
|---|---|
| レインボーテーブル攻撃 | ハッシュ値から元パスワードを推測する |
| 総当たり攻撃 | あらゆる文字列を試す |
| 辞書攻撃 | よく使われる文字列を試す |
| パスワードリスト攻撃 | 漏えい済みID・パスワードを別サービスで試す |
レインボーテーブル攻撃では、まずパスワードハッシュが漏えいしている必要があります。
パスワードリスト攻撃では、すでに平文のパスワードが知られているケースを利用します。

レインボーテーブル攻撃と逆総当たり攻撃の違い
逆総当たり攻撃では、一つのパスワードを多数のIDへ試します。
例えば、
パスワード:123456
user001 → 試す
user002 → 試す
user003 → 試す
...
通常の総当たり攻撃が、
一つのIDへ多くのパスワード
を試すのに対し、
逆総当たり攻撃は、
一つのパスワードを多くのIDへ試す
方法です。
レインボーテーブル攻撃とは対象も仕組みも異なります。

レインボーテーブル攻撃に弱いパスワード保存
ハッシュ化だけでは十分ではない

パスワードをハッシュ化して保存すれば安全なんじゃないの?

ハッシュ化だけでは十分ではない場合があるよ。
例えば、二人の利用者が同じパスワードを設定していたとします。
Aさん:password123
Bさん:password123
同じハッシュ関数を使えば、同じハッシュ値になります。
password123
↓
ABCDEF...
password123
↓
ABCDEF...
攻撃者は、一つのハッシュ値を解析できれば、同じ値を持つ複数利用者のパスワードを推測できます。

また、同じハッシュ関数に対して作ったレインボーテーブルを、複数のユーザーやサービスで再利用できる可能性があります。
そこで利用されるのがソルトです。
ソルトとは?
ソルトとは、パスワードをハッシュ化する前に追加する利用者ごとに異なるランダムな値です。
例えば、AさんとBさんが同じパスワードを使っていても、異なるソルトを追加します。
Aさん
password123 + X7f29
↓
ハッシュ
↓
111AAA...
Bさん
password123 + Q82km
↓
ハッシュ
↓
999BBB...
同じパスワードでも、ソルトが異なれば異なるハッシュ値になります。

なぜソルトがレインボーテーブル対策になる?

ソルトを付けるだけで、なぜレインボーテーブルが使えなくなるの?

ユーザーごとに計算条件が変わるから、同じ対応表を使い回せなくなるんだ。
ソルトがない場合、
password123
↓
ハッシュ
↓
ABC123
という関係は、どのシステムでも同じハッシュ関数なら基本的に同じです。
そのため、一度作ったレインボーテーブルを再利用できます。
一方、ソルトがある場合、
password123 + SaltA
↓
HashA
password123 + SaltB
↓
HashB
となります。
攻撃者がレインボーテーブルを使うには、ソルトごとに別の計算が必要になります。
利用者ごとに十分に長いランダムなソルトを使えば、事前計算した汎用的なレインボーテーブルの価値を大きく下げられます。
| ソルトなし | ソルトあり |
|---|---|
| 同じパスワード→同じハッシュ | 同じパスワードでも異なるハッシュ |
| テーブルを再利用しやすい | ユーザーごとに再計算が必要 |
| 同じパスワード利用者が分かる | 同じパスワードでも判別しにくい |
| レインボーテーブルに弱い | レインボーテーブルへ強くなる |

ソルトは秘密にする必要がある?

ソルトが攻撃者に知られたら意味がない?

ソルトは秘密情報である必要はないよ。
ソルトの役割は、攻撃者に値を隠すことではありません。
同じパスワードでも異なるハッシュ値にし、事前計算した結果を使い回せなくすること
が目的です。
そのため、ソルトは通常、ハッシュ値と一緒に保存されます。
ユーザーID
ハッシュ値
ソルト
攻撃者がソルトを知っていても、利用者ごとに候補を再計算する必要があります。

ソルトがあれば絶対に安全?
ソルトはレインボーテーブル攻撃への重要な対策ですが、それだけで十分とは限りません。
例えば、攻撃者がハッシュ値とソルトの両方を入手した場合、
パスワード候補 + ソルト
↓
ハッシュ
↓
一致するか確認
という計算を繰り返せます。
つまり、辞書攻撃や総当たり攻撃そのものを防げるわけではありません。
そのため、パスワード保存では次の対策を組み合わせます。
- 利用者ごとにランダムなソルトを使う
- パスワード専用のハッシュ方式を使う
- 計算コストを高くする
- 十分に長いパスワードを使う
- 必要に応じてペッパーを利用する

パスワード専用ハッシュとは?
一般的なSHA-256などのハッシュ関数は高速です。
高速であることはファイルの整合性確認などではメリットですが、パスワード保存では攻撃者も大量の候補を高速に試せてしまいます。
そこで、パスワード保存には計算を意図的に重くした方式を利用します。
代表的なものには、
- PBKDF2
- bcrypt
- scrypt
- Argon2
などがあります。
これらは、パスワード候補を一つ試すための計算コストを高くすることで、辞書攻撃や総当たり攻撃を難しくします。

ストレッチングとは?
ストレッチングとは、ハッシュ計算を何度も繰り返すなどして、計算時間を増やす対策です。
例えば、
パスワード
↓
ハッシュ
↓
ハッシュ
↓
ハッシュ
↓
...
と多数回繰り返します。
正しいパスワードでログインする利用者にとっては、多少計算が増えるだけです。
一方、数十億個のパスワード候補を試したい攻撃者にとっては、候補一つひとつの計算が重くなるため、大きな負担になります。

ソルトとストレッチングの違い
| 項目 | ソルト | ストレッチング |
|---|---|---|
| 主な目的 | 事前計算結果の使い回しを防ぐ | パスワード解析を遅くする |
| 方法 | ランダム値を追加する | ハッシュ計算を繰り返す |
| レインボーテーブル対策 | 特に有効 | 有効 |
| 総当たり対策 | 直接防ぐわけではない | 計算コストを高くする |
| ユーザーごと | 異なる値を利用 | 同じ設定を使うこともある |

ソルトで事前計算を使いにくくして、ストレッチングで一回一回の計算を遅くするんだね。

その理解でバッチリだよ。
ペッパーとは?
ペッパーは、パスワードとソルトに加えて利用する秘密の値です。
パスワード + ソルト + ペッパー
↓
ハッシュ
ソルトとの大きな違いは、ペッパーは秘密に管理することです。
| 項目 | ソルト | ペッパー |
|---|---|---|
| ユーザーごと | 通常異なる | 共通の場合もある |
| 秘密性 | 必須ではない | 秘密にする |
| 保存場所 | ハッシュと一緒でもよい | 別の安全な場所 |
| 主な目的 | 事前計算防止 | DB漏えい時の解析をさらに困難にする |
ただし、ペッパーの導入には安全な鍵管理が必要になります。

MD5やSHA-1はレインボーテーブル攻撃に弱い?
MD5やSHA-1のような高速なハッシュ関数で、ソルトなしにパスワードを保存すると、レインボーテーブル攻撃や大量試行に弱くなります。
特に単純なパスワードであれば、既存の事前計算データから短時間で特定される可能性があります。
ただし、
「MD5だから必ずレインボーテーブルで破られる」
という意味ではありません。
問題は、
- 高速なハッシュ関数
- ソルトなし
- 短く単純なパスワード
などが組み合わさることで攻撃しやすくなる点です。
現在のパスワード保存では、MD5やSHA-1をそのまま利用するのではなく、パスワード保存専用の方式を利用することが重要です。

長いパスワードはレインボーテーブルに強い?
パスワードが長く複雑になるほど、必要な候補数が増えます。
例えば、使用できる文字が62種類ある場合、
6文字:62^6通り
8文字:62^8通り
12文字:62^12通り
となり、文字数が増えるほど候補空間は急激に大きくなります。
候補数が増えれば、レインボーテーブルの作成に必要な計算量や保存容量も増えます。
そのため、十分に長く推測されにくいパスワードは重要です。
ただし、パスワードの強さだけに頼らず、システム側でも安全なハッシュ保存方式を利用する必要があります。
レインボーテーブル攻撃は現在も脅威?

ソルトが広く使われているなら、レインボーテーブル攻撃はもう昔の攻撃なの?

以前より使いにくくなっているけれど、考え方そのものは今でも重要だよ。
適切なソルトを利用すれば、汎用的なレインボーテーブルの効果は大きく低下します。
また、現在ではGPUなどによる高速な辞書攻撃・総当たり攻撃が非常に強力になっています。
そのため、実際のパスワード解析では、
- 辞書攻撃
- ルールベース攻撃
- GPUによる総当たり
- 漏えいパスワード一覧
などが使われることも多くあります。
それでもレインボーテーブルは、
「なぜパスワードへソルトを付ける必要があるのか」
を理解するうえで非常に重要な攻撃手法です。
情報処理技術者試験でも、この関係は押さえておきたいポイントです。
レインボーテーブル攻撃への対策
ソルトを利用する
最も代表的な対策です。
利用者ごとに十分にランダムなソルトを生成し、パスワードへ追加してハッシュ化します。

パスワード専用のハッシュ方式を使う
高速な一般用途のハッシュ関数をそのまま使うのではなく、次のような方式を利用します。
- Argon2
- bcrypt
- scrypt
- PBKDF2

計算コストを高くする
ハッシュ計算を意図的に重くし、大量のパスワード候補を試す攻撃の速度を落とします。

十分に長いパスワードを利用する
短いパスワードほど候補数が少なく、解析しやすくなります。
長く、推測されにくいパスワードやパスフレーズを利用します。

よく使われるパスワードを禁止する
例えば、
- password
- 123456
- qwerty
- company123
- 生年月日
などは辞書攻撃でも簡単に試されます。
漏えい済みパスワードの利用を拒否する仕組みも有効です。
多要素認証を利用する
仮にパスワードを解析されても、追加の認証要素が必要であれば不正ログインを防げる可能性があります。
ただし、多要素認証はパスワードハッシュ自体を守る対策ではなく、アカウントの不正利用を防ぐ追加対策です。
対策の比較
| 対策 | 主な効果 |
|---|---|
| ソルト | レインボーテーブルの再利用を防ぐ |
| ストレッチング | 大量試行を遅くする |
| Argon2・bcryptなど | パスワード解析の計算負荷を高める |
| 長いパスワード | 候補数を増やす |
| 漏えいパスワード禁止 | 辞書攻撃への耐性を高める |
| 多要素認証 | パスワード漏えい後の不正ログインを防ぐ |
レインボーテーブル攻撃のメリット・デメリット
攻撃者側から見た特徴として整理します。
攻撃者側のメリット
事前計算結果を再利用できる
同じハッシュ関数、同じ条件であれば、一度作成したレインボーテーブルを複数の対象へ利用できる可能性があります。
攻撃時の計算を減らせる
すべての候補を攻撃時にゼロから計算する必要がありません。
保存容量を全対応表より減らせる
チェーンの一部だけを保存することで、単純な全対応表より容量を抑えられます。
攻撃者側のデメリット
事前計算に時間がかかる
大規模なテーブルを作成するには、大量の計算が必要です。
保存容量が必要
候補空間が大きくなるほど、テーブルも巨大になります。
ソルトに弱い
利用者ごとにランダムなソルトが使われると、汎用テーブルを再利用しにくくなります。
長いパスワードには不向き
候補空間が巨大になるため、十分に長いパスワードを網羅するのは現実的ではなくなります。
レインボーテーブル攻撃と似た攻撃の比較
| 攻撃手法 | 方法 | 主な対象 |
|---|---|---|
| レインボーテーブル攻撃 | 事前計算した表でハッシュを検索 | パスワードハッシュ |
| 総当たり攻撃 | 全候補を順番に試す | ログイン・ハッシュ |
| 辞書攻撃 | よく使う単語を試す | ログイン・ハッシュ |
| パスワードリスト攻撃 | 漏えい済み認証情報を再利用 | ログイン |
| 逆総当たり攻撃 | 一つのパスワードを多数IDへ試す | ログイン |
情報漏えいから不正ログインまでの流れ
レインボーテーブル攻撃は、単独でシステムへ侵入する攻撃ではありません。
例えば、次のような流れで利用されます。
WebサービスのDBが漏えい
↓
IDとパスワードハッシュを入手
↓
レインボーテーブルなどで解析
↓
元のパスワード候補を特定
↓
そのサービスへ不正ログイン
↓
同じパスワードを他サービスでも試す
パスワードを使い回していると、別サービスまで被害が拡大する可能性があります。
そのため利用者側でも、サービスごとに異なるパスワードを利用することが重要です。

ITパスポート・基本情報・応用情報の試験対策
レインボーテーブル攻撃は、パスワード認証やハッシュ、ソルトと関連付けて理解しておきたい攻撃です。
ITパスポートで押さえたいポイント
ITパスポートでは、細かなチェーン構造よりも、
「あらかじめ計算したハッシュ値を利用してパスワードを解析する攻撃」
という特徴を押さえておきましょう。
また、
ソルトがレインボーテーブル攻撃への対策になる
ことも重要です。
基本情報技術者試験で押さえたいポイント
基本情報では、次の違いを整理しておくとよいでしょう。
- ハッシュ化と暗号化
- 総当たり攻撃
- 辞書攻撃
- レインボーテーブル攻撃
- ソルト
- ストレッチング
特に、
「ソルトを使うと、同じパスワードでも異なるハッシュ値になる」
という点が重要です。
応用情報技術者試験で押さえたいポイント
応用情報では、単語の意味だけでなく、システム設計やセキュリティ対策の文脈で考えられるようにしておきましょう。
例えば、
- DBからパスワードハッシュが漏えいした
- 全利用者へ異なるランダム値を付加する
- ハッシュ計算を多数回繰り返す
- パスワード解析に必要な計算量を増やす
といった記述から、
ソルトやストレッチング
を判断できることが重要です。
試験対策ポイント
| 用語 | 覚えるポイント |
|---|---|
| レインボーテーブル | 事前計算したハッシュ情報を利用する |
| ハッシュ | 元へ戻すことを前提としない変換 |
| 総当たり攻撃 | 全候補を順番に試す |
| 辞書攻撃 | よく使われる候補を試す |
| ソルト | パスワードへランダム値を追加する |
| ストレッチング | ハッシュ計算を繰り返して解析を遅くする |
| bcrypt・Argon2など | パスワード保存向けの方式 |
| 多要素認証 | パスワード漏えい後の不正利用を防ぎやすくする |
試験問題で注目する表現
| 問題文の表現 | 考えられる答え |
|---|---|
| 事前計算したハッシュ値を利用 | レインボーテーブル攻撃 |
| 全組合せを順番に試す | 総当たり攻撃 |
| 単語リストを使う | 辞書攻撃 |
| パスワードへランダム値を付加 | ソルト |
| 同じパスワードでも異なるハッシュ値にする | ソルト |
| ハッシュ処理を多数回行う | ストレッチング |
| 漏えい済みID・パスワードを別サイトで利用 | パスワードリスト攻撃 |
よくある誤解
レインボーテーブル攻撃はログイン画面へ大量のパスワードを入力する攻撃

パスワードを何千回も入力する攻撃がレインボーテーブル攻撃?

それは総当たり攻撃に近いね。レインボーテーブル攻撃では、漏えいしたハッシュ値を解析するんだ。
ハッシュ値を逆算している
レインボーテーブル攻撃は、ハッシュ関数を数学的に逆向きへ計算しているわけではありません。
候補となるパスワードを事前計算し、一致するものを探します。
ハッシュ化すればパスワードは絶対安全
ハッシュ値が漏えいすると、辞書攻撃や総当たり攻撃で元のパスワードを推測される可能性があります。
安全な保存方式が必要です。
ソルトは秘密にしなければならない
ソルトは、通常秘密にする必要はありません。
目的は値を隠すことではなく、事前計算結果を使い回せないようにすることです。
ソルトがあればパスワードは解析できない
ソルトがあっても、攻撃者は候補ごとに計算できます。
レインボーテーブルの利点を失わせることはできますが、総当たりや辞書攻撃そのものを不可能にするわけではありません。
SHA-256ならソルトは不要
SHA-256は高速な一般用途のハッシュ関数です。
パスワード保存では、ソルトに加え、bcryptやArgon2などのパスワード保存向け方式を利用することが重要です。
長いパスワードならシステム側の対策は不要
長いパスワードは重要ですが、サービス側にも安全なハッシュ保存方式が必要です。
利用者側とシステム側の両方で対策します。
レインボーテーブル攻撃はパスワードを盗むフィッシング攻撃である
フィッシングは、偽サイトなどを使って利用者本人にパスワードを入力させます。
レインボーテーブル攻撃は、すでに漏えいしたハッシュ値から元のパスワードを推測する攻撃です。
同じパスワードなら必ず同じハッシュ値になる
ソルトなしで同じハッシュ関数を利用すれば同じ値になります。
しかし、利用者ごとに異なるソルトを利用すれば、同じパスワードでも異なるハッシュ値になります。
まとめ
レインボーテーブル攻撃とは、あらかじめ計算しておいたハッシュ値の対応情報を使い、漏えいしたパスワードハッシュから元のパスワードを推測する攻撃です。
多くのシステムでは、パスワードをそのまま保存せず、ハッシュ化して保存します。
しかし、ソルトを使わずに高速なハッシュ関数だけで保存していると、攻撃者が事前に作成したレインボーテーブルを利用して、元のパスワードを効率よく探せる可能性があります。
レインボーテーブルでは、パスワード候補、ハッシュ関数、リダクション関数を組み合わせたチェーンを作り、その一部だけを保存することで、計算時間と保存容量のバランスを取ります。
代表的な対策がソルトです。
利用者ごとに異なるランダムな値をパスワードへ加えてからハッシュ化すれば、同じパスワードでも異なるハッシュ値になります。
これにより、攻撃者は一つのレインボーテーブルを多数の利用者へ使い回しにくくなります。
ただし、ソルトだけで辞書攻撃や総当たり攻撃を防げるわけではありません。
実際のパスワード保存では、
- ソルト
- ストレッチング
- Argon2やbcryptなどのパスワード保存向け方式
- 十分に長いパスワード
- 多要素認証
などを組み合わせることが重要です。
| 項目 | 内容 |
|---|---|
| 用語 | レインボーテーブル攻撃 |
| 一言でいうと | 事前計算した情報からパスワードハッシュを解析する攻撃 |
| 主な対象 | 漏えいしたパスワードハッシュ |
| 必要なもの | 事前計算したレインボーテーブル |
| ハッシュ | 入力を一定長の値へ変換する |
| リダクション関数 | ハッシュ値から新しい候補を作る |
| チェーン | ハッシュとリダクションを繰り返したつながり |
| 特徴 | 計算時間と保存容量を効率化する |
| 総当たりとの違い | 総当たりは候補をその場で順番に試す |
| 辞書攻撃との違い | 辞書攻撃はよく使われる文字列を試す |
| 主な対策 | ソルト |
| ソルトの効果 | 同じパスワードでも異なるハッシュ値にする |
| ソルトの秘密性 | 原則として秘密にする必要はない |
| ストレッチング | ハッシュ計算を重くして解析を遅らせる |
| 推奨される方式 | Argon2、bcrypt、scrypt、PBKDF2など |
| 利用者側の対策 | 長いパスワード、使い回し防止、多要素認証 |
| 試験対策 | 「事前計算」と「ソルト」をセットで覚える |
| 覚え方 | レインボーテーブル=事前計算、ソルト=使い回し防止 |

レインボーテーブル攻撃は、ログイン画面でパスワードを何度も試す攻撃ではないんだね。

そう。漏えいしたハッシュ値を、事前に計算しておいた情報と照合する攻撃なんだ。

ハッシュを逆算しているわけでもないんだね。

そう。候補となるパスワードをハッシュ化した結果を利用して、一致するものを探しているんだ。

そしてソルトを使えば、同じパスワードでも違うハッシュ値になるから、同じレインボーテーブルを使い回しにくくなる。

バッチリ。試験では「レインボーテーブル=事前計算」「対策=ソルト」をまずセットで覚えておくといいよ。

ソルトだけでは総当たり攻撃までは防げないから、ストレッチングやArgon2みたいな仕組みも使うんだね。

そこまで理解できれば十分だよ。「ハッシュ化しているから安全」ではなく、「解析に耐えられる方法でハッシュを保存する」ことが大切なんだ。

