加载中...
密码不应以明文或可逆加密存储,而应使用专为密码设计的慢速散列函数(bcrypt、Argon2、scrypt)结合随机盐值处理,使离线爆破的时间成本大幅提升,即使数据库泄露也能为用户争取更换密码的时间。

| OWASP 推荐首选 | Argon2id(2023 年推荐) |
| 历史教训 | 2012 年 LinkedIn 未加盐 SHA-1,数天内大部分破解 |
| 绝对禁止 | MD5、SHA-1 单独用于密码存储;明文存储;可逆加密 |
早期开发者用 MD5 或 SHA-1 存储密码,这些算法被设计为快速——这恰好是密码存储需要避免的特性。现代 GPU 每秒可计算数百亿次 MD5,即使有简单的彩虹表保护,6 位以内的密码几秒内即可破解。
2012 年 LinkedIn 数据库泄露 650 万密码哈希(未加盐 SHA-1),数天内大部分被破解公开,用户账号在其他平台被撞库,危害远超原始泄露范围。
正确方案是使用设计上就「故意慢速」的密码散列函数:
盐值(Salt)是每个密码独有的随机字符串,与密码一起散列,使相同密码产生不同的哈希值,彻底消除彩虹表的有效性,并使攻击者无法同时爆破大量账号(必须逐一爆破)。盐值无需保密,可以明文存储在数据库旁边。
胡椒(Pepper)是一个应用级别的全局密钥,不存入数据库,而是存入配置文件或密钥管理服务(HSM/KMS)。散列时把胡椒与密码组合。即使数据库全量泄露,没有胡椒攻击者也无法开始爆破。代价是胡椒轮换复杂(需要用户重新登录)。
bcrypt、scrypt、Argon2 等现代库都内置了盐值生成,不需要开发者手动处理——「自己实现密码散列」是高频错误来源。

| OWASP 推荐首选 | Argon2id(2023 年推荐) |
| 历史教训 | 2012 年 LinkedIn 未加盐 SHA-1,数天内大部分破解 |
| 绝对禁止 | MD5、SHA-1 单独用于密码存储;明文存储;可逆加密 |
登录 后参与讨论
暂无讨论,来发表第一条评论吧