密钥派生函数(KDF)

KDF 如何把低熵口令加盐、慢速、多次迭代地派生成密钥,抵抗暴力破解,以及 PBKDF2/Argon2 与 Bitwarden 的参数选择。

#type / concept #status / growing #tech / security / crypto #resource / bitwarden

密钥派生函数(KDF)

[!info] related notes 哈希摘要 零知识加密架构 对称密码学 Bitwarden

一句话定义

密钥派生函数(KDF)把低熵的口令或密钥材料,经过加盐和大量重复计算,转换成固定长度、可直接用于加密的高强度密钥,并刻意让这个过程「慢」以抵抗暴力破解。

问题背景

人选的主密码熵很低,不能直接当 AES 密钥用。普通哈希(如 SHA-256)算一次极快,攻击者用 GPU/ASIC 每秒可试数十亿次。KDF 的目标就是:即便攻击者拿到密文和盐,也要为每一次口令猜测付出高昂的时间/内存代价。

核心机制

  1. 加盐(Salt):每个用户一个随机盐拼进输入,使相同口令产生不同结果,让预计算的彩虹表失效。
  2. 慢速与迭代(Work factor):重复计算成千上万次(iterations),把单次验证从纳秒级抬到几十~几百毫秒——对用户几乎无感,对逐个爆破的攻击者是巨大成本。
  3. 内存硬(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——弱主密码再多迭代也能被破。
  • 参数需随硬件升级:今天安全的迭代数,几年后可能偏低,需要定期上调。
创建于 2026/7/11 更新于 2026/7/15