提取与扩展解决不同问题
HKDF是常用的具体设计,先用Extract把输入材料处理成固定长度的伪随机密钥,再用Expand产生所需长度的输出。前一步处理输入分布不均等问题,后一步按用途生成材料;它们不是同一段摘要换个名字执行两次。
输入材料可能来自密钥交换,其表示未必已经是可直接用作对称密钥的均匀串。若本来已有合适的伪随机密钥,某些用法可只扩展;但能否省略提取依赖输入假设,不能见到输出长度足够就任意跳过。
参考:[1]
盐与用途标签承担不同角色
HKDF中的salt通常不需要保密,并可改善不同来源和使用之间的独立性;它不等于需要隐藏的输入密钥材料。Expand的info则绑定协议、算法、角色或其他上下文,帮助避免不同用途意外得到同一份密钥材料。
例如发送与接收方向、握手与应用阶段,可以使用不同且明确定义的标签。编码还须让这些标签不发生歧义;随意拼接字符串或只多要一些输出,并不能自动证明各用途已经安全分离。派生参数是协议设计的一部分。
派生长密钥不等于增强弱密码的熵
提取可以整理已有熵,不能把少量可猜测输入变成同等位数的不可猜测秘密。RFC 5869明确说明,HKDF没有专门放慢密码字典猜测的机制,因此不应把它直接视为适合所有密码存储或密码派生场景的替代品。
面向密码的设计还考虑盐和每次猜测的时间、内存成本。Argon2等内存困难函数提供可调内存、运行轮数与并行度参数;参数选择和系统资源约束必须一起评估。输出长度、输入熵和攻击者每次尝试的成本,是三个不同量。