口令存储是什么问题
口令存储指系统如何保存用户登录凭据。正确做法是只存不可逆的派生值:为每个用户生成随机盐,选用 PBKDF2、bcrypt、scrypt 或 Argon2 这类可调计算成本的慢哈希,把盐与结果一起存储。这样即使数据库被拖走,攻击者也难以批量还原明文口令。
基本信息
| 原则 | 不可逆、每用户独立随机盐、计算成本可调 |
|---|---|
| 推荐算法 | PBKDF2、bcrypt、scrypt、Argon2(按合规与依赖条件选择) |
| 参数方向 | 迭代次数或内存成本随硬件升级定期上调 |
| 禁止做法 | 明文、可逆加密、MD5/SHA1 裸哈希、全库共用同一盐 |
| 存储内容 | 算法标识 + 参数 + 盐 + 派生值,便于后续平滑升级 |
| 参考 | OWASP 密码存储备忘单 |
典型使用场景
- 新系统设计数据库表结构时确定凭据字段的存储形式
- 存量系统改造,把老哈希在用户下次登录时透明升级为新算法
- 等保与个人信息合规检查中说明鉴别信息保护措施
- 代码审计时排查是否使用 MD5 或可逆加密保存口令
- 运维侧与应用侧口令分离管理,禁止共用同一口令
PBKDF2 示例
PBKDF2 示例
import os, hashlib, base64
salt = os.urandom(16)
dk = hashlib.pbkdf2_hmac('sha256', b'user-password', salt, 600000)
store = base64.b64encode(salt + dk) # 存储 salt+dk,不存明文
# 迭代次数取行业建议量级,并随硬件升级与安全评估调整
# 校验时用同一盐重新派生,再做定长比较(避免时序泄露)存储方式对照
| 存储方式 | 风险 | 结论 |
|---|---|---|
| 明文或可逆加密 | 库被读取即可直接获得全部口令 | 禁止使用 |
| MD5 / SHA1 裸哈希 | 彩虹表与 GPU 暴力破解成本极低 | 禁止使用 |
| 固定盐哈希 | 同口令用户哈希相同,一次破解批量命中 | 不可接受 |
| PBKDF2 高迭代 | 需大量计算才能尝试单一口令 | 推荐 |
| Argon2 等内存硬算法 | 抗 GPU 与 ASIC 能力更强 | 优先推荐 |
参考 OWASP 密码存储备忘单:PBKDF2-HMAC-SHA256 建议数十万次迭代量级;在合规允许范围内优先选用抗 GPU 的 Argon2 类算法,并把参数写入配置便于统一调整。
算法升级的平滑路径:存储结构中带算法与参数标识,用户登录成功时用新算法重新派生并覆盖旧值,无需强制全员改密。