パスワードの安全な保存、ファイルの改ざん検知、ブロックチェーン技術の基盤など、ハッシュ関数は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の違い

アルゴリズム出力長安全性用途
MD5128ビット(32文字)非推奨ファイル検証(非セキュリティ用途)
SHA-1160ビット(40文字)非推奨レガシーシステム
SHA-256256ビット(64文字)安全パスワード、電子署名、ブロックチェーン
SHA-512512ビット(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以上のアルゴリズムを使用することが推奨されています。当サイトのハッシュ生成ツールで、実際に文字列がどのようなハッシュ値に変換されるか、ぜひ体験してみてください。