密码学
盐(Salt)
别称: 密码学盐, 口令盐
定义
在口令哈希之前与之拼接的唯一随机值,用于抵御彩虹表并使每个用户的哈希都不同。
密码学盐是一段不需要保密的随机值,在将口令送入 Argon2、scrypt、bcrypt 或 PBKDF2 等哈希函数或 KDF 前与之混合。盐让使用相同口令的两个用户最终得到不同的存储哈希,从而粉碎预计算彩虹表,并迫使大规模攻击只能逐用户线性进行。它至少应当 16 字节,使用密码学安全的 RNG 生成,每个凭证唯一,并与哈希一起存储;它本身无需保密。现代口令哈希格式(PHC 字符串,如 $argon2id$...、$2b$...、$scrypt$...)会直接内嵌盐。HKDF 与某些随机化的公钥加密方案也使用盐来实现同样的多样化目的。
示例
- 形如 $argon2id$v=19$m=65536,t=3,p=1$<base64-盐>$<base64-哈希> 的 Argon2id 哈希。
- 每个用户在注册时生成的唯一 16 字节随机盐。
相关术语
胡椒(Pepper)
服务端持有的一段秘密,在口令哈希之前与每个口令拼接,与数据库分开存储,用于在哈希泄露后缓解离线破解风险。
密钥派生函数(KDF)
从口令、共享密钥或主密钥等秘密素材派生出一个或多个强加密密钥的密码学函数。
Argon2
现代的内存密集型口令哈希与密钥派生函数,在 2015 年口令哈希竞赛中胜出,并由 RFC 9106 标准化。
bcrypt
基于 Blowfish 密钥编排、带可调成本参数的自适应口令哈希函数,由 Provos 与 Mazières 于 1999 年提出。
彩虹表攻击
一种预计算攻击,通过把哈希函数与归约函数交替形成的链以紧凑表格存储,从而能远比暴力破解更快地反推未加盐的密码哈希。
密码学哈希函数
将任意长度输入映射为固定长度摘要的确定性单向函数,具备抗碰撞、抗原像和抗第二原像三大安全性质。