kingapi

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

  •  
  •   kingapi · Jul 12, 2017 · 3188 views
    This topic created in 3231 days ago, the information mentioned may be changed or developed.

    假定短信验证码约定为 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 replies    2017-07-13 14:38:08 +08:00
    hobbyliu
        1
    hobbyliu  
       Jul 13, 2017 via Android
    学习了
    aec4d
        2
    aec4d  
       Jul 13, 2017
    在算法已知的情况下,用户不需要发送验证码即可根据 phone 和 T 算出验证码通过验证
    其次。暴力穷举,这里也没有限制用户尝试验证码的次数
    kingapi
        3
    kingapi  
    OP
       Jul 13, 2017
    @aec4d 一般会限制的。随意一个 6 位数成功验证的可能性为 1/1000000*5=1/200000,也就是暴力破解一个验证码平均需要 200000 次,这个远远超过了尝试次数。
    fiht
        4
    fiht  
       Jul 13, 2017 via iPhone
    1. 存在安全隐患:时间戳+手机号 md5 之后取六位,如#2 所说可以算出验证码通过验证。
    2. 新的思路相比旧的思路有和优点?解决了现有思路存在的哪些不足?
    kingapi
        5
    kingapi  
    OP
       Jul 13, 2017
    @fiht
    关于第一点:完全可以限制重试次数和加私钥参数算法来改进(除非私钥也泄露了)算法也不一定是 md5, 。
    关于第二点:优点,不用维护 redis 之类的 key 来存储 code,只需要一个简单的 lib 或者方法即可。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   6342 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 36ms · UTC 02:23 · PVG 10:23 · LAX 19:23 · JFK 22:23
    ♥ Do have faith in what you're doing.