ハッシュ

任意のデータを固定長の値に変換する関数で、データの整合性検証や高速検索に使う

アルゴリズムセキュリティ

ハッシュとは

ハッシュは、任意のデータを固定長の値 (ハッシュ値) に変換する関数である。データの整合性検証、パスワードの保存、ハッシュテーブル (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 暗号化

観点 ハッシュ 暗号化
方向 一方向 (復元不可) 双方向 (復号可能)
用途 検証、パスワード データの秘匿
不要 必要

実務での活用方法は関連書籍にも詳しい。

関連用語