ハッシュ
任意のデータを固定長の値に変換する関数で、データの整合性検証や高速検索に使う
アルゴリズムセキュリティ
ハッシュとは
ハッシュは、任意のデータを固定長の値 (ハッシュ値) に変換する関数である。データの整合性検証、パスワードの保存、ハッシュテーブル (Map/Set) の高速検索に使われる。
ハッシュの特性
ハッシュ関数は、同じ入力に対して常に同じ出力を返す決定性を持ち、計算が高速である。ハッシュ値から元のデータを復元できない一方向性、異なる入力が同じハッシュ値になりにくい衝突耐性、入力の 1 ビットの変化で出力が大きく変わる雪崩効果が特徴だ。
用途別のハッシュ関数
| 用途 | ハッシュ関数 | 例 |
|---|---|---|
| パスワード保存 | bcrypt, Argon2 | ユーザー認証 |
| データ整合性 | SHA-256 | ファイルのチェックサム |
| ハッシュテーブル | MurmurHash | Map, Set の内部 |
| コンテンツアドレス | SHA-256 | Git のコミットハッシュ |
パスワードのハッシュ
import { hash, compare } from 'bcrypt';
// 保存時: パスワードをハッシュ化
const hashed = await hash('password123', 10); // ソルト + ストレッチング
// 検証時: 入力とハッシュを比較
const isValid = await compare('password123', hashed); // true
SHA-256
import { createHash } from 'crypto';
const hash = createHash('sha256').update('hello').digest('hex');
// 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824
DynamoDB のパーティションキーとハッシュ
パーティションキー: "user-123"
↓ 内部ハッシュ関数
ハッシュ値: 0x7A3B...
↓ ハッシュ値の範囲でパーティションを決定
パーティション B に格納
DynamoDB はパーティションキーをハッシュしてデータを分散する。均等に分散するキー設計が重要。
ハッシュの衝突
MD5("hello") = 5d41402abc4b2a76b9719d911017c592
MD5("world") = 7d793037a0760186574b0282f2f435e7
→ 異なる入力でも同じハッシュ値になる可能性がある (衝突)
→ MD5 は衝突が発見されており、セキュリティ用途には使わない
ハッシュ vs 暗号化
| 観点 | ハッシュ | 暗号化 |
|---|---|---|
| 方向 | 一方向 (復元不可) | 双方向 (復号可能) |
| 用途 | 検証、パスワード | データの秘匿 |
| 鍵 | 不要 | 必要 |
実務での活用方法は関連書籍にも詳しい。