如何安全的存储用户密码?

wen 网络安全 2

如何安全存储用户密码?2024年最新最佳实践指南

目录导读

  1. 为什么密码存储是安全核心?
  2. 绝对不能做的存储方式(避坑指南)
  3. 科学密码存储五步法
  4. 主流哈希算法对比与选择
  5. 加盐(Salt)与胡椒(Pepper)技术详解
  6. 常见问答(Q&A)
  7. 合规性与未来趋势

如何安全的存储用户密码?

为什么密码存储是安全核心?

用户密码是数字身份的钥匙,据Verizon《数据泄露调查报告》显示,超过80%的数据泄露与弱密码或密码存储不当有关,一旦密码数据库被攻破,攻击者若获得明文密码,即可“撞库”攻击其他平台,造成连锁损失。

正确存储密码的目标:即使数据库被完全拖走,攻击者也无法还原出原始密码,无法用于登录。


绝对不能做的存储方式(避坑指南)

危险做法 为什么危险?
明文存储 数据库泄露 = 所有密码暴露
简单MD5/SHA1 彩虹表(预计算哈希表)可在秒级反查
自创“加密算法” 未经过密码学界审计,往往有致命漏洞
固定盐值 同密码产生相同哈希,可批量破解
无加盐哈希 相同密码哈希值相同,易被统计攻击

真实案例:2021年某社交平台因使用MD5+固定盐,导致1.5亿用户密码被破解,至今还有用户在暗网被兜售。


科学密码存储五步法

第一步:传输加密(HTTPS是底线)

密码在传送到服务器前,必须通过HTTPS/TLS加密,否则中间人攻击可直接获取密码。

第二步:服务端密码复杂度校验

前端校验不可信,服务端必须校验长度(≥8位)、包含字符类型,防止弱密码直接入库。

第三步:使用自适应哈希算法

推荐:bcryptscryptArgon2(OWASP推荐首选)。

第四步:生成唯一随机盐值

每个用户密码独立使用128位以上密码学安全随机数作盐。

第五步:迭代计算与存储

  • 算法内部自动迭代(bcrypt默认10轮约70ms)
  • 存储格式:$算法标识$参数$盐值$哈希值
    • $2y$10$abcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcd

主流哈希算法对比与选择

算法 抗GPU/ASIC 内存需求 推荐度 说明
Argon2id 极强 高(可调) 2015年起密码学竞赛冠军,OWASP首选
bcrypt 广泛使用,老项目成熟
scrypt 内存硬,适合资源充足场景
PBKDF2 可被GPU暴力加速,不推荐用于新项目
MD5/SHA-1 极低 ✘ 禁止使用 秒级破解

选择建议:新项目直接使用Argon2id(如PHP的password_hash支持argon2id),老项目若无法更换,至少升级到bcrypt。


加盐(Salt)与胡椒(Pepper)技术详解

加盐(Salt)

  • 作用:防止彩虹表预计算,使相同密码产生不同哈希。
  • 要求:每个用户独立,长度≥16字节,使用密码学安全随机数。
  • 存储:通常随哈希值一起存在数据库,如salt:hash格式。

胡椒(Pepper)

  • 作用:额外增加一层“系统全局秘密”,即使数据库泄露,攻击者拿不到Pepper也无法破解。
  • 存储:绝对不存储在数据库中,而是存在应用配置、环境变量或硬件安全模块(HSM)中。
  • 实现hash = bcrypt(pepper + password + salt)

实践注意:Pepper属于“通过隐蔽实现安全”,不能替代加盐;且当Pepper泄露时,安全等级降为无Pepper状态。


常见问答(Q&A)

Q1:为什么不能直接用SHA-256加盐?

SHA-256是通用哈希函数,设计目标是快速计算,密码存储需要慢哈希(故意拖慢计算速度),SHA-256在现代GPU上每秒可计算数十亿次,而bcrypt每秒仅几千次。

Q2:是否必须使用密码库?还是可以自己实现?

永远不要自己实现! 推荐使用成熟库:

  • PHP:password_hash() / password_verify()
  • Python:bcrypt / argon2-cffi
  • Java:Spring Security的BCryptPasswordEncoder
  • Node.js:bcryptargon2 npm包

Q3:如果密码数据库已泄露,该怎么办?

  1. 立即强制所有用户下次登录时修改密码
  2. 切换为更安全的哈希算法(如Argon2)
  3. 通知用户可能的风险,并建议在其他平台更换相同密码
  4. 启动安全审计,检查是否有横向移动痕迹

Q4:是否需要对密码进行对称加密存储?

不推荐,对称加密需要管理密钥,密钥泄露则所有密码暴露,哈希是非可逆的,安全性更高,只有极少数需要“恢复密码明文”的场景(如老系统)才用加密,且需使用AEAD算法+独立管理密钥。


合规性与未来趋势

合规要求

  • PCI DSS:支付卡行业要求密码使用强单向哈希(如bcrypt)。
  • GDPR:需采取适当技术措施保护个人数据,包括密码。
  • 等保2.0:中国等保要求密码存储符合国家密码管理局标准。

未来趋势

  • 无密码认证:WebAuthn/FIDO2正在兴起,密码本身将逐步被替代。
  • 服务器端自动升级:自动感知算法弱化,逐步迁移至更强算法(如首次登录时重新哈希)。
  • 后量子安全:随着量子计算发展,部分哈希算法(如SHA-256)面临威胁,Argon2等内存硬算法相对更抗量子攻击。

安全存储用户密码没有“银弹”,但有明确的科学路径,核心是:使用自适应慢哈希(Argon2id/bcrypt)+ 唯一随机盐值 + 严格的服务端校验,务必用成熟的密码学库实现,而不是自己造轮子,密码安全不是“写好就完事”,而是需要持续监控算法强度、定期评估迁移策略的持续过程。

行动清单:立即检查你的项目——是否使用了bcrypt/Arogon2?盐值是否独立随机?是否做了HTTPS传输加密?如果答不上来,请尽快修复。

抱歉,评论功能暂时关闭!