一种另类短信验证码验证机制

2017-07-12 21:10:16 +08:00
 kingapi

假定短信验证码约定为 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 ? 校验通过: 校验失败。

2687 次点击
所在节点    分享发现
5 条回复
hobbyliu
2017-07-13 06:58:34 +08:00
学习了
aec4d
2017-07-13 11:05:04 +08:00
在算法已知的情况下,用户不需要发送验证码即可根据 phone 和 T 算出验证码通过验证
其次。暴力穷举,这里也没有限制用户尝试验证码的次数
kingapi
2017-07-13 11:33:41 +08:00
@aec4d 一般会限制的。随意一个 6 位数成功验证的可能性为 1/1000000*5=1/200000,也就是暴力破解一个验证码平均需要 200000 次,这个远远超过了尝试次数。
fiht
2017-07-13 14:11:44 +08:00
1. 存在安全隐患:时间戳+手机号 md5 之后取六位,如#2 所说可以算出验证码通过验证。
2. 新的思路相比旧的思路有和优点?解决了现有思路存在的哪些不足?
kingapi
2017-07-13 14:38:08 +08:00
@fiht
关于第一点:完全可以限制重试次数和加私钥参数算法来改进(除非私钥也泄露了)算法也不一定是 md5, 。
关于第二点:优点,不用维护 redis 之类的 key 来存储 code,只需要一个简单的 lib 或者方法即可。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/374883

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX