如何在数据库中存储密码更安全?
2020-4-9
极客时间版权所有: https://time.geekbang.org/dailylesson/detail/100044031
密码有哪些泄漏的途径和场景?
密码数据流的角度来看
输入密码
- 直接猜测
- 暴力破解(高级猜测)
网络传输
- 中间人攻击
- 传输截取(钓鱼网站)
服务端
- 系统服务漏洞
- 脱库:黑客直接盗取整个数据库
脱库了之后,即时有密文存储也可能不安全,因为黑客有了修改数据库的权限,直接将你的密码密文替换掉,他就能登录你的账户了。
所以,简单的密码加密存储不能保证足够的安全。
如何防止密码被破解?
- 严禁明文传输密码(客户端加密 + HTTPS/TLS 双重加密)
- 数据库中严禁使用明文存储
- 采用不可逆加密(无需解密)
- 用户输入密码,进行相同的算法进行加密,只需比较加密后的密文就可以了
- 密码尽可能复杂,尽可能定期修改密码
- 安全机制,防止暴力破解(虽然密码破解目前很难,但是攻击者不停尝试也会给服务器带来很大压力)
- 限定错误次数,添加验证码或者冻结账号
- 采用业内已知的比较安全的加密算法
密码在数据库中如何存储?
密码加盐方案
盐:没有规律的随机字符串,使得存储的密码更加复杂,从而更难破解。
密文 = f(明文密码 + 盐)
盐越长越复杂,密文越安全。
盐是固定的,所以需要持久化保存,我们在数据库中要多一个字段来保存盐。
加盐解决了密码复杂性的问题。
密码加盐加账号信息方案
仅仅加盐还是没解决一个问题,就是脱库后黑客将密码+盐都替换为另一套密码+盐。
问题就在于,加密的数据没有和账号关联,如果密码和账号是关联的,就可以解决这个问题。
所以我们继续加上账号唯一相关的字端,比如账号 ID 的若干位、手机号等等。
密文 = f(明文密码 + 盐 + 账号相关)
总结
← 算法 如何设计一个良好的 API 接口? →