SHAハッシュの仕組み:SHA-1・256・384・512は何が違うのか

ハッシュ関数は入力をどんな長さでも固定長の文字列に変換します。その性質が何を保証していて、何を保証していないかを理解すると、ハッシュの使いどころがはっきり見えてきます。

ハッシュは一方向にしか計算できない

入力からハッシュ値を求めるのは高速だが、ハッシュ値から元の入力を逆算することは計算量的に現実的でないように設計されている。これが「正しい鍵があれば元に戻せる」暗号化との決定的な違い。

出力長は常に一定

SHA-256は1文字をハッシュ化しても本1冊分をハッシュ化しても、常に256ビット(16進数64文字)の出力になる。この固定長のおかげで、任意サイズのデータをコンパクトな「指紋」として扱える。

同じ入力からは常に同じハッシュが得られる

どの端末で計算しても、同じ入力からは必ず同じ出力が得られるため、ファイルが改ざん・破損していないかの検証に使える。

入力のわずかな変化で出力全体が別物になる(アバランシュ効果)

1文字変えただけでも出力ハッシュ全体がまるで無関係な値に変わるため、ハッシュは「どれくらい似ているか」の判定には使えず、「完全に一致するかどうか」のみに使える。

SHA-1はセキュリティ用途では破られている

同じハッシュ値になる異なる入力(衝突)を意図的に作り出す攻撃が実証されており、証明書などセキュリティが重要な用途ではもはや安全とは見なされていない。ただしGitの内部オブジェクトIDなど非セキュリティ用途や古いシステムでは今も見かける。

SHA-256・384・512の主な違いは出力長

いずれも同じSHA-2ファミリーに属し、現時点では安全とされている。数字は出力のビット長を表し、長いほど理論上の安全余裕は大きくなるが、その分わずかに計算コストも増える。

ハッシュ化は暗号化ではない

ハッシュを「元に戻せる、ただスクランブルされたデータ」だと誤解しがちだが、実際にはハッシュ値を入力に戻す鍵や手順は存在しない。だからこそハッシュはデータを「後で取り戻す」ためではなく、「2つが一致するかどうかを検証する」ために使われる。

パスワードには単純なハッシュだけでは不十分な理由

パスワードの生のSHA-256ハッシュを保存するだけでは、同じパスワードが常に同じハッシュになる性質を突いたレインボーテーブルや総当たり攻撃に弱い。実際のパスワード保存システムはユーザーごとにランダムな「ソルト」を加え、bcryptやArgon2のように意図的に処理を遅くしたアルゴリズムを使う。SHA-256のような汎用の高速ハッシュはこの用途には向いていない。

よくある質問

2つのファイルのハッシュ値が同じなら、その2つは確実に同一ですか?

SHA-256・SHA-384・SHA-512であれば、実用上はイエスと言ってよく、偶然の衝突が起きる確率は天文学的に低い。一方SHA-1は意図的な衝突が実際に作られた実績があるため、セキュリティが重要な整合性チェックには使うべきではない。

ダウンロードしたファイルが壊れていないか確認するのにハッシュ生成器は使えますか?

はい、これはハッシュの最も一般的で正当な用途の一つ。配布元が提示するハッシュ値と、自分の手元のファイルから生成したハッシュ値を比較し、一致すれば転送中に改ざん・破損していないことが確認できる。