ハッシュ
Hash
データを一定の規則で短い値に写す計算です。ここではSHA-256などの暗号学的ハッシュ関数を扱います。同じ入力は同じ値になりますが、異なる入力が同じ値になる「衝突」が理論上ないわけではありません。
🐾 猫で例えると?
猫の縞模様を、見分けるための短い「特徴メモ」に置き換えるとハッシュのイメージに近づきます。同じ猫を同じ規則で記録すれば同じメモになりますが、短いメモだけで猫そのものを再現することはできません。メモが一致しても必ず同一だと言い切れない点が、衝突の注意点に対応します。
💻 セキュリティと認証における「ハッシュ」とは?
ハッシュは、データの比較や改変の検出、パスワード検証などに利用されます。データを隠して後から復元する暗号化とは役割が異なり、ハッシュ値を公開すれば元データの秘密を必ず守れる、というものでもありません。
パスワードの保存には、Argon2idなどの専用方式とユーザーごとに異なる追加の値(ソルト)を使い、ライブラリの検証関数で照合します。高速なSHA-256を一回適用するだけでは、大量のパスワード候補を試されやすいため不十分です。
⚠️ ハッシュの仕組みと注意点
暗号学的ハッシュは、出力から入力を求めることが計算上難しくなるよう設計されています。ただし、入力が短い暗証番号などなら、候補を計算して一致するものを探せます。「復号する手順がない」と「推測されない」は別の話です。
SHA-256アルゴリズムによるハッシュ生成の例
以下は、一般的な暗号学的ハッシュ関数である「SHA-256」を用いて、データを固定長(256ビット/64文字の16進数)の文字列へ変換した際のイメージです。
// Node.jsでSHA-256を実際に計算する例(パスワード保存用ではない)
import { createHash } from "node:crypto";
for (const text of ["Cat", "Cat!"]) {
console.log(createHash("sha256").update(text, "utf8").digest("hex"));
} ファイルの整合性確認にも使えます。ただし比較するハッシュ値も攻撃者が書き換えられるなら、改ざんの証明にはなりません。配布元の署名や信頼できる経路で得た値と照合します。
🛠️ ハッシュを賢く使うためのポイント
認証システムやセキュリティ設計を実装するエンジニアは、ハッシュの限界と進化の歴史を正しく理解していなければなりません。
- 用途に合う方式を選ぶ: MD5やSHA-1は衝突への耐性が不足するため、改ざん検出などのセキュリティ用途では避けます。ファイル照合とパスワード保存では求める性質が異なります。
- ソルトを使う: パスワードごとに異なるソルトを使うことで、同じパスワードの識別や計算結果の使い回しを難しくします。短いパスワードへの総当たりを無効化するものではありません。
- 専用方式のコストを調整する: 自作の反復処理ではなく、保守されたライブラリを使います。ログインの負荷と攻撃者の計算コストの両方を考慮して設定します。
猫の特徴メモを使うと見比べやすくなるように、ハッシュはデータを扱う便利な道具です。暗号化との違い、衝突、候補の推測という限界を知ると、用途に合った使い方を選べます。