ハッシュ関数 はっしゅかんすう
ハッシュSHA-256MD5不可逆変換チェックサム整合性確認
ハッシュ関数について教えて
簡単に言うとこんな感じ!
どんな長さのデータでも「一定長の指紋(ハッシュ値)」に変換する一方向関数だよ。ファイルが1バイトでも変わるとハッシュ値が全然変わるから、「改ざんされていないか」の確認に使われるんだ!
ハッシュ関数とは
ハッシュ関数(Hash Function) とは、任意の長さのデータを入力として受け取り、固定長のビット列(ハッシュ値・ダイジェスト)を出力する一方向性の関数です。「一方向性」とは、ハッシュ値から元のデータを逆算できないことを意味します。
セキュリティ用途で使われるハッシュ関数(暗号学的ハッシュ関数)には以下の性質が求められます。
- 一方向性:ハッシュ値から元データを復元できない
- 衝突耐性:異なる入力から同じハッシュ値が生成されない(衝突困難性)
- 雪崩効果:入力が1ビット変わるだけで出力が大きく変わる
身近な使用例は多く、ダウンロードしたファイルの「SHA256チェックサム」確認、パスワードのデータベース保存(パスワードそのものではなくハッシュを保存)、Gitのコミット管理、ブロックチェーンのトランザクション管理などが挙げられます。
主なハッシュアルゴリズムの比較
| アルゴリズム | 出力長 | 安全性 | 用途 |
|---|---|---|---|
| MD5 | 128ビット | 危険(衝突発見済み) | レガシーシステムのみ |
| SHA-1 | 160ビット | 非推奨(衝突実証済み) | 廃止移行中 |
| SHA-256 | 256ビット | 安全 | TLS証明書・ファイル検証・ビットコイン |
| SHA-384 | 384ビット | 安全 | 高セキュリティ用途 |
| SHA-512 | 512ビット | 安全 | 高セキュリティ用途 |
| SHA-3 (Keccak) | 可変 | 安全(SHA-2とは別設計) | 将来の標準候補 |
| bcrypt/scrypt/Argon2 | 可変 | パスワード専用(意図的に低速) | パスワードハッシュ |
歴史と背景
- 1991年:RSA社がMD5を公開(当時は安全とされた)
- 1993年:NSAがSHA(後のSHA-0)を開発。翌年SHA-1を公開
- 2004年:Wang Xiaoyyunらが現実的なコストでMD5の衝突を生成することに成功
- 2005年:SHA-1の理論的な衝突攻撃が発表され、警戒が高まる
- 2006年:NISTがSHA-2(SHA-256等)への移行を推奨開始
- 2017年:GoogleがSHA-1の現実的な衝突(SHAttered攻撃)を実証
- 2022年:主要ブラウザ・CAがSHA-1証明書を完全拒否
ハッシュ関数の動作イメージ
入力1: "Hello, World!"
SHA-256 → dffd6021bb2bd5b0af676290809ec3a53191dd81c7f70a4b28688a362182986d
入力2: "Hello, World?" (最後が ? に変わっただけ)
SHA-256 → 1b4f0e9851971998e732078544c96b36c3d01cedf7caa332359d6f1d83567014
たった1文字変えただけでハッシュ値が全く異なる値になる(雪崩効果)ことがわかります。
関連する規格・RFC
| 規格・RFC番号 | 内容 |
|---|---|
| FIPS PUB 180-4 | SHA-1/224/256/384/512の仕様 |
| FIPS PUB 202 | SHA-3(Keccak)の仕様 |
| RFC 6234 | SHA-2のC言語参照実装 |
| RFC 9106 | Argon2パスワードハッシュアルゴリズム |
関連用語
- デジタル署名 — ハッシュ値に秘密鍵で署名する仕組み
- 公開鍵暗号(RSA・ECC) — ハッシュと組み合わせてデジタル署名を構成
- 脅威インテリジェンス・IOC — マルウェアのハッシュ値がIOCの代表例
- PKI — 証明書の整合性確認にハッシュ関数が使われる