对于帐号来说,密码安全非常重要。现在很多C端采用短信验证/联合登录等方式弱化了固定密码的作用,无疑对登录安全性提供了很大的保障。但对于后台系统来说,基本还是采用传统帐号密码登录。密码安全分为存储安全和传输安全,本文主要讲述解决传输安全。
常规增强帐号密码登录安全性的方案:
-
加密密码本身
不传输明文密码,但被抓包可以直接重放请求,有无明文都无所谓 -
HTTPS
提升抓包解包的难度
其实对于数据安全的考虑都是加密数据,但如果加密后的数据也有价值可被利用,同样是不安全的。我们可以发现不管你如何加密数据,只要别人抓到你的请求数据包,再发一份,一样可以实现目的。
那我们如何来防止重放请求
- 简单一点对请求数据做一个标识存起来,重发的时候检查一遍,已经处理过就不处理。可行,但我们的缓存是有限的,不可能一直存着。
- 那反着来,由后端颁发唯一标识并短期缓存,前端请求带过来,检查标识存在则通过,之后再给标识删掉。
- 可攻击的人也可能去请求标识,并篡改到抓包的重放请求里。所以我们要把标识和他一定不知道的密码放在一起加密,这样便无法替换。
上面的设想说完了,下面开始介绍我的方案
- 前端点击登录时向后端请求获取
种子(标识)
-
种子
由3个部分构成:-
时间戳
可对种子校验设定有效期,过期请求直接拒绝 随机字符
-
校验位
由前两个元素计算得出
-
-
- 前端将种子与密码打包加密
- 调用后端登录
- 解密
- 校验
种子
的校验位
- 校验
种子
是否过期 - 校验请求是否存在
缓存
- 将请求缓存
- 业务逻辑。。。
说明
- 没有与设想中的一致,是不希望过期请求也要走缓存查询才知道。
-
缓存
有效期与种子
有效期一致。请求重放时,若在种子
有效期内缓存
校验会不通过,反之种子
有效期校验就过不了。 -
种子
最重要的就是时间戳,但前端的时间无意义,所以走后端获取。