Saltとは
Salt(ソルト)は、パスワードをハッシュ化する前に追加するランダムなデータです。各パスワードに一意のソルトを使用することで、以下の攻撃を防ぎます:
- レインボーテーブル攻撃:事前計算されたハッシュ辞書が無効化
- 同一パスワードの検出:同じパスワードでも異なるハッシュに
Saltの要件
- ランダム生成:暗号学的に安全な乱数生成器を使用
- 十分な長さ:最低16バイト(128ビット)以上
- 一意性:各パスワードに異なるソルト
- 保存:ハッシュと一緒に平文で保存(秘密である必要なし)
実装例
import os
import hashlib
# 悪い例:ソルトなし
bad_hash = hashlib.sha256(b"password").hexdigest()
# 同じパスワードは常に同じハッシュ → 危険
# 良い例:ソルトあり
salt = os.urandom(16) # 16バイトのランダムソルト
good_hash = hashlib.pbkdf2_hmac('sha256', b"password", salt, 100000)
# ソルトとハッシュを一緒に保存
stored = salt + good_hash
# さらに良い例:bcrypt(ソルト自動生成・保存)
import bcrypt
hash = bcrypt.hashpw(b"password", bcrypt.gensalt())
# $2b$12$... 形式でソルトが含まれる
Pepper vs Salt
- Salt:ハッシュと一緒に保存、公開可能
- Pepper:アプリケーション側で秘密に保持する追加の値
