短信验证码:是时候说再见了
大约在 2015 年底开始,中国互联网开始流行起使用短信验证码的方式进行用户鉴权。
虽然已经无法深究是什么原因或是哪家公司开始的这个潮流(实际上这样的深究也是毫无意义的),但短信验证码已经成为了中国互联网的「标配」,甚至和其他国民级应用配合后,它几乎已经完成了中国互联网和国际互联网分道扬镳的历史性转折:在中国本土,他们使用的非常好,但对于非中国大陆的居民,或非中国籍居民来说,服务几乎无法使用。
然而,与大部分人的认知不同,短信验证码并不能提供更好的安全性。
爱范儿之前的文章中已提到过关于使用 GSM snooping 方法进行短信验证码的终端窃听的实例。这篇我在两年前写的文章也有更多的信息。除了最后一英里的安全性存疑之外,由于骨干网分光设备及 Lawful Interception 设备的安装已成为常态,如果「服务商 —— 短信服务商 —— 运营商」的链路中任何一个环节若未使用工业级标准进行加密传输,或无法保证实施前向安全 (Forward Secrecy),则整个链路是不可信任的。
同样的,短信服务商若没有良好的安全意识,那么别有用心的人可能在此处潜伏,窃取验证码。除此之外,来自短信服务商以及运营商的内部威胁 (insider risk) 是不可小觑的。
简单的说,由于一般的短信传输路径存在过多的薄弱之处,其安全性是值得怀疑的。
使用短信验证码除了有安全性问题之外,还存在着个人信息泄露的极大风险。可能由于携号转网并未达成,而大部分运营商的新用户优惠远好于老用户优惠(从商业角度 bait-and-switch 是个不错的策略),频繁更换手机号已成为了一种常见行为。某些国民级聊天软件的普及更是让手机号交换的需求大大降低 —— 实际上我在最近一两年鲜有与其他人交换手机号的情况。
更换手机号带来的问题则是原有的号码所有者经常忘记取消手机号与账户的绑定,不少服务甚至无法更换号码绑定。因此,一旦号码被再次循环利用,存心不良的攻击者可以利用此问题针对防护不佳的平台作出攻击,以取得用户资料。有些情况下,甚至可以取得足够多的资料,进行身份盗窃 (identity theft)。
这对用户的隐私是极大的威胁。
即便是使用了极佳的安全手段(提示:这种手段并不存在),一旦手机号被送出,用户的隐私可能受到极大的威胁。在诸多公司缺乏合理的隐私策略的前提下 ,用户的个人信息可能会与信用性受怀疑的第三方公司共享,甚至可能被出售。(爱范儿读者不必担心,我们有详细的隐私策略供君研究。)对于用户而言,这意味着更多的追踪器(不要忘记大部分 DSP 均支持使用手机号做为用户标识符),以及更多的垃圾短信(这毕竟是手机号码)。这对于大部分读者来说也已经不陌生了。
短信验证同样无法完全提供运营商想得到的用户实名认证的功效。下面一张来自国际互联网的截图便已经足够说明问题。当然了,这样的信息甚至可能泄露于上面描述的方式。
短信验证码泄露造成实际损失的例子,海内外皆有。较为人所知的是近期豆瓣网友「独钓寒江雪」的例子,以及 Coinbase.com 用户由于 Verizon 的安全漏洞导致数千元的 Bitcoin 被盗取的例子。
既然有如此之多的问题,为什么依然有诸多公司选择使用短信认证,甚至选择短信认证为唯一的认证方式呢?
大概有两个解释 —— 若不是无知,便是真的坏。无知不算可耻,互联网安全本身是中国研究极少而美国相对发达的学科,如果本文可以让更多从业者了解到这个事实,便已推进中国互联网进了一小步;而坏则是更大的问题。发垃圾短信是可以带来短期的收益的,不尊重用户隐私是可以成就诸多「模式创新」的,但「模式创新」带来的恶评,相信各位读者也从各大媒体中没少读到。甚至有 Twitter 用户提到,“Web experience in China is like a bowl of shit being served by a scar-faced, slick-haired waiter with nothing beneath his suit jacket, who just learned to bow politely with an ugly and hideous grin. Utterly unbearable.”(编者译:中国网站不仅难看还难用,刀疤脸梳油头,赤膊穿西装,端一盆屎到你面前,微微欠身冷笑着请你吃的那种。)
除了短信验证,作为身份验证的方式可能还有什么呢?
传统的基于用户名密码的验证方式当然没错,但是大部分人都不对密码安全有深入的了解,毕竟互联网用户并非网络安全专家。除了老生常谈的不应重用密码(真相是大家都在重用密码)、使用强密码(但强密码逃不过弱加密方式甚至明文密码的威胁)、使用密码管理器(唯一问题是 LastPass 的 bug 多如牛毛且界面丑到天际、1Password 的价格令人惊叹、iCloud Passphrase 的使用方式费解且不跨平台)之外,有什么真的解决问题的方法?
OpenID 的尝试已经事实上失败了(这个名词可能也只有少部分读者仍有印象),Mozilla Persona 也宣告失败。标准的 OIDC (并非私有的 OAuth 2.0)虽然作为一个标准来说较为成功,但更多的被用于企业级的 SSO 解决方案,而为面向客户端的解决方案。基于巨头的(使用 OAuth 2.0 或类似技术的)认证方式虽然提供了更好的便利性,但它并不可打消用户作为一个普通公民对隐私的顾虑 —— 个人信息多多少少被共享了出去。
我们有什么选项?这可能是最难回答的一个问题。
从用户隐私角度出发,任何一个人都希望尽快能少的提供信息给任何商业公司;从用户体验的角度出发,任何一个产品都应需要最少代价完成「登录」以及合规性的要求,并尽可能少的将用户暴露在风险面之下。最好的策略,目前看起来似乎仍然是基于传统的用户名密码方式的认证,但用户是否埋单、是否懂得保护自己,这是个很值得研究的话题。或许使用巨头提供的登录权衡下来,仍然是折衷的选择:避免巨头的追踪已经十分困难。
但不管怎样,是时候对短信验证码说再见了 —— 一个漏洞百出的方案,绝对不应被理所当然的认为「这就是做事情的方法」。
(题图来自 Thought Catalog)