数据库设计之账号密码防暴破、防“脱裤”和防撞库

起因如初,一般人觉得使用MD5加密用户的密码足矣。

实则,此言差矣,时至今日,尚还很多人觉得MD5加密很靠谱。无奈.jpeg ~

本文章描述数据库设计里边,我们是怎么做到账号密码防暴破、防“脱裤”和防撞库的。

一、简单加密

实现方式

使用简单的加密算法,如md5(pass), md5(md5(pass)), sha1(pass)

1
2
$ echo -n 'hello' | md5sum
5d41402abc4b2a76b9719d911017c592

数据库字段password,直接存储md5(passwd)

存在的问题

二、较复杂加密

实现方法

SHA256SUM(passwd)的结果直接存储数据库
破解难度较大,一般直接对这个进行破解是很难的

存在问题

这就没问题了吗?其实并不是!
只要数据库中存在相同密码的,一眼就被认出,没办法防止彩虹表等攻击手段。

三、随机盐值——防暴、防脱

实现方法

  • 创建用户同时,创建一个随机盐值,存放于数据库salt字段
  • 重置用户密码时,更新盐值
  • SHA256SUM(passwd + salt)存放于数据库的password字段
  • 校验步骤
    • 从数据库取出此用户的盐值
    • 计算 sha256sum(passwd+salt)
    • 结果与数据库的password字段结果进行匹配

提示:“颜值”一定要高,最好不低于128位! 不要忘记了,重置密码时,也要重刷“颜值”!

达到的效果

  • sha256sum的破解难度很大
  • 防彩虹表攻击
  • 即使“脱裤”,也无法大规模破解用户的密码

四、防撞库

实现思路

“撞库”的含义是指,用户的账号密码,在别的平台上泄露了,被黑客拿来在我们的平台上去尝试进行登录的一种攻击手段。

每个系统,它们的防撞设计应该有所不同,我们目前的思路如下:

  • 记录用户PC端IP地址
  • 记录用户移动端常用的设备信息
  • 当用户的这些信息发生改变之后,需要短信验证码

PS: 一定要短信认证码,这个才是最有效的防撞手段,那些图形认证码的没什么用。

同时要配合一些限制策略:

  • 限制单个尝试次数
  • 限制单个IP登录次数

参考链接

  1. 加盐密码哈希:如何正确使用(必看)
  2. 加盐密码保存的最通用方法是?(选看,但不要被误导)