数据库设计之账号密码防暴破、防“脱裤”和防撞库
起因如初,一般人觉得使用MD5加密用户的密码足矣。
实则,此言差矣,时至今日,尚还很多人觉得MD5加密很靠谱。无奈.jpeg ~
本文章描述数据库设计里边,我们是怎么做到账号密码防暴破、防“脱裤”和防撞库的。
一、简单加密
实现方式
使用简单的加密算法,如md5(pass)
, md5(md5(pass))
, sha1(pass)
…
|
|
数据库字段password
,直接存储md5(passwd)
存在的问题
- 加密算法较弱
- 使用https://www.cmd5.com/ 类似的网站,很容易破解出密码
二、较复杂加密
实现方法
将SHA256SUM(passwd)
的结果直接存储数据库
破解难度较大,一般直接对这个进行破解是很难的
存在问题
这就没问题了吗?其实并不是! 只要数据库中存在相同密码的,一眼就被认出,没办法防止彩虹表等攻击手段。
三、随机盐值——防暴、防脱
实现方法
- 创建用户同时,创建一个随机盐值,存放于数据库
salt
字段 - 重置用户密码时,更新盐值
- 将
SHA256SUM(passwd + salt)
存放于数据库的password
字段 - 校验步骤
- 从数据库取出此用户的盐值
- 计算
sha256sum(passwd+salt)
- 结果与数据库的
password
字段结果进行匹配
提示:“颜值”一定要高,最好不低于128位! 不要忘记了,重置密码时,也要重刷“颜值”!
达到的效果
- sha256sum的破解难度很大
- 防彩虹表攻击
- 即使“脱裤”,也无法大规模破解用户的密码
四、防撞库
实现思路
“撞库”的含义是指,用户的账号密码,在别的平台上泄露了,被黑客拿来在我们的平台上去尝试进行登录的一种攻击手段。
每个系统,它们的防撞设计应该有所不同,我们目前的思路如下:
- 记录用户PC端IP地址
- 记录用户移动端常用的设备信息
- 当用户的这些信息发生改变之后,需要短信验证码
PS: 一定要短信认证码,这个才是最有效的防撞手段,那些图形认证码的没什么用。
同时要配合一些限制策略:
- 限制单个尝试次数
- 限制单个IP登录次数