假定短信验证码约定为 6 位数字。
##一般思路
生成阶段:用户点获取验证码,程序会生成 6 位的 rand(0, 9)数字,存储在 redis key_phone 设置 2 分钟过期,并发送到用户 phone
校验阶段:用户发送请求 phone+code , 直接找 redis key_phone 强校验 value. 通过则校验通过
##新的思路
生成阶段:用户点获取验证码,程序根据用户 phone 和时间戳 T,md5 一下,截取中间 6 位根据 map 字典生成 6 位数字,并发送到用户 phone 校验阶段:用户发送请求 phone+code+T,(注意:T 是上次请求的时间错,time 是本次请求的时间戳),程序根据用户 phone 和 T,md5 一下,截取中间 6 位根据 map 字典生成 6 位数字 code_new,code == code_new && (time - T) < 2min ? 校验通过: 校验失败。
1
hobbyliu 2017-07-13 06:58:34 +08:00 via Android
学习了
|
2
aec4d 2017-07-13 11:05:04 +08:00
在算法已知的情况下,用户不需要发送验证码即可根据 phone 和 T 算出验证码通过验证
其次。暴力穷举,这里也没有限制用户尝试验证码的次数 |
3
kingapi OP @aec4d 一般会限制的。随意一个 6 位数成功验证的可能性为 1/1000000*5=1/200000,也就是暴力破解一个验证码平均需要 200000 次,这个远远超过了尝试次数。
|
4
fiht 2017-07-13 14:11:44 +08:00 via iPhone
1. 存在安全隐患:时间戳+手机号 md5 之后取六位,如#2 所说可以算出验证码通过验证。
2. 新的思路相比旧的思路有和优点?解决了现有思路存在的哪些不足? |