Skip to content

方法Method

口令哈希、公开盐与内存成本

Password hashing and salt · Memory-hard password verification

定义被盗验证表下的离线猜测,分开公开盐、每猜测时间和内存难度,以Argon2id参数与标准向量检查可复算接口。

形式陈述 ​

口令验证系统保存记录 (alg,version,params,salt,v),其中 v=PH(password,salt;params)。验证时按记录中的算法与参数重算候选并比较,服务端还须限制允许参数范围,避免攻击者借极大内存参数耗尽资源。公开盐salt应独立生成,通常每条记录各不相同;它随验证值保存,不是额外秘密。

数据库被窃后,攻击者可以离线枚举候选w并检查 PH(w,salt;params)=v,不再经过网站限速。在本页的字典模型中,攻击者按先验排序,仅以候选是否等于真实口令作为成功条件,不利用额外结构或旁信息;暂忽略验证值碰撞。若按概率降序的口令分布为 p1,p2,…,允许q次不同猜测时的最佳成功率是 ∑i=1qpi。最小熵给出的单点界 pi≤2−k 只推出 q2−k 的通用上界;人类口令分布通常不均匀,不能直接用字符串长度估算k。

专用口令哈希对每次猜测设置成本。Argon2id的主要参数为内存m(KiB)、遍数t、并行lane数p和输出长度;其有效内存块数 m′=4p⌊m/(4p)⌋,每块1024字节,且m须至少8p。协议还固定版本及字节编码。Argon2id首遍前半部分采用数据无关访存,其余部分采用数据相关访存;本页使用RFC9106的算法,不自造“慢循环”替代它。

直觉

盐把不同用户的同一猜测变成不同计算任务,减少跨账户预计算与一次计算覆盖多条记录的机会。慢哈希让每次验证更贵;内存难度让大规模并行猜测不仅消耗算力,也消耗内存或付出重算代价。三者职责不同。

快速密码哈希的抗碰撞并不是这里最直接的困难。攻击者不用找两个任意消息碰撞,只需猜出一个高概率的真实口令。HKDF也故意追求快速密钥派生,不包含这种限速资源。

例子与边界

假设100个账户都使用同一个无盐函数,攻击者为100万候选建一张表,一轮100万次计算就可与所有账户比较。采用不同盐后,若要对每个账户穷尽同一候选表,朴素成本变成1亿次计算;攻击者仍可以只挑一个弱账户,盐不会阻止针对它的100万次离线猜测。

公开且独立的S满足 P(W=w∣S=s)=P(W=w),所以 H∞(W∣S=s)=H∞(W)。盐没有提高用户口令本身的熵。若独立均匀128-bit盐用于N条记录,任意盐碰撞的概率至多 N(N−1)/2129;这解释了盐长度与账户规模的关系,而不是把碰撞说成绝不可能。

举一个资源账本:每次诚实计算需要64 MiB,攻击者有1 GiB可用内存,忽略额外开销时,按这一路径至多同时驻留16份工作区。这不是攻击下界;攻击者可能用更少内存重算、采用不同硬件或算法优化,真正的memory-hard主张要分析时间—空间折衷。遍数、延迟和能耗也不能仅靠内存乘法预测。

RFC9106 §5.3的可复算向量使用32 KiB、3遍、4 lanes、32字节输出;password为32个 01,salt为16个 02,额外secret为8个 03,associated data为12个 04。结果是

0d640df58d78766c08c037a34a8b53c9d01ef0452d75b65eb52520e96b01e659。

检查器用已安装cryptography的Argon2id实际复算。32 KiB是标准算法测试参数,不是部署建议。额外secret字段在这个公开向量中也不秘密;生产中若采用独立保存的pepper,必须另定义泄漏模型与恢复策略,不能称它为普通公开盐。

推论与应用

输出256-bit验证值不意味着原口令有256-bit安全性。若候选只有1000种,即使均匀也至多 log2⁡1000≈9.97 bit最小熵,1000次离线验证就可穷尽;加长输出无法修复这一点。

参数应随硬件与服务预算评估,并在记录里保存以便未来验证与迁移。成功登录后升级旧记录是一种迁移方式,但升级前必须验证旧口令,且不能在未知口令时直接从旧摘要恢复原口令。口令哈希保护被盗验证表的猜测成本,不替代传输加密、在线限速、多因素认证或会话安全。

参考资料
  • Biryukov等,RFC 9106,§§3.1–3.2:Argon2参数与内存;§5.3:Argon2id向量;§7:时间—内存折衷与安全考虑
  • Dan Boneh、Victor Shoup,作者教材v0.6,§18.3.1、§§18.4.1–18.4.4:字典猜测、公开盐、慢哈希和内存困难计算
关系图谱3 个相邻概念 · 1 类关系

拖动节点调整位置。

显示关系

显示:依赖

  1. 前置三跳
  2. 前置二跳
  3. 前置一跳
  4. 当前条目
  5. 后续一跳
  6. 后续二跳
  7. 后续三跳
文字版关系按与当前条目的最短距离分组