資格道場 › レッスン一覧 › セキュリティ
セキュリティ・9/23・12分

パスワードの管理と総当たり系の攻撃

ゴール

パスワードを安全に保存・再設定する正しい方法を選べるようになる。総当たり系の攻撃(ブルートフォース・リバースブルートフォース・パスワードリスト攻撃・辞書攻撃)を見分け、パスワードの総数や鍵の試行回数を計算できるようになる。

「攻撃名と手口の対応」と「M^n・2^鍵長」の計算は、選択肢の文面が毎回ほぼ同じで出題されます。覚えれば確実に取れる問題です。実務でも、ログイン機能の要件定義で「パスワードをどう保存するか」「試行回数を制限するか」を決めるときにそのまま使える知識です。

このレッスンで稽古する(用語チェック・過去問)

結論:パスワードは「ハッシュ値」で保存し、入力値もハッシュ化して比べる

正解のパターンは1つだけです。登録時にパスワードをハッシュ値に変換して保存し、ログイン時は入力されたパスワードを同じハッシュ関数で変換して、保存済みのハッシュ値と比べます。

ハッシュ関数とは、どんな長さのデータからも決まった長さの値(ハッシュ値)を作る関数です。同じ入力からは必ず同じ値が出ますが、ハッシュ値から元のデータを計算で戻すことは事実上できません(一方向性)。

たとえるなら「指紋の照合」です。サーバは本人そのもの(パスワード)を預からず、指紋(ハッシュ値)だけを持っておきます。ログインのたびに指紋を取り直して照合します。パスワードファイルが盗まれても、出てくるのは指紋だけなので、元のパスワードをそのまま使われにくくなります。

flowchart LR
  A["登録時: パスワード"] --> B["ハッシュ関数"] --> C["ハッシュ値を保存"]
  D["ログイン時: 入力パスワード"] --> E["同じハッシュ関数"] --> F["ハッシュ値"]
  C --> G["一致すれば本人"]
  F --> G

補足として、同じパスワードが同じハッシュ値にならないように、利用者ごとに違うランダムな値(ソルト)を足してからハッシュ化する方法があります。こうすると、レインボーテーブル(パスワード候補とハッシュ値の対応表)を使った逆引きを防げます。

ソルトなし:同じハッシュ値になるA:PB:Pハッシュ値Xハッシュ値Xどちらも同じ値 → 対応表で逆引きされるソルトあり:利用者ごとに違う値A:P+ソルト1B:P+ソルト2ハッシュ値Yハッシュ値Z値がバラバラ → 対応表で逆引きできない
同じパスワードPでも、利用者ごとにソルトを足すとハッシュ値が別々になり、レインボーテーブルで逆引きされにくくなる。

ハッシュ化保存のひっかけパターン

誤りの選択肢は、次の3種類に分けられます。

選択肢の特徴 なぜダメか
利用者IDのハッシュ値を登録・比較する IDはパスワードではないので、パスワードが正しいかを確かめられない
パスワードを**そのまま(平文)**登録する/圧縮して登録する ファイルが漏れれば、そのまま、または復元して読まれる。圧縮は暗号化ではない
平文で登録しておき、比較のときだけハッシュ化する 保存しているのが平文なので、盗用は防げない

見分け方は2点です。「何をハッシュ化して登録しているか」がパスワードであること。「認証時に何をハッシュ化するか」が入力パスワードであること。この2点がそろっている選択肢が正解です。

パスワードの総数は M^n(重複順列)

使える文字が M 種類、パスワードが n 文字なら、作れるパスワードの総数は M^n 通りです。1文字目にM通り、2文字目にもM通り……と、同じ文字を何回使ってもよい(重複を許す)からです。

たとえるなら、自転車のダイヤル錠です。0〜9のダイヤルが4つあれば 10×10×10×10=10^4=10,000 通りになります。「1111」のように同じ数字を並べてもかまいません。

この総数が、総当たり(ブルートフォース)で試す最大の試行回数になります。

式 意味 パスワードに使うか
M^n 重複を許して並べる(重複順列) 使う(正解)
M!/(M−n)! 同じ文字を使わずに並べる(順列) 使わない
M!/(n!(M−n)!) 同じ文字を使わず、並び順も区別しない(組合せ) 使わない
(M+n−1)!/(n!(M−1)!) 重複を許すが、並び順は区別しない(重複組合せ) 使わない
4桁のダイヤル錠(0〜9)01201201201210通り×10通り×10通り×10通り10×10×10×10=10^4=10,000 通り「1111」も可(重複を許す)= M^n
0〜9のダイヤルが4つあると、各ダイヤル10通りの掛け算で10^4=10,000通りになる(同じ数字を並べてもよい)。

鍵長と総当たりの試行回数:nビットの鍵なら最大 2^n 回

暗号の鍵が n ビットなら、鍵の候補は 2^n 個あります(1ビットごとに0か1の2通りなので、M=2、文字数=n の M^n と同じ考え方です)。

  • AES-256:鍵長は256ビット(AESは共通鍵暗号の標準方式で、名前の数字が鍵長)→ 最大試行回数は 2^256
  • 平均すると、全体の半分を試したあたりで当たるので 2^256 ÷ 2 = 2^255 回です。これは「最大」ではありません。

問題文が「最大値」なのか「平均」なのかを必ず確認してください。鍵長が1ビット増えるごとに、試行回数は2倍になります。

1ビット増えるごとに候補は2倍1ビット2^1=2個2ビット2^2=4個3ビット2^3=8個…nビット → 2^n 個AES-256(鍵長256ビット)の全候補平均:半分(2^255回)最大:全部(2^256回)
鍵が1ビット増えるごとに候補は2倍になり、AES-256では最大2^256回、平均はその半分の2^255回。

攻撃の手口を比較表で区別する(最頻出)

総当たり系の攻撃は、何を固定して、何を変えるかで見分けます。

攻撃名 固定するもの 次々に変えるもの 狙い・特徴
ブルートフォース攻撃(総当たり攻撃) 利用者ID(暗号なら平文と暗号文の組) パスワード(暗号なら鍵)をすべての候補で 理論上いつかは必ず当たる
リバースブルートフォース攻撃 パスワード(よく使われるもの1つ) 利用者ID 1つのIDへの失敗回数が少ないので、アカウントロックを避けやすい
辞書攻撃 利用者ID 辞書の単語・人名などありがちな文字列 推測しやすいパスワードを狙う
パスワードリスト攻撃 —(IDとパスワードの組そのもの) 他サイトから流出したIDとパスワードの組 使い回しを狙う
レインボー攻撃(レインボーテーブル攻撃) 入手したハッシュ値 候補とハッシュ値の対応表で逆引き 盗んだハッシュ値から元のパスワードを割り出す

「パスワードリスト攻撃」の「リスト」は流出した実在のIDとパスワードの組です。辞書攻撃の「単語リスト」と混同しないでください。

何を固定して何を変えるか縦=利用者ID a〜c/横=パスワード 1〜3塗ったマス=実際に試す組123abc123abc123abca2b3c1ブルートフォースリバースブルートフォースパスワードリストIDを固定パスワード全部パスワード固定IDを次々流出した組だけ試す
縦を利用者ID(a〜c)、横をパスワード(1〜3)とした表で、各攻撃が実際に試す組を塗ったマスで示す。

暗号解読法の中からブルートフォースを選ぶ問題

「暗号解読の手法のうちブルートフォース攻撃はどれか」は、免除試験を含めて10回以上出ています。選択肢は毎回ほぼ同じ4つです。

選択肢の説明 手法名
平文と暗号文の組に対し、総当たり(全ての鍵候補)で鍵を割り出す ブルートフォース攻撃(正解)
暗号化関数の統計的な偏りを線形関数で近似する 線形解読法
異なる2つの平文と暗号文の差分を観測する 差分解読法
暗号化装置の電磁波・消費電力・処理時間などを解析する サイドチャネル攻撃
平文・暗号文・鍵の関係を代数式で表して解く 代数的攻撃

「総当たり」「全ての鍵候補を一つずつ」という語が入っていれば、ブルートフォース攻撃です。

攻撃と対策の対応

「攻撃と対策の組合せ」は、各攻撃がどこを突くかで決まります。

攻撃 どこを突くか 有効な対策
辞書攻撃 推測しやすいパスワード 推測されにくいパスワードを設定する
スニッフィング(ネットワーク上の通信を盗み見る攻撃) 平文で流れるパスワード パスワードを暗号化して送信する
ブルートフォース攻撃 何度でも試せること ログインの試行回数に制限を設ける(アカウントロック)
パスワードリスト攻撃 使い回し サイトごとに違うパスワードを使う、多要素認証

選択肢では対策を入れ替えてきます。「盗み見には暗号化」「数撃ちには回数制限」「推測には推測困難」と、攻撃の性質と対策を結びつけて覚えてください。

パスワード再設定と、侵入失敗の痕跡(各1〜2文で十分)

パスワードを忘れたときは、合言葉などで本人確認したあと、あらかじめ登録してあるメールアドレス宛てに推測困難なURL(パスワード再登録用ページへのリンク)を送ります。現在のパスワードを送る選択肢や、その場で新しく入力させたアドレスに送る選択肢は誤りです(なりすました第三者にも届いてしまいます)。

侵入に失敗した試みの痕跡は、ログインの不成功記録に残ります。パスワードの変更記録やシステム日時の変更は、侵入に成功した後の痕跡です。

例題 1

英大文字26字+数字10字で5文字のパスワード:最大試行回数

あるコンピュータへのログイン時に入力するパスワードは 5 文字であり,パスワードに使用可能な文字は英字の大文字 26 字と数字 0~9 とする。これらの文字を組み合わせて作成できるすべてのパスワード候補から一つずつ試して,最大何回の試行を行えばログインできるか。

ア 26^5+10^5
イ 26^5×10^5
ウ 36×35×34×33×32
エ 36^5

出典:基本情報技術者試験 科目A免除 修了試験 201012 実施分 問41

解き方と答えを見る
  1. 使える文字の種類 M を数える:英大文字 26 + 数字 10 = 36 種類
  2. 文字数 n を確認する:n = 5
  3. 同じ文字を何度使ってもよいので、重複順列 M^n を使う:36^5
  4. (参考)実際の値:36^5 = 36×36×36×36×36 = 60,466,176 通り
  5. 選択肢を確認する:ア 26^5+10^5 は英字だけのパスワードと数字だけのパスワードを足したもので、混ぜたものが入っていない。イ 26^5×10^5 は「英字5文字+数字5文字」で10文字分になっている。ウ 36×35×34×33×32 は同じ文字を使わない順列。どれも誤り

答え:エ:36^5

例題 2

AES-256 をブルートフォースで解読するときの最大試行回数

AES-256 で暗号化されていることが分かっている暗号文が与えられているとき,ブルートフォース攻撃で鍵と解読した平文を得るまでに必要な試行回数の最大値はどれか。

ア 256
イ 2^128
ウ 2^255
エ 2^256

出典:平成30年度 秋期 基本情報技術者試験 午前 問37

解き方と答えを見る
  1. AES-256 の「256」は鍵長が256ビットであることを表す
  2. 1ビットは0か1の2通りなので、鍵の候補は 2×2×…×2(256回)= 2^256 個
  3. ブルートフォースは全候補を試すので、最悪の場合(最後の候補が正解)の試行回数は 2^256
  4. 問われているのは「最大値」。平均の 2^256÷2 = 2^255(ウ)は誤り。256(ア)は鍵長そのもの、2^128(イ)は鍵長128ビットの場合の値

答え:エ:2^256

要点(試験直前に読む)

  • パスワードは「パスワードのハッシュ値」で登録し、ログイン時は「入力パスワード」をハッシュ化して比べる。IDのハッシュ・平文・圧縮は誤り。
  • パスワードの総数は M^n(重複順列)。英大文字26+数字10で5文字なら 36^5。
  • nビットの鍵の総当たりは最大 2^n 回(AES-256なら 2^256)。平均はその半分の 2^(n−1)。
  • 固定するものと変えるもの:ブルートフォース=ID固定でパスワードを全部、リバース=パスワード固定でIDを変える、パスワードリスト=流出した組で使い回しを狙う、辞書=ありがちな単語。
  • 対策の対応:辞書攻撃→推測されにくいパスワード、スニッフィング→暗号化して送信、ブルートフォース→試行回数の制限。
  • パスワード再設定は「登録済みメールアドレス」に「推測困難なURL」を送る。侵入失敗の痕跡は「ログインの不成功記録」に残る。

ひっかけ

  • 「利用者IDのハッシュ値を登録」「比較のときだけハッシュ化」→ どちらもパスワード自体を守れていないので誤り。登録も比較もパスワードのハッシュ値になっている選択肢を選ぶ。
  • AES-256で 2^255 や 256 を選ばせる → 「最大」なら 2^256。2^255 は平均、256 は鍵長そのもの。
  • パスワード総数で 36×35×34×33×32 や 26^5×10^5 を選ばせる → 同じ文字は何度でも使えるので 36^5。英字と数字は分けずに合計の種類数で考える。
  • リバースブルートフォースとブルートフォースを入れ替えて出す → 「パスワードを一つ選び、利用者IDを次々に」ならリバース。「流出した一覧」「使い回し」が出たらパスワードリスト攻撃。
  • パスワード再設定で「現パスワードを送信」「新たに入力させたアドレスへ送信」→ どちらも誤り。正解は登録済みのアドレスに再登録用の推測困難なURLを送る選択肢。

用語(15)

ハッシュ関数 はっしゅかんすう
任意の長さのデータから固定長の値を作る関数で、同じ入力からは必ず同じ値が出て、値から元のデータには戻せない。
⚠ 暗号化は鍵があれば復号して元に戻せる。ハッシュ化は元に戻せない(一方向)。
ハッシュ値 はっしゅち
ハッシュ関数が出力する固定長の値で、パスワード保存では「パスワードの指紋」として使う。
ソルト そると(salt)
パスワードをハッシュ化する前に足す、利用者ごとのランダムな文字列で、同じパスワードでも違うハッシュ値にする。
⚠ ソルトは「秘密の鍵」ではなく、レインボーテーブルによる逆引きを防ぐための値。
重複順列 ちょうふくじゅんれつ
同じものを何度使ってもよいとして並べる並べ方で、M種類からn個並べると M^n 通りになる。
⚠ 順列 M!/(M−n)! は同じものを使わない場合。パスワードは同じ文字を使えるので M^n。
ブルートフォース攻撃 Brute Force Attack(総当たり攻撃)
パスワードや暗号鍵の候補を、すべて1つずつ試して当てる攻撃。
⚠ 辞書攻撃は「ありがちな単語」だけを試す。ブルートフォースは「全候補」を試す。
リバースブルートフォース攻撃 Reverse Brute Force Attack
よく使われるパスワードを1つ固定し、利用者IDを次々に変えてログインを試す攻撃。
⚠ 通常のブルートフォースはIDを固定してパスワードを変える。固定するものが逆。
辞書攻撃 じしょこうげき(Dictionary Attack)
辞書にある単語や人名など、パスワードに使われやすい文字列を順に試す攻撃。
⚠ パスワードリスト攻撃は「実際に流出したIDとパスワードの組」を使う点が違う。
パスワードリスト攻撃 ぱすわーどりすとこうげき
他のサイトから流出したIDとパスワードの組を使い、使い回している利用者のアカウントに別サイトでログインする攻撃。
⚠ 「リスト」が単語リストなら辞書攻撃、ハッシュ値の対応表ならレインボー攻撃。
レインボー攻撃 Rainbow Table Attack(レインボーテーブル攻撃)
パスワード候補とそのハッシュ値の対応表を事前に作っておき、入手したハッシュ値から元のパスワードを逆引きする攻撃。
⚠ ログインを試す攻撃ではなく、盗んだハッシュ値を解析する攻撃。対策はソルト。
スニッフィング Sniffing
ネットワークを流れる通信を盗み見て、パスワードなどを取得する攻撃。
⚠ 対策は通信の暗号化。試行回数の制限では防げない。
AES Advanced Encryption Standard
米国標準の共通鍵暗号方式で、鍵長は128・192・256ビットから選べる。
⚠ AES-256 の256は鍵長(ビット)。試行回数は256回ではなく 2^256 回。
線形解読法 せんけいかいどくほう
暗号化関数の統計的な偏りを線形の式で近似して、鍵を推定する解読法。
⚠ 「統計的な偏り」「線形近似」が出たらこれ。総当たりではない。
差分解読法 さぶんかいどくほう
違いのある2つの平文を暗号化し、暗号文の差分の出方から鍵を推定する解読法。
⚠ 「2つの平文の差分」「平文を一定量変化させる」が出たらこれ。
サイドチャネル攻撃 Side Channel Attack
暗号装置の電磁波・消費電力・処理時間など、外部に漏れる物理的な情報から秘密を読み取る攻撃。
⚠ 暗号の数式を解くのではなく、装置の動作を観察する点が他の解読法と違う。
アカウントロック あかうんとろっく
ログインに一定回数失敗したアカウントを一時的に使えなくして、総当たりを防ぐ仕組み。
⚠ リバースブルートフォースは1つのIDへの失敗が少ないため、アカウントロックが効きにくい。

このレッスンの過去問

このレッスンで稽古する