最終更新:
ハッシュとは?暗号化との違い・衝突・パスワード保存を解説
ハッシュは何をしているの?
暗号化とは違う?
パスワードのハッシュが漏れたら?
ソルトを加えると何が変わる?
違う入力なのに同じ値になる?
それが衝突だよ。出力の種類が有限なので、異なる入力に同じ出力があること自体は避けられない。暗号学的ハッシュでは、そのような組を実用的な計算量で見つけにくいことが重要なんだ。
ダウンロードしたファイルの確認にも使える?
信頼できる経路で得た期待値と比較すれば、違いを見つけるのに役立つよ。ただし攻撃者がファイルと掲載ハッシュの両方を差し替えられるなら、それだけでは正当性を証明できない。署名や共有秘密を使うHMACは、鍵も使って検証する別の仕組みだね。
ハッシュテーブルも同じ安全性が必要?
通常は検索先を振り分けるために使うので、速さや分散の良さが重要だよ。別のキーが同じ場所に入る衝突は、キーの比較などで処理する。検索が平均的に高速でも、入力や実装次第で常にO(1)とは限らないんだ。
どう使い分ければいい?
SHA-256の短い確認例
UTF-8でエンコードした hello(改行なし)のSHA-256は次の値です。256ビット=32バイトで、16進表記では64文字になります。
2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824
hello と hello の末尾に改行を付けたデータでは入力バイト列が違うので、値も異なります。照合が合わないときは、文字コード・改行・空白・ファイルそのものの違いを確認してください。
用途別の選び方
| 目的 | 方式の例 | 誤解しやすい点 |
|---|---|---|
| 内容の照合 | SHA-256 | 期待値を取得した経路も信頼できる必要がある |
| パスワード保存 | Argon2id+個別ソルト | パラメータと負荷を評価。漏えい時の推測は可能 |
| 共有秘密を使う認証 | HMAC | 単に秘密文字列と本文を連結してハッシュしない |
| キー検索 | ハッシュテーブル用の関数 | 衝突を扱う仕組みが必要。暗号用途とは別 |
ソルトと違い、ペッパーは秘密として別に管理する追加の値です。採用する場合は保管・ローテーション・漏えい時の対応が必要で、強いパスワード保存方式の代わりにはなりません。MD5やSHA-1を新しい安全性要件のある衝突耐性用途に選ばないでください。
参考資料
確認日:2026年9月27日。製品の仕様・料金・対応環境は導入時にも確認してください。
- NIST: Hash Functions:衝突耐性・原像計算困難性とSHA系列。
- OWASP: Password Storage:Argon2id、個別ソルト、推測攻撃、ペッパー。
- RFC 2104: HMAC:共有秘密を利用するメッセージ認証。
- Java: HashMap:定数時間の性能が成り立つ分散条件。