戦国IT - 情報処理技術者試験の過去問対策サイト
ブログお知らせお問い合わせ料金プラン

応用情報技術者 2022年 春期 午前242


問題文

パスワードクラック手法の一種である、レインボー攻撃に該当するものはどれか。

選択肢

何らかの方法で事前に利用者 IDと平文のパスワードのリストを入手しておき、複数のシステム間で使い回されている利用者 IDとパスワードの組みを狙って、ログインを試行する。
パスワードに成り得る文字列の全てを用いて、総当たりでログインを試行する。
平文のパスワードとハッシュ値をチェーンによって管理するテーブルを準備しておき、それを用いて、不正に入手したハッシュ値からパスワードを解読する。(正解)
利用者の誕生日や電話番号などの個人情報を言葉巧みに聞き出して、パスワードを類推する。

🔒 解説は解答すると表示されます

レインボーテーブル【午前2解説】

正解の理由

選択肢は、ハッシュ値から元の平文パスワードを逆算するために「平文とハッシュをチェーンで管理するテーブル」を用いる攻撃手法を説明しており、これはレインボー攻撃(レインボーテーブル)そのものです。レインボーテーブルは単純に全ての(平文→ハッシュ)の対応を保存する辞書型テーブルとは異なり、ハッシュ関数と「還元関数(ハッシュ値を再び候補平文に変換する関数)」を交互に適用してチェーンを作り、そのチェーンの端点(開始平文と終了ハッシュ)だけを保存することで、保存領域を大幅に削減しつつハッシュの逆引きを高速化します。したがって、「ハッシュと平文をチェーンで管理するテーブル」という記述があるが正答です。

解法ステップ

  1. 選択肢のキーワードを確認:ハッシュ、チェーン、テーブル、平文、といった語句があるかをチェックする。
  2. 「チェーン」と「ハッシュ逆引き」があればレインボーテーブルを連想する(レインボー攻撃の特徴)。
  3. 他の選択肢(資格情報使い回し、総当たり、ソーシャルエンジニアリング)と比較して、チェーン+ハッシュが含まれる選択肢を正答とする。
  4. レインボーテーブルの動作イメージを頭に描き、保存方式が「全対応保存」ではなく「端点のみ保存+再生成」であることを確認する。
(レインボーテーブルの簡易的な作成・照合フロー)
  • 生成時:任意の平文 p0 → ハッシュ H(p0) → 還元 R(H(p0)) = p1 → H(p1) … を L 回繰り返し、チェーンの開始 p0 と終了 hL を保存する。
  • 逆引き時:不正入手したハッシュ h* に対して還元とハッシュを繰り返し(最大 L 回)、得られる値が保存された任意のチェーンの終了点と一致するかを調べ、一致したチェーンを先頭から再生成して元の平文を見つける。

選択肢別の誤答解説

  • ア: これは「クレデンシャルスタッフィング(資格情報の使い回しを突く攻撃)」の説明です。事前に平文のID/パスワードリストを入手してログイン試行する点が特徴で、ハッシュやチェーンの概念は含みません。
  • イ: これは「総当たり攻撃(ブルートフォース攻撃)」です。パスワード候補を片っ端から試す手法で、ハッシュ逆引きのために事前計算したチェーンを用いるレインボーテーブルとは異なります。
  • : レインボーテーブル(正解)。チェーンと還元関数を利用してハッシュから平文を逆引きする方法を説明しています。
  • エ: これは「ソーシャルエンジニアリング/推測による攻撃」で、利用者の個人情報等からパスワードを類推する手法です。物理的・心理的な手口に属し、ハッシュ処理とは直接関係しません。

よくある誤解

  1. レインボーテーブルは「全てのハッシュ→平文の対応を保存する巨大な辞書である」という誤解。実際は還元関数とチェーンを使い、チェーンの端点のみを保存してスペースを節約する方式です。
  2. ソルトされたハッシュに対して同じテーブルがそのまま使えると考える誤解。ソルトが使われていると、同じパスワードでもハッシュが異なるため汎用的なレインボーテーブルは無効化されます(ソルト無効化にはテーブル毎にソルトを考慮する必要があり実用的でないことが多い)。

補足コラム

レインボーテーブルの核は「還元関数(Reduction function)」と「チェーン保存」にあります。還元関数はハッシュ値をある平文候補の形式に変換する擬似的な関数であり、複数種類を用いることでチェーン同士の衝突(マージ)を軽減します。典型的な保存方法は各チェーンの先頭平文 p0 とチェーンの末尾ハッシュ hL のペアのみを保持し、保存量は全対応表より格段に少なくなります。照合時は、与えられたハッシュについて還元→ハッシュの操作を繰り返し、生成される任意の中間ハッシュが末端ハッシュの一覧に一致するかを探索します。末端が一致したチェーンについては開始点から再生成して正確な平文を特定します。
チェーン長 L、チェーン数 m を適切に選ぶことで時間と空間のトレードオフを調整しますが、還元関数の選び方や衝突対策が重要です。また、現代の実務的対策としてはソルト(個別ランダム値の追加)、計算コストの高いハッシュアルゴリズム(bcrypt、scrypt、Argon2 など)、多要素認証の導入が推奨されます。
簡単な疑似実装例(教育目的。実運用での還元関数・ハッシュはより複雑にすべきです):
import hashlib

def H(p):  # ハッシュ関数(例)
    return hashlib.md5(p.encode()).hexdigest()

def R(h, charset="abc", length=3):  # 単純な還元関数(例)
    # ハッシュの一部を整数化して擬似的な平文を生成
    n = int(h[:6], 16)
    s = []
    for _ in range(length):
        s.append(charset[n % len(charset)])
        n //= len(charset)
    return ''.join(s)

# チェーン生成(教育用)
p0 = "aaa"
h = H(p0)
for i in range(5):
    p = R(h)
    h = H(p)
# 保存するのは (p0, h) のペアのみ

FAQ

Q1: レインボーテーブルと辞書攻撃の違いは?
A1: 辞書攻撃は候補となる平文リストを直接ハッシュ化して試す手法。レインボーテーブルは事前計算でチェーンを生成・圧縮保存し、ハッシュ逆引きを高速化するためのデータ構造的手法です。辞書は保存も大きくなる一方、レインボーは保存量を節約して速度を確保することを目的とします。
Q2: ソルトがあればレインボーテーブルは無力ですか?
A2: 基本的には無力化されます。ソルトによって同じパスワードでもハッシュが異なるため、汎用テーブルは適用できません。テーブルをソルト毎に作ることは現実的でないため、ソルトは非常に有効な対策です。
Q3: 現代ではレインボーテーブルはまだ使われますか?
A3: ソルトや計算コストの高いハッシュアルゴリズムの普及により、汎用的なレインボーテーブルの有効性は低下しています。ただし、ソルトなし・弱いハッシュを用いている古いシステムや限定的なパスワード空間に対しては今でも脅威となります。

関連キーワード: レインボーテーブル、レインボー攻撃、ハッシュ逆引き、還元関数、チェーン方式、ソルト、辞書攻撃、総当たり攻撃、クレデンシャルスタッフィング
← 前の問題へこの年度をクイズで解く次の問題へ →
戦国ITクイズ機能

\ せっかくなら /

応用情報技術者
クイズ形式で学習しませんか?

クイズ画面へ遷移する

すぐに利用可能!

©︎2026 情報処理技術者試験対策アプリ

このサイトについてブログプライバシーポリシー利用規約特商法表記開発者について