验证码由session存储对比改为hash算法进行验证

背景:我们的系统没有使用redis,所以在做验证码存储的时候一开始我选用了session,后来又考虑到集群环境下,session是不共享的,还得解决这个问题,于是就换掉了session,改为hash算法验证,验证码由有状态改为无状态

代码如下:

1.获取验证码,此时将验证码的图片的base64和code sm3hash过的值返回前端 

2.注册,在使用注册接口时,前端传递输入的code和获取验证码时接收的hash值

 这种方法虽然是能解决问题,但其实安全性也比较低,因为后端并没有存储这个hash值,假如通过强碰撞性攻击获取hash算法,前端即可随便传来一个伪造的hash值和code码,此时也能验过,但这个码并不是后端生成的

还有一些弊端

1.验证码一般是忽略大小写的,但是如果是做hash操作的话,大写和小写的hash值不同,所以是匹配不了的而且hash过的值具有单向性,也就是无法解开

2.验证码有效期,因为现在没存验证码,所以这个生成的时间也是没存的,所以想了两种方案

第一种,在生成码的同时,对code码和当前时间做hash操作,若时间为一分钟,则对2021.11.2.14.33 + code做hash,等验证的时候,还取当前时间,如果时间超过一分钟,则hash值是验不过的,也可以实现,但是这样是没办法区分是真的过期还是验证码输错了

第二种,在生成码的同时,对当前时间戳做加密操作,然后追加到hash值之后,返回前端,等前端再次传过来的时候就可以解析到之前的时间戳,与当前时间戳对比就能判断出是否是过期,这就很好的将过期和验证码错误区分开了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值