V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
kingapi
V2EX  ›  分享发现

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

  •  
  •   kingapi · 2017-07-12 21:10:16 +08:00 · 2671 次点击
    这是一个创建于 2695 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    5 条回复    2017-07-13 14:38:08 +08:00
    hobbyliu
        1
    hobbyliu  
       2017-07-13 06:58:34 +08:00 via Android
    学习了
    aec4d
        2
    aec4d  
       2017-07-13 11:05:04 +08:00
    在算法已知的情况下,用户不需要发送验证码即可根据 phone 和 T 算出验证码通过验证
    其次。暴力穷举,这里也没有限制用户尝试验证码的次数
    kingapi
        3
    kingapi  
    OP
       2017-07-13 11:33:41 +08:00
    @aec4d 一般会限制的。随意一个 6 位数成功验证的可能性为 1/1000000*5=1/200000,也就是暴力破解一个验证码平均需要 200000 次,这个远远超过了尝试次数。
    fiht
        4
    fiht  
       2017-07-13 14:11:44 +08:00 via iPhone
    1. 存在安全隐患:时间戳+手机号 md5 之后取六位,如#2 所说可以算出验证码通过验证。
    2. 新的思路相比旧的思路有和优点?解决了现有思路存在的哪些不足?
    kingapi
        5
    kingapi  
    OP
       2017-07-13 14:38:08 +08:00
    @fiht
    关于第一点:完全可以限制重试次数和加私钥参数算法来改进(除非私钥也泄露了)算法也不一定是 md5, 。
    关于第二点:优点,不用维护 redis 之类的 key 来存储 code,只需要一个简单的 lib 或者方法即可。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1029 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 21:08 · PVG 05:08 · LAX 13:08 · JFK 16:08
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.