如何使用PHP和MySQL在数据库中安全存储密码?
数据库密码安全存储的最佳实践与推荐算法
核心原则:永远不要存储明文密码
明文存储密码一旦数据库泄露,所有用户账号都会直接暴露风险,必须用**单向哈希(不可逆)**的方式处理密码后再存储。
最佳存储方式
- 必须使用带随机盐值(Salt)的哈希算法
- 盐值是随机生成的一串字符串,和密码拼接后再哈希,避免相同密码生成相同哈希值,防止彩虹表攻击
- 每个用户的盐值要独立存储(和哈希后的密码存在同一条用户记录里即可)
- 选用慢哈希算法
- 不同于MD5、SHA-1这类快速哈希,慢哈希算法故意设计成计算耗时的,大幅增加暴力破解的成本
- 不要自己实现加密逻辑
- 直接使用语言或框架自带的成熟密码哈希库,避免手动实现出现安全漏洞
推荐的最优加密算法
- Argon2:目前密码哈希的标准,是2015年Password Hashing Competition的获胜者,能自适应调整内存、CPU和时间开销,抵御各类硬件加速的破解攻击,优先推荐
- bcrypt:经过多年验证的经典算法,基于Blowfish加密算法,支持调整计算成本(work factor),兼容性好,适合大多数场景
- PBKDF2:由NIST推荐的算法,通过多次迭代哈希来增加破解难度,在一些旧系统中依然广泛使用,安全性也有保障
示例(以Python为例)
使用passlib库处理Argon2哈希:
from passlib.context import CryptContext pwd_context = CryptContext(schemes=["argon2"], deprecated="auto") # 生成哈希密码(自动生成盐值) hashed_password = pwd_context.hash("user_input_password") # 验证密码 is_valid = pwd_context.verify("user_input_password", hashed_password)
额外注意事项
- 不要对哈希后的密码再进行加密(比如AES对称加密),单向哈希已经足够,加密反而可能引入额外风险
- 定期更新哈希算法的参数(比如增加work factor),随着硬件性能提升,调整计算成本来保持破解难度
- 禁止将密码的哈希值作为用户的找回凭证,密码找回流程要通过独立的验证渠道(比如邮箱、短信验证码)
内容的提问来源于stack exchange,提问作者Sathiskumar S
相关产品推荐
相关产品推荐

