如何在数据库中存储密码更安全?

2020-4-9

极客时间版权所有: https://time.geekbang.org/dailylesson/detail/100044031

密码有哪些泄漏的途径和场景?

密码数据流的角度来看

输入密码

  • 直接猜测
  • 暴力破解(高级猜测)

网络传输

  • 中间人攻击
    • 传输截取(钓鱼网站)

服务端

  • 系统服务漏洞
    • 脱库:黑客直接盗取整个数据库

脱库了之后,即时有密文存储也可能不安全,因为黑客有了修改数据库的权限,直接将你的密码密文替换掉,他就能登录你的账户了。

所以,简单的密码加密存储不能保证足够的安全。

如何防止密码被破解?

  • 严禁明文传输密码(客户端加密 + HTTPS/TLS 双重加密)
  • 数据库中严禁使用明文存储
  • 采用不可逆加密(无需解密)
    • 用户输入密码,进行相同的算法进行加密,只需比较加密后的密文就可以了
  • 密码尽可能复杂,尽可能定期修改密码
  • 安全机制,防止暴力破解(虽然密码破解目前很难,但是攻击者不停尝试也会给服务器带来很大压力)
    • 限定错误次数,添加验证码或者冻结账号
  • 采用业内已知的比较安全的加密算法

密码在数据库中如何存储?

密码加盐方案

盐:没有规律的随机字符串,使得存储的密码更加复杂,从而更难破解。

密文 = f(明文密码 + 盐)

盐越长越复杂,密文越安全。

盐是固定的,所以需要持久化保存,我们在数据库中要多一个字段来保存盐。

加盐解决了密码复杂性的问题。

密码加盐加账号信息方案

仅仅加盐还是没解决一个问题,就是脱库后黑客将密码+盐都替换为另一套密码+盐。

image-20200409105607834

问题就在于,加密的数据没有和账号关联,如果密码和账号是关联的,就可以解决这个问题。

所以我们继续加上账号唯一相关的字端,比如账号 ID 的若干位、手机号等等。

密文 = f(明文密码 + 盐 + 账号相关)

image-20200409105845858

总结

image-20200409105400647