形式陈述
口令验证系统保存记录
数据库被窃后,攻击者可以离线枚举候选w并检查
专用口令哈希对每次猜测设置成本。Argon2id的主要参数为内存m(KiB)、遍数t、并行lane数p和输出长度;其有效内存块数
直觉
盐把不同用户的同一猜测变成不同计算任务,减少跨账户预计算与一次计算覆盖多条记录的机会。慢哈希让每次验证更贵;内存难度让大规模并行猜测不仅消耗算力,也消耗内存或付出重算代价。三者职责不同。
快速密码哈希的抗碰撞并不是这里最直接的困难。攻击者不用找两个任意消息碰撞,只需猜出一个高概率的真实口令。HKDF也故意追求快速密钥派生,不包含这种限速资源。
例子与边界
假设100个账户都使用同一个无盐函数,攻击者为100万候选建一张表,一轮100万次计算就可与所有账户比较。采用不同盐后,若要对每个账户穷尽同一候选表,朴素成本变成1亿次计算;攻击者仍可以只挑一个弱账户,盐不会阻止针对它的100万次离线猜测。
公开且独立的S满足
举一个资源账本:每次诚实计算需要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种,即使均匀也至多
参数应随硬件与服务预算评估,并在记录里保存以便未来验证与迁移。成功登录后升级旧记录是一种迁移方式,但升级前必须验证旧口令,且不能在未知口令时直接从旧摘要恢复原口令。口令哈希保护被盗验证表的猜测成本,不替代传输加密、在线限速、多因素认证或会话安全。