ハッシュ関数 — データの「指紋」をつくる

どんなに長いデータでも、短い固定長の値にギュッと潰す。しかも 1ビット変えるだけで出力が半分ひっくり返り(雪崩効果)、出力から入力は戻せない(一方向性)。この不思議な性質が、パスワード保存・改ざん検知・電子署名を支えます。実際に入力ビットをクリックして、指紋が激変する瞬間を体感してください。

1. 任意長 → 固定長 — データの指紋

ハッシュ関数 H は、どんな長さの入力でも、決まった長さの出力に変換します。2文字でも3MBの画像でも、出てくるのは同じ長さの値(=ハッシュ値・ダイジェスト)。人が指の模様で見分けられるように、データはハッシュ値で見分けられる — だから「指紋」と呼ばれます。

下のデモで入力を切り替えてみてください。入力の長さがどれだけ変わっても、出力の長さは一定のままです。

固定長ダイジェスト — 入力が変わっても出力の長さは不変
左=入力(長さはバラバラ)、中央=ハッシュ関数のかき混ぜ、右=常に64ビット(16進16桁)の指紋。塗られたマスが1、空きマスが0のビットです。入力を変えると指紋の模様は総取っ替えになりますが、マスの数は変わりません。
POINT — 良いハッシュ関数の3条件 ① 固定長(任意長の入力を一定長に圧縮)、② 一方向性(出力から入力を逆算できない)、③ 衝突耐性(同じ出力になる別の入力を見つけにくい)。この3つが揃って初めて「暗号学的ハッシュ関数」と呼べます。
h = H(m)  (|m| は任意、|h| は固定) SHA-256 なら、何を入れても出力は必ず 256ビット=16進64桁。1文字の "a" でも数GBの動画でも同じ長さ

2. 雪崩効果 — 1ビットで指紋が激変する

指紋として役立つには、似た入力ほど似た出力になるようでは困ります(それでは元データを推測できてしまう)。良いハッシュは逆で、入力を1ビット変えただけで、出力の約半分のビットが反転します。これが雪崩効果(avalanche effect)。入力と出力のあいだに規則性が見えなくなり、指紋は無相関になります。

下の入力ビットをクリックして反転させてみてください。たった1ビット変えるだけで、右の出力の約50%が赤く反転するはずです。

雪崩効果 — 入力ビットをクリックして出力を見る(赤=反転したビット)
上=入力32ビット(クリックで反転できます)、下=出力64ビット。赤いマスは最初の入力と比べて反転した出力ビット。1ビットだけ変えても出力はおよそ半分が変わります。何ビット変えても反転率はほぼ50%に張り付く — これが指紋の無相関性です。
POINT — 雪崩効果がもたらすもの 出力の各ビットが反転する確率がほぼ 1/2 になるため、「1文字だけ違う2つの文書」でも指紋はまったく別物になります。だからハッシュ値を見ても元データの断片は一切漏れず、ほんのわずかな改ざんも一発で検知できるのです。
Pr[ 出力ビットが反転 ] ≈ 1/2 この可視化のハッシュは仕組みを見せるための簡易版です。実際の SHA-256 等も、入力1ビットの変化で出力の約50%が反転するよう設計されています

3. 一方向性 — 順は一瞬、逆は絶望的

ハッシュは計算するのは一瞬ですが、出力から入力を逆算するのは事実上不可能です。近道がなければ、当たるまで手当たり次第に入力を試す「総当たり」しかありません。出力が n ビットなら候補は 2n 通り。この一方向性が、パスワードを平文で保存せずに済ませる鍵になります。

下のデモで出力ビット長を変えて、逆算に必要な回数と時間がどう爆発するかを見てください。

一方向性 — 順方向は1回、逆方向は総当たり
上=順方向は1回の計算で一瞬。下=逆方向は候補を片っ端から試すしかなく、どれも当たりません。n を上げると必要回数 2n が指数的に膨らみ、時間は宇宙年齢すら軽く超えます。逆に n が小さいと現実的に破れてしまうこともわかります。
注意 — これは学習用の可視化です ここで扱うのは原理の図解であり、実在システムを破る手順ではありません。強度が落ちたと分かったハッシュは、より安全なものへ置き換えるのが防御の基本。自分のシステム以外への攻撃は犯罪です(不正アクセス禁止法などで処罰されます)。本レッスンは守る側の理解のためのものです。
順方向 H(m): 計算1回  逆方向: 平均 2n-1 回の総当たり n=256 なら 2255 ≈ 5.8×1076 回。世界中の計算機を集めても終わらない

4. 衝突耐性と誕生日パラドックス

「同じハッシュ値になる別々の入力」を衝突(collision)と呼びます。出力は固定長なので、入力の方が無限に多く、衝突は数学的には必ず存在します。問題は「どれくらい見つけにくいか」。ここで直感を裏切るのが誕生日パラドックス — 「特定の値に当てる」より「どれでもいいから一致するペアを探す」方がはるかに早く見つかるのです。

下のデモで、ボールを1個ずつランダムなバケツに投げ込みます。全バケツを埋める前に、驚くほど早く同じバケツが2回選ばれる(衝突)のを確かめてください。

誕生日パラドックス — 衝突は √N くらいで現れる
マス=ハッシュ値の入れ物、落ちるボール=入力。空マスは薄く、1回選ばれると水色、2回目に選ばれた瞬間=衝突で赤く光ります。全 N マスのうち、たった約 √N 個投げただけで衝突が起きるのがわかります。下のバーは「1つ以上衝突がある確率」です。
POINT — 誕生日パラドックス 365日あるのに、たった23人集まれば誰かの誕生日が一致する確率が50%を超えます。ペアの組合せが人数の2乗で増えるからです。ハッシュも同じで、n ビット出力の衝突は 2n ではなく 約 2n/2 回で見つかってしまう。
衝突が期待できる試行回数 ≈ √N = 2n/2 だから「nビットの衝突耐性は n/2 ビット相当」。SHA-256(出力256ビット)でも衝突耐性は128ビット分 — それでも 2128 は事実上手が届かない

5. まとめ — 指紋が支えるセキュリティ

一歩先へ — 実世界のハッシュはどこで働いているか 現在の定番は SHA-256 や SHA-3。用途は幅広く、① パスワード保存(平文を保存せず、ソルトを足したハッシュだけを保存。総当たりを遅らせる専用関数も使う)、② ファイルの改ざん検知(配布物のハッシュを公開)、③ 電子署名(長い文書を指紋に潰してから署名 — 次の電子署名と証明書へ)、④ ブロックチェーン(前のブロックの指紋を鎖でつなぐ)。かつて広く使われた MD5・SHA-1 は衝突が現実的に作れることが判明し、いまは署名用途から引退した — 強度が落ちた道具は早めに置き換えるのがセキュリティの鉄則です。