ハッシュ・ハッシュ関数
まず結論
ハッシュ関数は任意の長さのデータから固定長の「ダイジェスト(ハッシュ値)」を生成する一方向関数です。逆算不可能・わずかな変更で大きく変わるという性質を利用して、パスワード保護・改ざん検知・デジタル署名に使います。
ハッシュ関数の仕組み
「Hello」
→
SHA-256
→
185f8db32921bd...(64文字)
「Hello!」(!追加)
→
SHA-256
→
334d016f755cd6...(全く違う)
「100MBの動画ファイル」
→
SHA-256
→
同じく64文字
入力がどんな長さでも出力は固定長、1文字違うだけでハッシュ値が大きく変わる
ハッシュ関数の4大性質
① 一方向性
ハッシュ値から元のデータを復元できない。パスワードを平文で保存せずにすむ。
② 衝突困難性
同じハッシュ値を持つ2つの異なる入力を見つけることが計算上困難。
③ 雪崩効果
入力が1ビット変わるだけでハッシュ値が大きく変化する。改ざん検知に有効。
④ 固定長出力
SHA-256は常に256ビット(64文字16進数)。MD5は128ビット(32文字)。
ハッシュの用途
| 用途 | 仕組み |
|---|---|
| パスワード保存 | パスワードをハッシュ化してDBに保存。ログイン時に入力をハッシュ化して比較。平文流出を防ぐ。 |
| ファイル改ざん検知 | 配布前のハッシュ値を公開。ダウンロード後にハッシュ値を比較して一致するか確認。 |
| デジタル署名 | データのハッシュ値を秘密鍵で暗号化。受信者は公開鍵で復号してハッシュ値を照合。 |
| ブロックチェーン | 前ブロックのハッシュ値を含めることでチェーンの改ざんを検知。 |
MD5・SHA-1は脆弱:MD5とSHA-1は衝突が発見済みで安全でない。現在はSHA-256以上を使用することが推奨。
🎯 試験での出方
- 「ハッシュ関数の特性」→ 一方向性・衝突困難性・雪崩効果
- 「ハッシュ値からデータを復元できるか」→ ✗ できない(一方向性)
- 「メッセージダイジェスト」→ ハッシュ値の別名
- 「SHA-256のハッシュ値の長さ」→ 256ビット(64文字16進数)
⚠️ よくある間違い
- 「ハッシュ関数は暗号化関数」→ △ 暗号化は復号できるが、ハッシュは一方向で復号不可(別物)
- 「ハッシュ値が同じなら必ず同じデータ」→ △ 衝突(異なるデータが同じハッシュ値)が理論上あり得る
- 「MD5は現在も安全」→ ✗ MD5は衝突が発見されており現在は使用非推奨
✍️ 確認クイズ
Q1. ハッシュ関数の「一方向性」が意味することはどれか。
✅ 正解は②。一方向性とは、ハッシュ値(出力)から元のデータ(入力)を逆算することが現実的な計算能力では不可能な性質。パスワード保護に活用される。
Q2. ダウンロードしたファイルの改ざんを確認するために使われる技術はどれか。
✅ 正解は②。配布元が公開したハッシュ値とダウンロード後のファイルのハッシュ値を比較。一致すれば改ざんなし。1バイトでも違えばハッシュ値が大きく変わる(雪崩効果)。
Q3. 現在も安全に使用できるハッシュアルゴリズムはどれか。
✅ 正解は③。MD5とSHA-1は衝突が発見されており現在は使用非推奨。SHA-256(SHA-2ファミリー)以上が推奨されています。
Q4. パスワードのハッシュ保存に「ソルト(salt)」を付加する目的として正しいものはどれか。
✅ 正解は②。ソルトはパスワードをハッシュ化する前にランダムな文字列(ソルト)を付加する手法。同じパスワード「password123」でも、ソルトが異なれば別のハッシュ値になります。これにより、よく使われるパスワードのハッシュ値一覧(レインボーテーブル)による攻撃を無効化できます。
Q5. ハッシュ関数の「衝突(コリジョン)」とは何か。
✅ 正解は③。衝突(コリジョン)とは、異なる入力データA≠BでもHash(A)=Hash(B)になること。任意長の入力を固定長に圧縮するため理論上は必ず存在しますが、安全なハッシュ関数は現実的な計算能力で衝突を見つけることが「衝突困難」であるよう設計されています。MD5は実際に衝突が発見されたため危険とされています。
Sponsor Link