密钥派生函数Key Derivation Function, KDF)是从共享秘密、用户密码或主密钥中派生出一个或多个可用密钥的密码学函数。

核心问题

协议里得到的原始秘密通常不能直接拿来加密数据。它可能长度不合适、分布不均匀、需要拆成多个方向密钥,或者来自用户密码这种低熵输入。KDF 解决的是“如何把原始秘密转换成适合具体用途的密钥材料”的问题。

核心机制

KDF 通常做三件事:

  • 提取:从可能不均匀的输入中提取伪随机密钥材料。
  • 扩展:生成一个或多个长度合适的密钥。
  • 绑定上下文:把协议版本、双方身份、用途标签、salt 或 transcript 纳入派生过程。

例如 密钥交换 得到共享秘密后,协议会通过 KDF 派生客户端发送密钥、服务端发送密钥、认证密钥等不同用途的密钥。用户密码场景则常用带 salt 和成本参数的密码 KDF,如 Argon2、scrypt、PBKDF2。

工程用途

  • 会话密钥派生:从握手共享秘密派生加密密钥和认证密钥。
  • 密码存储:把用户密码转换成难以离线破解的验证材料。
  • 主密钥分层:从根密钥派生数据密钥、文件密钥或租户密钥。
  • 用途隔离:同一原始秘密为不同算法、方向和上下文生成不同密钥。

边界与常见坑

  • KDF 不是加密算法:它产出密钥材料,不直接保护明文。
  • 不要直接哈希密码当密钥:普通哈希太快,缺少抗暴力破解成本。
  • salt 不是秘密:salt 用来防预计算和 彩虹表,不承担密钥保密职责。
  • 上下文标签不能省:不同用途复用同一派生输出会破坏隔离。
  • 参数需要迁移策略:密码 KDF 的迭代次数、内存成本和并行度需要随硬件变化升级。

相关术语