PBKDF2
PBKDF2 用 PRF(通常 HMAC)对 password、salt 与 iteration count 进行重复派生,是广泛支持的 password-based KDF;其核心成本来自迭代次数而非 memory hardness,适合兼容/FIPS 生态但参数必须持续提高。
[!info] related notes
- 所属 MOC: 安全 MOC
- Password Storage: Password Storage & Verification
- Salt/Pepper: Salt vs Pepper
- 对比: Argon2id, bcrypt
- HMAC: HMAC
- 上位概念: Password-Based KDF
PBKDF2
一句话定义
PBKDF2 是标准 password-based KDF:
password + salt + iteration count + PRF → derived key
它的主要目标是:
让每一次 password guess 比普通 hash 更昂贵。
PRF
PBKDF2 内部使用 pseudorandom function。
现代常见:
HMAC-SHA-256
所以常看到:
PBKDF2-HMAC-SHA256
这不是“SHA-256 算 N 次”那么简单,而是标准化 HMAC-based construction。
Iteration Count
PBKDF2 的主要 work factor 是:
iteration count
iteration 越高:
- legit verification 越慢;
- attacker 每个 guess 也越慢。
但 PBKDF2 主要增加 CPU work,不像 Argon2id 那样显式增加 memory cost。
Salt
PBKDF2 同样需要 unique salt。
Salt:
- 和 verifier 一起存;
- 不需要 secret;
- 防止预计算;
- 防止相同 password 得到相同 verifier。
Output Length
PBKDF2 可以派生指定长度 output。
用于 password verification 时,output 长度应按标准/库默认和目标安全强度设置。
用于 encryption key derivation 时,还必须考虑:
- target key size;
- domain separation;
- protocol。
当前工程定位
OWASP 当前建议:
新系统优先 Argon2id。
如果:
- Argon2id 不可用;
- 特定 FIPS-140 validated implementation / compliance 要求;
PBKDF2 仍然是重要选择。
OWASP 当前给 PBKDF2-HMAC-SHA256 的基线是 600,000 iterations 或更高。
这个数字应理解为:
当前基线快照,不是永恒常数。
NIST 同样要求 cost factor 随计算能力提高而增长。
PBKDF2 vs Argon2id
PBKDF2:
- mature;
- ubiquitous;
- FIPS ecosystem;
- CPU-cost focused。
Argon2id:
- memory-hard;
- 更针对现代并行 cracking hardware。
所以选择不仅是“谁迭代次数更高”。
Password Verification
stored:
algorithm = PBKDF2-HMAC-SHA256
iterations = N
salt = S
hash = H
登录:
candidate password
- stored salt/iterations
→ PBKDF2
→ compare
不应该把 iteration count 写在代码常量里却不和 stored verifier version 绑定。
Derived Encryption Key
PBKDF2 也经常用于:
password
→ encryption key
例如老式 encrypted file/container。
这种场景与 password login verifier 的目标不同:
- login:yes/no;
- encryption:必须得到实际 key material。
Long Password DoS
某些低质量 PBKDF2/HMAC implementation 对超长 password 处理可能导致异常高成本。
成熟实现会做正确 pre-hashing。
应用层仍应避免无界输入导致资源滥用,但不要随意截断用户密码造成 entropy 损失。
Migration
PBKDF2 verifier 可以在登录成功后迁移:
old iteration
→ verify
→ new policy
→ rehash
或者:
PBKDF2
→ verify
→ Argon2id rehash
只要用户本次提供了正确 plaintext password。
常见错误
PBKDF2 = SHA256 循环
不准确。它是标准 PRF-based KDF。
iteration 数越大越好
还必须满足服务器 latency/concurrency budget。
所有用户一个 salt
错误。
FIPS 要求 PBKDF2,所以算法永远不用升级
错误。参数和规范仍会演进。
学习检查
- PBKDF2 的核心输入有哪些?
- iteration count 解决什么问题?
- PBKDF2-HMAC-SHA256 与直接重复 SHA-256 有什么不同?
- PBKDF2 与 Argon2id 的主要成本模型有什么差异?
- 为什么 600,000 iterations 只能理解成当前基线而不是永恒常数?
- verifier 为什么要保存 iteration count?
- PBKDF2 verifier 怎样渐进迁移到 Argon2id?