パスワードの安全な保存、ファイルの改ざん検知、ブロックチェーン技術の基盤など、ハッシュ関数はITセキュリティのあらゆる場面で活躍しています。この記事では、ハッシュ関数の基本的な仕組みから、MD5やSHA-256などの代表的なアルゴリズムの違い、実際の用途まで、初心者にもわかりやすく解説します。
ハッシュ関数とは
ハッシュ関数とは、任意の長さのデータを入力すると、固定長の文字列(ハッシュ値)を出力する関数のことです。この出力されるハッシュ値は「ダイジェスト」や「フィンガープリント(指紋)」とも呼ばれます。
入力: "Hello"
↓ ハッシュ関数(SHA-256)
出力: "185f8db32271fe25f561a6fc938b2e264306ec304eda518007d1764826381969"
入力: "Hello!" (1文字追加しただけ)
↓ ハッシュ関数(SHA-256)
出力: "334d016f755cd6dc58c53a86e183882f8ec14f52fb05345887c8a5edd42c87b7"
上の例のように、入力がたった1文字変わっただけでも、出力されるハッシュ値は全く異なるものになります。これが「雪崩効果」と呼ばれるハッシュ関数の重要な性質です。
ハッシュ関数の3つの特徴
1. 一方向性
ハッシュ値から元のデータを復元することはできません。暗号化とは異なり、「復号」の概念がないのがハッシュの大きな特徴です。
"password123" → "ef92b778..." ✓ 変換できる
"ef92b778..." → "password123" ✗ 元に戻せない
2. 固定長の出力
入力データの長さに関係なく、出力されるハッシュ値は常に同じ長さになります。
入力: "a" → SHA-256で64文字の出力
入力: "長い文章..." → SHA-256で64文字の出力
入力: 1GBのファイル → SHA-256で64文字の出力
3. 衝突耐性
異なる入力から同じハッシュ値が生成される(衝突)可能性が極めて低いことが求められます。安全なハッシュ関数では、同じハッシュ値を持つ2つの異なる入力を見つけることが事実上不可能です。
MD5・SHA-1・SHA-256・SHA-512の違い
| アルゴリズム | 出力長 | 安全性 | 用途 |
|---|---|---|---|
| MD5 | 128ビット(32文字) | 非推奨 | ファイル検証(非セキュリティ用途) |
| SHA-1 | 160ビット(40文字) | 非推奨 | レガシーシステム |
| SHA-256 | 256ビット(64文字) | 安全 | パスワード、電子署名、ブロックチェーン |
| SHA-512 | 512ビット(128文字) | 安全 | 高セキュリティが要求される場面 |
同じ「Hello」を各アルゴリズムでハッシュ化すると、以下のようになります。
MD5: 8b1a9953c4611296a827abf8c47804d7
SHA-1: f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0
SHA-256: 185f8db32271fe25f561a6fc938b2e
264306ec304eda518007d1764826381969
SHA-512: 3615f80c9d293ed7402687f94b22d58e
529b8cc7916f8fac7fddf7fbd5af4cf777d3
...(非常に長い)
ハッシュの用途
1. パスワードの保存
Webサービスでは、ユーザーのパスワードをそのまま保存するのは危険です。代わりにハッシュ値を保存し、ログイン時に入力されたパスワードのハッシュ値と比較します。
【登録時】
パスワード "mySecret123" → ハッシュ化 → "a1b2c3..." をDBに保存
【ログイン時】
入力 "mySecret123" → ハッシュ化 → "a1b2c3..."
DBの値 "a1b2c3..." と一致 → ログイン成功
この方法なら、万が一データベースが流出しても、元のパスワードは漏れません。
2. ファイルの改ざん検知
ソフトウェアのダウンロードページでよく見る「SHA-256チェックサム」は、ファイルが改ざんされていないことを確認するためのものです。
公式サイトのハッシュ値: a1b2c3d4e5f6...
ダウンロードしたファイルのハッシュ値: a1b2c3d4e5f6...
→ 一致 = ファイルは正常
3. ブロックチェーン
ビットコインをはじめとする暗号通貨では、SHA-256がブロックの連鎖に使われています。前のブロックのハッシュ値を次のブロックに含めることで、データの改ざんを事実上不可能にしています。
4. デジタル署名
電子文書の署名では、まず文書全体のハッシュ値を計算し、そのハッシュ値に対して暗号化を行います。文書が少しでも変更されればハッシュ値が変わるため、改ざんを検知できます。
MD5の脆弱性と注意点
MD5は1991年に開発された古いアルゴリズムで、現在ではセキュリティ用途に使うべきではありません。その理由は以下の通りです。
- 衝突攻撃が可能 - 2004年に、異なる入力から同じMD5ハッシュ値を生成できることが実証された
- レインボーテーブル攻撃 - 事前に計算されたハッシュ値のデータベースで、よく使われるパスワードのMD5は瞬時に逆引きできる
- 計算が高速すぎる - パスワード用途では計算が速いことが逆にデメリット。攻撃者が大量の候補を高速に試せる
SHA-1も2017年にGoogleが衝突を実証しており、セキュリティ用途ではSHA-256以上を使用することが推奨されています。
なお、パスワードのハッシュ化には、SHA-256よりもさらに専用のアルゴリズム(bcrypt、Argon2など)を使うのがベストプラクティスです。これらは意図的に計算を遅くすることで、ブルートフォース攻撃への耐性を高めています。
ソルトとは
ソルト(Salt)とは、パスワードをハッシュ化する前に付加するランダムな文字列のことです。同じパスワードでも、ソルトが異なればハッシュ値も異なります。
【ソルトなし】
"password123" → ハッシュ化 → "ef92b778..."
全ユーザーが同じパスワードなら同じハッシュ値になる
【ソルトあり】
"password123" + "x7kQ9m" → ハッシュ化 → "3a5f1b..."
"password123" + "pR2wYn" → ハッシュ化 → "8c4d2e..."
同じパスワードでも異なるハッシュ値になる
ソルトを使うことで、以下の攻撃を防げます。
- レインボーテーブル攻撃 - 事前計算されたハッシュ値が使えなくなる
- 同一パスワードの検出 - 複数ユーザーが同じパスワードを使っていても、ハッシュ値からはわからない
ソルトはユーザーごとにランダムに生成し、ハッシュ値と一緒に保存します。秘密にする必要はありませんが、十分な長さ(16バイト以上推奨)が必要です。
実際にハッシュを生成してみましょう
ハッシュ生成ツールを使ってみるまとめ
ハッシュ関数は、セキュリティの基盤となる重要な技術です。一方向性、固定長出力、衝突耐性という3つの特徴を持ち、パスワード保存、ファイル検証、ブロックチェーンなど幅広い分野で活用されています。
現在ではMD5やSHA-1はセキュリティ用途には不十分とされており、SHA-256以上のアルゴリズムを使用することが推奨されています。当サイトのハッシュ生成ツールで、実際に文字列がどのようなハッシュ値に変換されるか、ぜひ体験してみてください。