短信验证码的深度剖析
本文深度剖析了关于短信验证码的运作机制,破解验证码A和短信验证码A‘原理,以及短信验证码未加防护存在的风险和对于短信验证码出现的一些问题应该如何处理。
一、短信验证码运作机制
1. 验证码加密发送
- 在APP中点击发送验证码,向后台发送一个发送验证码请求;
- 后台收到请求,生成一个验证码A,并反编译成短信验证码A‘;
- 请求短信服务商发送短信验证码A’至用户手机,同时存储验证码A至后台数据库中;
注:出于安全性考虑,后台数据库只能查看验证码A,无法查看短信验证码A‘。
2. 验证码解密验证
- 用户收到短信验证码A’,填写至APP中,点击注册,向后台发送验证验证码请求并提交短信验证码;
- 后台收到请求后后反编译短信验证码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)手机号获取短信验证码次数限制是其中一种防攻击策略,不过在设计这方面内容时,需要根据自己公司的业务情况具体制定的。
需要回答3个问题:
- 根据业务需要,短信验证码发送次数设置的上限为多少合适?单次短信验证码填写错误的次数?
- 一般超过这个上限,我们需要锁定用户手机号多长时间?6小时,12小时,还是24小时?
- 锁定用户手机号后,我们可以为用户提供的后续方案是什么?需不需要提示对方,让他打电话给客服,自己主动申请解锁?走邮箱的验证方式、增加语音验证码也是一种可行的解决方案。
(2)设置短信发送时间间隔是其中的一种防攻击策略,为了防止用户重复获取验证码,一般设置60s左右的间隔获取时间,但验证码的有效期一般是5-30分钟不等。一般来说,5分钟有效的都是4位验证码,30分钟有效的都是6位验证码。不过这方面手段不能防止黑客更换手机号进行攻击,防护等级较低。
(3)发送验证码之前需要填写一次验证码,不过此种传统的方式利用机器学习的知识很容易破解。另外可以增加滑块拼图这种需要人为干预的动态验证。
至于如何研究这一块,各位可以看一下各大手机银行的APP,他们的安全防护措施都非常强大,无论是登录还是注册还是找回密码都有极高的安全性。
本文由 @ 码农 原创发布于人人都是产品经理。未经许可,禁止转载
题图来自 Pixabay,基于 CC0 协议
专业提供短信验证通道,一键登录验证。商务合作联系WX:13128049287
可以将验证码位数增加至8位或10位吗?或采用组合输入的办法。 比如本身的六位数字验证码发送给用户,同时随机生成2位英文字符,用户获取后,填写验证码+英文,实现验证。
复杂的验证码不便于用户记忆输入,反而丢失用户体验,一般都是4或6位纯数字码。防盗刷策略应放在接口调用侧较为合适。
都是有道理的,还是得具体问题具体考虑吧,得综合评估是否足够的理由牺牲用户体验去满足安全性,金融行业对于安全性要求更高
感谢建议,应对策略一块确实写的不够全面。一定程度上增加验证码的长度,采用混合验证码提高验证码的复杂度,都能进一步提高暴力破解的难度。
应对策略各位童鞋有更好的实现方法,欢迎指导交流……