同一口令可形成不同记录

若口令、算法和所有参数都相同,确定性验证通常得到相同结果。给不同记录使用不同盐,可以让同一口令在相同方案下产生不同验证值,使一次预计算不容易直接复用于许多账户。

验证时仍要取回与记录对应的盐并按相同约定处理。把盐遗失后临时换一个新值,通常无法继续验证原记录;因此实际存储常同时保存盐、结果以及算法和成本信息,而不是只留最后一串摘要。

参考:[1]

不保密不等于可以忽略生成规则

盐通常随验证结果保存,安全设计不应要求攻击者永远看不到它。NIST密码指南要求选择盐时减少记录间碰撞;若所有账户固定使用同一常量,就失去了按记录分离的重要作用,不能只因字段名叫salt就视为已正确加盐。

额外秘密通常另称验证者秘密或pepper等,需独立保护。若把它与所有验证记录放在同一处并一起泄露,就不能指望仍然获得“攻击者缺少这一秘密”的保护;它与盐承担的是不同假设。

参考:[1]

派生函数里的盐又有自己的约定

HKDF也使用salt,帮助输入提取与不同使用之间的独立性;RFC 5869允许在没有可用盐时按规定处理,也允许某些盐重复使用。不能把密码数据库每条记录尽量不同的要求,直接当成所有名为salt的接口都必须满足的同一规则。

同样,加盐不会放慢所有猜测到足以抵抗攻击,也不创造原本不存在的秘密熵。密码哈希还要考虑成本参数,密钥派生则要考察输入材料和用途;判断保护效果需要看构造,而不是只统计是否出现了盐字段。

参考:[1] [2]