SHAの定義:ハッシュとは何か
SHA(Secure Hash Algorithm)は、任意の入力データを受け取り、固定長の「ハッシュ値(ダイジェスト)」を生成するハッシュ関数の系統です。ハッシュ関数は一般に、次の性質を目的として設計されます。
- 同じ入力からは同じハッシュ値が得られる
- 出力から元の入力を現実的に復元しにくい(可逆でない性質)
- 入力を少し変えると、ハッシュ値も大きく変わりやすい
このためSHAは、「データが改ざんされていないことの確認」や「データ同一性の目印」といった目的で使われます。なお、SHAという呼び名の中には複数の世代(例:SHA-1、SHA-256など)があり、世代ごとに安全性の評価が異なり得ます。
仕組み:入力→圧縮→固定長の出力
SHAの基本的な考え方は、入力を段階的に処理して「最終的に固定長の値」に圧縮することです。典型的には、次の流れで考えると理解しやすくなります。
- 入力の整形(長さなどを反映しながら処理しやすい形にする)
- ブロック単位で計算を繰り返す(内部状態を更新していく)
- 最終的に内部状態を固定長のハッシュ値として出力する
重要なのは、「ハッシュ値を見て入力を復元する」ことが困難である前提で、改ざん検出の観点から利用される点です。もちろん、現実の安全性は「そのSHAの世代が、どの攻撃に対してどの程度耐えると評価されているか」に依存します。
主要な制限:何が難しいのが安全性なのか
SHAの安全性は、主に次のような攻撃モデルの難しさとして捉えられます。
- 逆算(preimage)困難性:ハッシュ値から元の入力を見つけるのが難しいこと
- 第二事前像(second preimage)困難性:同じハッシュ値になる別の入力を見つけるのが難しいこと
- 衝突(collision)困難性:任意の2つの入力が同じハッシュ値になる組を見つけるのが難しいこと
このうち、特に「衝突が現実的になるほど弱くなる」と、ハッシュ単体でできることが制限されます。たとえば、ハッシュ値だけを公開しても「特定の文脈で意味のある一致」を保証しにくくなる場合があります。
ここで注意点として、SHAのハッシュ値は「データが同じかどうかの目印」にはなりますが、用途によっては他の要素(真正性の担保や鍵による検証など)が必要になります。ハッシュだけでは、攻撃者が“別の入力”で同じハッシュ値を成立させる方向に働けてしまう可能性があるためです。どこまでが許容されるかは、脅威モデルと運用設計に依存します。
実践的な確認方法:手元で確かめる観点
SHAを使う/使われている場面で、まず押さえるとよい確認手順をまとめます。ここでは特定のベンダーや製品条件に依存しない、一般的な検証観点に限定します。
