【はっしゅかんすう】

ハッシュ関数 とは?

最終更新:
💡 データを比較や検索に使うハッシュ値へ変換する関数

データからハッシュ値を計算する関数。SHA-256などは決められた長さの値を出す。検索用と暗号用では求める性質が異なる。暗号用では元の入力や同じ値になる別の入力を見つけにくくするが、元の入力が推測されない保証ではない。

📌 このページのポイント
入力からハッシュ値を計算する SHA-256の例(入力はUTF-8) hello SHA-256 計算 2cf24dba… 先頭8桁だけ hello SHA-256 計算 2cf24dba… 先頭8桁だけ Hello SHA-256 計算 185f8db3… 先頭8桁だけ 全体は256ビット=16進数64桁 同じ入力・同じ関数なら同じ値 異なる入力の衝突はあり得る
SHA-256の実際の値を先頭8桁に省略した例。短い入力でも出力全体の長さは同じ。緑は同一入力の一致を示し、安全性の保証を表さない。一般の検索用ハッシュと暗号用は区別する。
ひよこ ひよこ
何のための値なの?
ペンギン先生 ペンギン先生
例えばファイルの内容から値を計算し、比較に使えるよ。ハッシュテーブルでは検索先を絞る値に使う。一方、SHA-256などの暗号用ハッシュには、元の入力や衝突する入力を見つけることが計算上難しい性質を求める。検索用と暗号用を区別しよう。
ひよこ ひよこ
違うデータなら値も必ず違う?
ペンギン先生 ペンギン先生
必ずではないよ。異なる入力が同じハッシュ値になることを衝突という。ハッシュテーブルでも同じ値だけで同じデータと決めつけない。暗号用の衝突耐性は、衝突が存在しないという意味ではなく、見つけることが難しい性質なんだ。
ひよこ ひよこ
暗号化のように元に戻せる?
ペンギン先生 ペンギン先生
暗号化は適切な鍵で元の内容を取り出す仕組みだけれど、ハッシュ値は内容を復元するための保存形式ではないよ。ただし、入力の候補を計算して同じ値になるか試すことはできる。弱いパスワードなら推測され得るので、漏れた値から絶対に分からないとは言えないんだ。
ひよこ ひよこ
パスワードをSHA-256で保存すればいい?
ペンギン先生 ペンギン先生
SHA-256を一回計算するだけでは、候補を大量に試す攻撃への備えとして不十分だよ。パスワード用の方式で、利用者ごとのソルトと、処理の計算コストを使う。ソルトも値と一緒に保存し、攻撃者の一回の推測にかかる負担を増やす設計にするんだ。
ひよこ ひよこ
ファイルの改ざんは値だけで分かる?
ペンギン先生 ペンギン先生
比較元の値を信頼できることも必要だよ。ファイルと比較元の値が両方置き換えられたら、計算だけでは正しい配布元か分からない。衝突耐性が必要な用途にMD5は適さない。SHA-2やSHA-3なども、用途と必要な性質を確かめて使うんだ。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「ハッシュ関数」って出てきたら「データを比較や検索に使うハッシュ値へ変換する関数」と思えばだいたいOK!
📖 おまけ:英語の意味
「Hash Function」 = ハッシュ値を計算する関数
💬 Hashは細かく刻んで混ぜることを表す語。実際の処理がデータを文字通り細切れにするわけではなく、決まった手順でハッシュ値を計算するよ。

参考資料

← 用語集にもどる