Webサービスでは,ユーザのパスワードを安全に保存する必要があります.
しかし,単純にデータベースへパスワードを保存するだけでは,情報漏えい時に重大な被害へつながります.
そこで重要になるのが「パスワードのハッシュ化」であり,情報処理安全確保支援士試験においても頻出のキーワードとなっています.
この記事では,情報処理安全確保支援士(SC)試験対策として,
- なぜパスワードをハッシュ化するのか
- レインボーテーブル攻撃とは何か
- ソルト(Salt)とペッパー(Pepper)の違い
- SHA-256が危険と言われる理由
- bcrypt・scrypt・Argon2の違い
- ストレッチングとは何か
を一気通貫で分かりやすく解説します.
記事の都合(セキュリティ対策の啓発)上,攻撃手法に関する記述が一部含まれますが,あくまでセキュリティ教育を目的としたものであり,悪用は禁止です.
なぜパスワードをハッシュ化するのか
本題に入る前に,ハッシュ化・ハッシュ値について軽く復習しておきましょう.
・ハッシュ化:平文(元の文字)をハッシュ値に変換すること
・ハッシュ値:特定のハッシュアルゴリズムにより得られる固定長のランダムな文字列.
ハッシュ値から元のデータを復元することは極めて困難(一方向性),同じ平文からは同じハッシュ値が得られる(同一性)を持つ.
では,本題に入ってハッシュ化の必要性について確認しましょう.
もしパスワードをそのまま(平文)保存していた場合,データベースが漏えいすると全ユーザのパスワードが即座に知られてしまいます.
| username | login_id | password |
| 情報 一郎 | joho | pass123 |
| 暗号 花子 | h-crypt | qwerty |
| 認証 二郎 | jiro-auth | pass123 |
この状態で漏えいすると,攻撃者はそのまま本人になりすましてログインできてしまいます.
さらに,情報 一郎さんや暗号 花子さんがログインIDとパスワードを他のサービスでも使い回していた場合,他のサービスにも不正ログインされてしまいます.
そもそも,データベース(特にUsersテーブル)の中身が不正に引き抜かれるようなことはあってはならないのですが,万が一,このような事態が起こったとしても被害を最小限に抑えるためにパスワードのハッシュ化が必要なのです.
レインボーテーブル攻撃とは
前章では,平文パスワード保存の危険性についてご紹介しました.そこで,ユーザが入力したパスワードをSHA-256によりハッシュ化したテーブルを以下に用意しました.
注)表示の関係上,パスワードハッシュ値の一部は省略して掲載しています.
| username | login_id | password |
| 情報 一郎 | joho | 9b8769a4a74 … |
| 暗号 花子 | h-crypt | 65e84be3353 … |
| 認証 二郎 | jiro-auth | 9b8769a4a74 … |
一見問題無さそうに見えますが... 実は重大な落とし穴があります.
その落とし穴とは,一体何でしょうか?
・攻撃者は,事前に作成された膨大な量のパスワード平文とパスワードハッシュ値の対照表(これを「レインボーテーブル」と呼びます)を持っている.
・情報 一郎 さん と 認証 二郎 さんのパスワードハッシュ値が等しい(2人は同じパスワードを登録している)ことが分かる.
事前に作成(計算)された膨大な量のパスワード平文とパスワードハッシュ値の対照表を用いて,データベーステーブル中のパスワードハッシュ値から元のパスワード平文を割り出す攻撃のことを,レインボーテーブル攻撃と呼びます.
複数のユーザが同じパスワードを設定していることが分かる
仮に情報 一郎さんが設定しているパスワード「pass123」がレインボーテーブルに無かったとしましょう.(実際は,このような安直なパスワードはほぼ確実にレインボーテーブルに存在します.)
その場合,攻撃者は総当たりまたは辞書攻撃,パスワードリスト攻撃等の別手段で元のパスワード「pass123」を割り出すことになります.
そうすると,芋づる式にパスワードハッシュ値が等しい 認証 二郎 さんのパスワードも「pass123」であることが攻撃者にバレてしまいます.
他の攻撃手法との違い
ここで,パスワードを割り出す際に用いられることが多い代表的な攻撃手法を表で整理してみましょう.
| 攻撃 | 特徴 |
| ブルートフォース攻撃 | 全てのあらゆる文字列を総当たりで試す |
| 辞書攻撃 | 汎用単語やよく用いられるパスワードのリストを試行する |
| レインボーテーブル攻撃 | 事前に計算された平文とハッシュ値の対照表を用いて元のパスワードを割り出す |
| パスワードリスト攻撃 | 既に流出したIDとパスワードの組み合わせを用いて不正ログインを試行する |
ソルト(Salt)とは
前章で言及した課題(弱点)を克服するために生み出されたのがソルト(Salt)です.
ユーザ(パスワード)ごとにランダムな文字列を付加した上で元のパスワードとセットでハッシュ化を行うことから,ランダムソルトとも呼ばれます.
ランダムソルトを導入すると,先ほどのUsersテーブルは以下のようになります.
| username | login_id | password |
| 情報 一郎 | joho | c790f40e873be84ebe86517b178d3ec1:08312ece73f4d66e1bc7019c028e2ed699dfa836336879422f59079c99c42f3f |
| 暗号 花子 | h-crypt | 9e5097fd3a71f92a18d99f2ed20d3ebf:e5096d7e82c28ba68813a8b9025ee9a874abaa27b50190a744dae70e0ffdba8b |
| 認証 二郎 | jiro-auth | a083a92b3f3971106db7918a6e3a2932:9435c3ef08b6855d3758e279ce90894b9f2ccf7891fe4a418a15ee1c941459b7 |
passwordフィールドには,ランダムソルトと(ランダムソルト+平文パスワード)のハッシュ値が:(コロン)で連結されて格納されています.
ランダムソルトを入れることで,異なるユーザ間で同一のパスワードが設定されていたとしても,一見しただけではその事実が分かりづらくなっています.
しかし,このランダムソルトにもまだ課題は残ります.それは,ハッシュ値の中にランダムソルトが同梱されている点です.つまり,辞書攻撃に対しては脆弱で,特に平易なパスワードを設定している場合は,ハッシュ値の総当たり突合により,元のパスワードを割り出されるリスクが残ります.
この問題を解決するために考えられたのが次章で説明するペッパー(Pepper)です.
ペッパー(Pepper)とは
Pepperは,ハッシュ化処理の際に用いる秘密の文字列です.ランダムソルトは,ハッシュ値と同梱(あるいは同じデータベース)に保存していましたが,Pepperはサーバの秘密領域やKMS(Key Management Service)等に保存します.
$$hash(\text{pepper }+ \text{salt} + \text{password})$$ のように処理します.
上記の数式で処理されたハッシュ値の場合,攻撃者はPepperの値を知らないとハッシュ値からの総当たり突合で元のパスワードを割り出すことができません.
従って,Pepperはランダムかつ十分に長い文字列を設定し,データベースとは別のサーバ秘密領域(KMS保管が望ましい)等で厳重に管理する必要があります.
ソルトとペッパーの違い まとめ
ソルトとペッパーの違いを表でまとめてみました.
| 項目 | ソルト | ペッパー |
|---|---|---|
| 目的 | 重複防止 | 漏えい耐性向上 |
| 公開可? | 可 | 不可 |
| 保存場所 | DB | サーバ秘密領域 |
| ユーザごと? | 通常Yes | 共通が多い |
bcrypt・Argon2
ここまで,SHA-256というハッシュ化アルゴリズムに対して,安全性を高める手法(ランダムソルト・ペッパー)をご紹介してきました.
続いて,ハッシュ化アルゴリズム自体の改良についてご紹介します.
SHA-256アルゴリズムは,ハッシュ化処理(計算)が高速である反面,攻撃者にとっても総当たり攻撃がしやすいという課題があります.
そこで,現在はbcryptやArgon2のような敢えて計算に時間(負荷)がかかるアルゴリズムが採用されるようになっています.ハッシュ化処理を複数回繰り返すストレッチング処理やメモリ負荷制御,GPU耐性といった戦略です.
まとめ
最後に,実際の情報処理技術者試験・情報処理安全確保支援士試験の過去問で知識を再確認しましょう.
パスワードクラック手法の一種である,レインボー攻撃に該当するものはどれか。
ア)何らかの方法で事前に利用者IDと平文のパスワードのリストを入手しておき,複数のシステム間で使い回されている利用者IDとパスワードの組みを狙って,ログインを試行する。
イ)パスワードに成り得る文字列の全てを用いて,総当たりでログインを試行する。
ウ)平文のパスワードとハッシュ値をチェーンによって管理するテーブルを準備しておき,それを用いて,不正に入手したハッシュ値からパスワードを解読する。
エ)利用者の誕生日や電話番号などの個人情報を言葉巧みに聞き出して,パスワードを類推する。
平成31年度 春期 応用技術者試験 午前 問38
パスワードクラックの対策のうち,ストレッチングに該当するものはどれか。
ア)あらかじめ利用者だけが知っている質問と答えをシステムに登録しておき,普段と異なるログイン方法の場合に追加で質問を行う。
イ)一定時間内にパスワードを一定回数誤ったとき,それ以降のログインを試行できないようにする。
ウ)パスワードの照合のためのハッシュ値を,パスワードに対してハッシュ化を繰り返して,求める。
エ)パスワードの照合のためのハッシュ値を,パスワードに利用者IDごとに異なる文字列を付加してからハッシュ化して,求める。
令和7年度 春期 応用技術者試験 午前 問44
実践・応用的な問題としては,応用情報技術者試験 令和6年秋期 午後問1が参考になります.
