互联网和产品 · 2018年07月9号 0

短信验证码的深度剖析

一、短信验证码运作机制

1. 验证码加密发送

  1. 在APP中点击发送验证码,向后台发送一个发送验证码请求;
  2. 后台收到请求,生成一个验证码A,并反编译成短信验证码A‘;
  3. 请求短信服务商发送短信验证码A’至用户手机,同时存储验证码A至后台数据库中;

注:出于安全性考虑,后台数据库只能查看验证码A,无法查看短信验证码A‘。

2. 验证码解密验证

  1. 用户收到短信验证码A’,填写至APP中,点击注册,向后台发送验证验证码请求并提交短信验证码;
  2. 后台收到请求后后反编译短信验证码A‘,验证反编译之后的结果是否是验证码A,是则验证码成功,此次用户注册申请成功,否则验证失败,反馈给APP,此次注册申请不成功。

产品经理只需要理解成为——“我们有一个密件,你用我短信传给你的暗号打开密件,然后把里面的东西交给我,我就把你要的东西给你”。

二、破解验证码A、短信验证码A‘原理

在这样的一个机制下,而且需要验证码不过于复杂,会出现两种比较常见的对用户账户的安全性造成威胁的情况:

(1)暴力破解短信验证码A’

假设短信验证码A’只有四位,暴力破解只需要模拟调取接口10000次就能够把短信验证码A‘破解出来。假设调取一次接口耗时0.1秒,那么1000秒就能够成功破解验证码A’,即只有短短的1000/60=16.67分钟。

(2)暴力破解验证码A

截取数据库的数据包拿到验证码A,对验证码A执行暴力破解,反推出短信验证码A‘,相比直接暴力破解短信验证码A’,时间会有点长,但可以减少验证次数。

三、短信验证码未加防护存在的风险

当黑客发现某个未加防护的短信发送接口后,按照某个手机号码列表,循环发送短信验证码,不断变换ip地址,如果我们没有做任何限制的话,会存在两个方面的风险:

  1. 公司可能损失数以万计甚至更高的短信费用,发送验证码是需要向运营商付费,如果发出的短信大多数都是没有用的话,用户注册量越大资金支出越大,将让公司在这一块遭受不必要的损失;
  2. 流量攻击,用户无法登陆、注册;大批量的请求发送验证码,会导致访问流量大增,有可能使得发送验证码的数据接口瘫痪,用户无法继续使用该功能(造成用户无法登陆、注册),必定会收到用户的投诉,公司形象也会受损。

四、应对策略

为了防止黑客恶意刷取目标网站短信验证码,使用对短信发送次数、短信发送时间间隔进行限制以及发送之前增加动态验证。

(1)手机号获取短信验证码次数限制是其中一种防攻击策略,不过在设计这方面内容时,需要根据自己公司的业务情况具体制定的。

需要回答3个问题:

  1. 根据业务需要,短信验证码发送次数设置的上限为多少合适?单次短信验证码填写错误的次数?
  2. 一般超过这个上限,我们需要锁定用户手机号多长时间?6小时,12小时,还是24小时?
  3. 锁定用户手机号后,我们可以为用户提供的后续方案是什么?需不需要提示对方,让他打电话给客服,自己主动申请解锁?走邮箱的验证方式、增加语音验证码也是一种可行的解决方案。

(2)设置短信发送时间间隔是其中的一种防攻击策略,为了防止用户重复获取验证码,一般设置60s左右的间隔获取时间,但验证码的有效期一般是5-30分钟不等。一般来说,5分钟有效的都是4位验证码,30分钟有效的都是6位验证码。不过这方面手段不能防止黑客更换手机号进行攻击,防护等级较低。

(3)发送验证码之前需要填写一次验证码,不过此种传统的方式利用机器学习的知识很容易破解。另外可以增加滑块拼图这种需要人为干预的动态验证。

至于如何研究这一块,各位可以看一下各大手机银行的APP,他们的安全防护措施都非常强大,无论是登录还是注册还是找回密码都有极高的安全性。