标准答案
- 优先使用 Argon2id、bcrypt、scrypt 或平台提供的成熟密码哈希实现,并为每个密码使用独立随机盐。
- 密码哈希参数应足够慢以提高离线撞库成本,同时根据生产硬件和登录峰值评估延迟;参数可随着硬件升级逐步提高。
- 可选的 pepper 应保存在独立的密钥管理系统中,不应和数据库备份放在一起。
- 登录时使用库函数验证哈希,成功后可在参数过旧时重新哈希;密码重置和修改要使旧会话或高风险令牌失效。
- 还要配合登录限流、MFA、泄露密码检测、传输加密和日志脱敏,单靠密码哈希不能覆盖所有账号风险。
题目解析
快速哈希适合完整性校验,不适合密码。攻击者拿到哈希库后可以高速并行猜测,慢速内存硬算法会显著提高攻击成本。
可逆加密意味着持有密钥的一方能还原用户密码,这既扩大泄露面,也不符合服务端通常只需要验证、不需要知道明文的原则。
常见误区
- 使用 MD5、SHA-256 或固定盐保存密码。
- 把密码加密后存库,并把解密密钥与数据放在同一环境变量中。
- 认为 HTTPS 已经足够,所以数据库中可以保存明文或快速哈希。