ハッシュ
任意のデータを固定長の値に変換する関数で、データの整合性検証や高速検索に使う
ハッシュとは
ハッシュは、任意のデータを固定長の値 (ハッシュ値) に変換する関数である。データの整合性検証、パスワードの保存、ハッシュテーブル (Map/Set) の高速検索に使われる。
ハッシュの特性
ハッシュ関数は、同じ入力に対して常に同じ出力を返す決定性を持つ。ハッシュ値から元のデータを現実的な計算量では復元できない一方向性、異なる入力が同じハッシュ値になりにくい衝突耐性、入力の 1 ビットの変化で出力が大きく変わる雪崩効果が特徴だ。
速度の要件は用途で正反対になる。整合性検証やハッシュテーブルでは大量のデータを捌くので速いほど良い。一方パスワード保存では、計算が速いほど攻撃者の総当たり試行も速くなるため、bcrypt や Argon2 のようにコストパラメータで意図的に計算を重くしたハッシュを使う。汎用の SHA-256 にパスワードをそのまま通す設計は避ける。
用途別のハッシュ関数
用途別のハッシュ関数を以下にまとめる。
| 用途 | ハッシュ関数 | 例 |
|---|---|---|
| パスワード保存 | bcrypt, Argon2 | ユーザー認証 |
| データ整合性 | SHA-256 | ファイルのチェックサム |
| ハッシュテーブル | MurmurHash | Map, Set の内部 |
| コンテンツアドレス | SHA-1, SHA-256 | Git のコミットハッシュ (既定は SHA-1) |
パスワードのハッシュ
パスワードのハッシュのコード例を示す。
import { hash, compare } from 'bcrypt';
// 保存時: パスワードをハッシュ化
const hashed = await hash('password123', 10); // ソルト + ストレッチング
// 検証時: 入力とハッシュを比較
const isValid = await compare('password123', hashed); // true
SHA-256
SHA-256 のコード例を示す。
import { createHash } from 'crypto';
const hash = createHash('sha256').update('hello').digest('hex');
// 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824
DynamoDB のパーティションキーとハッシュ
DynamoDB のパーティションキーとハッシュを図で示す。
パーティションキー: "user-123"
↓ 内部ハッシュ関数
ハッシュ値: 0x7A3B...
↓ ハッシュ値の範囲でパーティションを決定
パーティション B に格納
DynamoDB はパーティションキーをハッシュしてデータを分散する。均等に分散するキー設計が重要。
ハッシュの衝突
ハッシュの衝突を図で示す。
MD5("hello") = 5d41402abc4b2a76b9719d911017c592
MD5("world") = 7d793037a0760186574b0282f2f435e7
→ 入力の種類は無限だが出力は 128 ビット固定長なので、衝突は原理的に避けられない
→ 分かれ目は「衝突を攻撃者が狙って作れるか」
上の 2 例はハッシュ値が異なるが、入力の数が出力の組み合わせ数を上回る以上、同じ値に落ちる組はどこかに必ず存在する。実務で問題になるのは、その組を攻撃者が意図して作れるかどうかだ。MD5 は 2004 年に衝突の実例を示す論文が出て以降、生成コストが下がり続け、RFC 6151 (2011 年) は衝突耐性が必要な用途で MD5 はもはや受け入れられないと述べている。SHA-1 も 2017 年に、内容の異なる 2 つの PDF が同一のハッシュ値を持つ実例 (SHAttered) が公開された。整合性検証や署名では SHA-256 以降を選ぶ。逆に、攻撃者が入力を選べない重複検出やキャッシュキーのような用途で MD5 を使い続けることは誤りではない。
ハッシュ vs 暗号化
ハッシュと暗号化の違いを以下にまとめる。
| 観点 | ハッシュ | 暗号化 |
|---|---|---|
| 方向 | 一方向 (復元不可) | 双方向 (復号可能) |
| 用途 | 検証、パスワード | データの秘匿 |
| 鍵 | 不要 | 必要 |
実務での活用方法は関連書籍にも詳しい。
この記事は役に立ちましたか?
関連用語
コンシステントハッシュ
ノードの追加 / 削除時にデータの再配置を最小限に抑える分散ハッシュアルゴリズム
暗号化
データを第三者が読めない形式に変換し、機密性を保護する技術
ブルームフィルタとは - 仕組み / 偽陽性率の計算 / 実装例
ブルームフィルタは要素の存在判定を O(1) で行う確率的データ構造。偽陽性はあるが偽陰性がない特性を活かしたキャッシュ / スパム判定での活用法を解説
ハッシュテーブル
キーをハッシュ関数で変換し、平均 O(1) でデータを検索 / 挿入 / 削除するデータ構造
キャッシュ無効化とは - TTL / イベント駆動 / パージ戦略の比較
キャッシュ無効化は古くなったキャッシュデータを最新に更新する仕組み。TTL 方式 / Write-through / イベント駆動パージの使い分けと実装パターンを解説
HTTP キャッシュ
Cache-Control, ETag, Last-Modified を使った HTTP レベルのキャッシュ制御