0%

用户密码应该如何存储

风险一 用户数据库泄露导致用户密码泄露

风险二 网站管理人员、数据库管理员获取用户密码

如何安全的存储密码
要点如下

  • 加密(对称加密)存储无法防止风险二
  • 通用的以hash(单向散列算法如md5)获取的 digest(摘要)无法还原完整的原数据,但是存在rainbow table的隐患

rainbow table: 多数人所使用的密码为常见的组合,攻击者可以将所有密码的常见组合进行单向哈希,得到一个摘要组合, 然后与数据库中的摘要进行比对即可获得对应的密码(QQs理解的是,这里的密码或许与用户密码并不完全一致,但是可以通过网站的摘要核对)。这个摘要组合也被称为rainbow table。在当今计算机处理能力下,这种破译方式是可行而且可取的。

在线彩虹表

明文 摘要(32bit MD5)
111111 96e79218965eb72c92a549dd5a330112
123456 E10ADC3949BA59ABBE56E057F20F883E
000000 670b14728ad9902aecba32e22fa4f6bd
  • Salted Hash 改进的单项hash算法,明文密码混入“随机因素“,然后进行单向哈希后存储,其结果是rainbow table因salt不同而不同

    QQs按:做到这个份上,应该足够安全了,然而据说随着显卡并行计算能力的发展,存在破解出rainbow table的可能,我想可能是暴力破解salt。因此有了Salted Hash的各种改进方案

  • 慢哈希 如bcrypt,迭代执行多次hash运算,现实是增加了计算时间,使得暴力破解实际不可行

如设置 bcrypt 计算一次需要 0.5 秒,遍历 6 位的简单密码,需要的时间为:((26 * 2 + 10)^6) / 2 秒,约 900 年。

bcrypt

文章略老,基于以上原理,单向hash算法有了更多的发展