密钥派生函数(KDF)
KDF 如何把低熵口令加盐、慢速、多次迭代地派生成密钥,抵抗暴力破解,以及 PBKDF2/Argon2 与 Bitwarden 的参数选择。
#type / concept
#status / growing
#tech / security / crypto
#resource / bitwarden
密钥派生函数(KDF)
一句话定义
密钥派生函数(KDF)把低熵的口令或密钥材料,经过加盐和大量重复计算,转换成固定长度、可直接用于加密的高强度密钥,并刻意让这个过程「慢」以抵抗暴力破解。
问题背景
人选的主密码熵很低,不能直接当 AES 密钥用。普通哈希(如 SHA-256)算一次极快,攻击者用 GPU/ASIC 每秒可试数十亿次。KDF 的目标就是:即便攻击者拿到密文和盐,也要为每一次口令猜测付出高昂的时间/内存代价。
核心机制
- 加盐(Salt):每个用户一个随机盐拼进输入,使相同口令产生不同结果,让预计算的彩虹表失效。
- 慢速与迭代(Work factor):重复计算成千上万次(iterations),把单次验证从纳秒级抬到几十~几百毫秒——对用户几乎无感,对逐个爆破的攻击者是巨大成本。
- 内存硬(Memory-hard):新一代 KDF 额外要求大量内存,削弱 GPU/ASIC 的并行优势。
常见算法
| 算法 | 特点 | 说明 |
|---|---|---|
| PBKDF2 | 迭代型,仅算力硬 | 老牌、兼容广,但对 GPU 抵抗弱,需靠高迭代数弥补 |
| bcrypt | 有一定内存占用 | 长期用于口令存储 |
| scrypt | 内存硬 | 可调内存成本 |
| Argon2(id) | 内存硬 + 抗侧信道 | 2015 密码哈希竞赛冠军,当前推荐 |
最小示例:Bitwarden 的主密钥派生
Bitwarden/Vaultwarden 用 KDF 从主密码派生「主密钥」(master key),再由它保护保险库密钥(见 zero-knowledge-encryption):
- 默认 PBKDF2-SHA256,迭代数默认 60 万次(客户端可调)。
- 可切换 Argon2id,配置三个参数:内存(如 64 MiB)、迭代(如 3)、并行度(如 4)。
参数越高越抗爆破,但登录/解锁越慢,且必须与最弱的客户端设备算力折中。
边界与常见误解
- KDF ≠ 加密,也 ≠ 普通哈希:它不保密数据,也不是为「快」设计;它是「为口令定制的、故意很慢的哈希」。
- 口令熵仍是上限:KDF 抬高单次成本,但救不了
123456——弱主密码再多迭代也能被破。 - 参数需随硬件升级:今天安全的迭代数,几年后可能偏低,需要定期上调。