レッスン 1
ハッシュとは何か
一方向ダイジェストと、開発者がハッシュを使う場面を学びます。
ハッシュ関数は任意サイズの入力データを受け取り、固定サイズの ダイジェスト を出力します。多くの場合 16 進数テキストとして表示されます。同じ入力とアルゴリズムなら、常に同じダイジェストが得られます。入力が 1 文字変わるだけでも、ダイジェストは通常まったく別の値になります。
ハッシュは一方向
データからハッシュは計算できますが、ハッシュから元の入力を確実に復元することはできません。そのためハッシュは指紋として使われ、秘密を取り出す手段ではありません。
ハッシュは決定的
Hello というバイト列を SHA-256 で 2 回ハッシュすると、両方とも同じ結果になります。この性質が比較に役立ちます。
- ダウンロードしたファイルは公開チェックサムと一致するか?
- この設定は昨日から変わったか?
- 2 つの API payload はバイト単位で同一か?
開発者がハッシュを見る場所
よくある例:
- パッケージマネージャの lockfile の整合性フィールド
- Git のコミット ID(SHA-1 ベース、Git 固有の形式)
- HTTP の
ETagヘッダーとキャッシュキー - 適切な鍵ストレッチと組み合わせたパスワード保存(平文 MD5 単体は不可)
- ブロックチェーンや証明書のフィンガープリント(通常はより強いアルゴリズム)
ハッシュは変更を検出するが、意図は示さない
ハッシュは、選んだアルゴリズムの下で 2 つのバイト列が一致するかを示します。誰がデータを作ったか、実行して安全か、第三者が改ざんしたかまでは、参照ハッシュの出所をすでに信頼している場合を除き、ハッシュだけでは分かりません。