密码必须经慢速、加盐的专用哈希算法处理后存储,推荐 Argon2id(内存困难型,抗 GPU/ASIC),其次 bcrypt(cost ≥ 12)或 PBKDF2(迭代 60 万次以上)。每用户使用独立随机盐(16 字节以上),盐与哈希一起明文存储即可——盐的作用是防彩虹表批量预计算,不要求保密。

MD5/SHA-256 即使加盐也不合格:它们是快速哈希,现代 GPU 每秒可尝试数百亿次,弱口令秒破。专用算法的核心是可调节的"工作因子"——bcrypt 的迭代次数、Argon2 的内存占用,让单次验证对服务器可接受(~100ms),对攻击者代价极高。

from argon2 import PasswordHasher
ph = PasswordHasher()  # 默认 Argon2id
hash = ph.hash(password)   # 存储
ph.verify(hash, password)  # 校验

补充:可加服务端"胡椒"(pepper,存 KMS/HSM 不进库)防拖库后离线爆破;登录接口要限流防在线撞库。追问方向:撞库与拖库区别、参数升级如何迁移重哈希。