跳到主要内容
ecdsa.com

密码哈希

用一种刻意放慢、加盐、最好是内存困难型的函数(例如 Argon2id、scrypt、bcrypt 或 PBKDF2)的输出来存储密码,使被盗的数据库能够抵御离线猜测。
其他写法Argon2idbcryptscryptPBKDF2password hash

SHA-256 这样的快速哈希能让攻击者在 GPU 上每秒尝试数十亿次猜测。密码哈希为每个密码添加唯一的随机盐(使预计算表失效)和可调的成本参数。OWASP 的《密码存储备忘单》依次推荐:Argon2id(RFC 9106),至少 19 MiB 内存、2 次迭代、并行度 1;scrypt,N = 2¹⁷、r = 8、p = 1;bcrypt,工作因子不低于 10(它会把输入截断为 72 字节);在要求 FIPS 140 时,使用 PBKDF2-HMAC-SHA256,迭代次数至少 600,000 次。

把算法和参数与哈希一起存储(PHC 字符串格式 $argon2id$v=19$m=19456,t=2,p=1$…,bcrypt 的 $2b$10$…),以便日后提高成本,并在用户下次登录时升级旧哈希。可选的 pepper(胡椒值)是保存在数据库之外的秘密值,在只有数据库泄露时提供额外保护。

NIST SP 800-63B-4 要求以加盐并提高计算成本的方式存储密码;对于用作单一身份验证因素的密码,要求最少 15 个字符。通行密钥则彻底消除了服务器上存储的秘密:服务器只保存公钥。

标准与参考资料

全部术语