約3分で読めます
ハッシュ関数とは?MD5/SHA-1/SHA-256の違いと用途・衝突・パスワード保存の注意
ハッシュ関数とは
ハッシュ関数は、任意の長さのデータを入力すると、**決まった長さの文字列(ハッシュ値)**を出力する変換です。同じ入力からは必ず同じ出力が得られ、逆に出力から入力を復元することはできません。この「戻せない」性質が、改竄検知やパスワード保存に利用されます。
例えば「hello」をSHA-256でハッシュ化すると、64桁の16進数文字列が得られます。1文字でも変えると、まったく異なる値になります。
主なハッシュ関数の違い
| アルゴリズム | 出力長 | 安全性 | 推奨用途 |
|---|---|---|---|
| MD5 | 128ビット | 危殆化(衝突発見済み) | チェックサム程度 |
| SHA-1 | 160ビット | 危殆化(非推奨) | 使用を避ける |
| SHA-256 | 256ビット | 現在も安全 | 改竄検知・署名 |
MD5やSHA-1は、異なる入力から同じハッシュ値が作れる「衝突」が現実的に可能と判明しており、セキュリティ用途では使ってはいけません。新規開発ではSHA-256以上を選びましょう。
衝突(コリジョン)とは
理論上、無限の入力を有限の出力に押し込むため、異なる入力が同じハッシュ値になる「衝突」は必ず存在します。問題は、それを意図的に作れてしまうかです。MD5やSHA-1は攻撃者が衝突を生成できるため、署名の偽造などに悪用される恐れがあります。
ハッシュ化はBase64と何が違う?
「戻せない」点が決定的に違います。Base64は誰でもデコードできるエンコードですが、ハッシュ化は一方向で復元できません。改竄検知やパスワード保存には必ずハッシュを使います。実際にハッシュ生成ツールで同じ文字列を変換し、出力の違いを見比べると理解が深まります。
パスワード保存での注意点
パスワードをそのままSHA-256でハッシュ化するだけでは不十分です。次の対策が必須です。
- ソルト(salt)を付与する — ユーザーごとにランダムな文字列を加え、同じパスワードでも別のハッシュにする
- 専用のアルゴリズムを使う — bcrypt・Argon2・scryptなど、あえて計算を遅くして総当たりを困難にする方式を使う
- 生のSHA-256は避ける — 高速すぎて総当たり攻撃に弱い
そもそも安全なパスワードを作ること自体も重要です。パスワード生成ツールで長くランダムなパスワードを用意しておきましょう。
まとめ
- ハッシュ関数は一方向変換で、改竄検知やパスワード保存に使う
- MD5・SHA-1は衝突可能なため非推奨、新規ではSHA-256以上を
- パスワード保存はソルト+bcrypt/Argon2が基本
- ハッシュ生成ツールで各方式の出力を試せる