短信并不是最好的二次验证方法,但却是成本最低最容易实现的也基本靠谱的:用户绑定性较强,不需要额外设备,用户广泛拥有,校验成本极低。短信验证的预设是
1)认为用户的手机卡是不会轻易丢失和被窃取的,和用户绑定更紧密(相对于各种脱库事件,密码泄露的概率还是比丢手机的概率大多了,况且丢了手机可以立即去运营商挂失补卡,密码泄露了就是泄露了)
2)认为有手机号可以做二次验证的用户是真实用户(所以手机验证码通常也会在要求比较高的场合被用来作反垃圾注册)(并且能获得更多用户的真实信息用来…)
3)认为运营商维护的通讯信道比其他的都更安全
这些预设基本上是靠谱的,只是在智能手机普及的大环境下各类短信木马此起彼伏,补卡攻击和无线电监听这些一直存在的问题也被关注和利用,短信验证的安全性就开始出现了问题。
目前来说对于短信验证的威胁主要有如下三个方面:
1)智能手机平台上的短信木马,这里【支付宝大盗分析报告】可以看到一个案例。这种木马的作用之前广泛用于支付宝诈骗,不法分子诱骗受害者通过二维码下载安装木马,随后重置受害者的支付宝、淘宝账户盗取钱财。因为之前支付宝的重置密码验证只通过短信验证码,木马在后台可以轻易窃取并转发给不法分子,实现对受害者的账号重置。这类木马编写简单,已经形成了非常完整的产业链:从制马人员到售马、租马,到实施钓鱼、欺骗、洗号、转移钱财。
在智能手机的年代,由于OS开放了短信操作和拦截的接口(Android直接提供,iOS需要越狱),对于一个安装了支付类App的智能手机且绑定账户的SIM卡也安装在同一个手机的情况(绝大部分情况下是这样),短信验证事实上已经退化成了单因子验证,只要智能手机被安装了木马那么这些验证体系就会全线崩溃,攻击者甚至可以只通过钓鱼wifi全部搞定登陆密码、支付密码和短信验证,参见诸葛老师的演示:《每周质量报告》 20140615 移动支付的隐忧
2)补卡攻击。之前提到了短信验证码事实上是基于手机号(SIM卡/运营商服务)而不是手机设备,那么如果能办一张和受害者相同的手机号,自然就能狸猫换太子,接受受害者的验证码,重置各种账号。参考安卓系统手机绑定银行卡易成黑客“提款卡”,这里的薄弱环节就在运营商,部分地区的运营商对补卡人员身份验证不严导致出现了补卡攻击。
3)无线电监听。这里主要包括GSM监听,包括监听空中短信,直接获取短信内容- -b,但这个玩法成本和范围有限制,相对1、2来说用在真正犯罪的情况下还比较少。
解决方案:1的情况有很大部分其实是反木马和系统开放度的问题,目前Android在4.4之后已经收紧了短信权限,相信在4.4普及之后情况会有一定好转。TrustZone这些耳熟能详方案就不提了。
2、3其实就是对运营商维护的信道安全提出了质疑。2依赖于运营商的各大营业厅加强安全意识,目前来说各家公司应该是收到过公安部的通知,现在去营业厅补卡还是盘查的比较严格的。
3可以考虑使用3G、4G等更安全的信号通道,但目前也有降维攻击,强制将用户信号降为(2G)GSM之后进行监听。这种攻击只能期待GSM逐渐退出历史舞台,设备不再兼容吧。
短信之外自然有一些更好的二次验证,比如OTP、指纹甚至虹膜也都可以使用。OTP(各种宝令、Google Authenticator、RSA token)已经比较普遍的。指纹随着具有指纹识别功能设备的普及也会流行开来,但如何在隐私和安全性上取得平衡还需要考量。
— 完 —
本文作者:hqdvista
【知乎日报】
你都看到这啦,快来点我嘛 Σ(▼□▼メ)
此问题还有 32 个回答,查看全部。
延伸阅读:
我们可以通过哪些方法减少使用验证码?
reCAPTCHA 验证码是否太难辨认了?如果是,为什么要做成这个样子?