听了 1Password 开发团队的最新一期播客节目,谈了很多有关网络安全相关的暴论(Hot takes)。例如,发往邮箱的登录链接(magic link,一种无密码登录模式)到底安不安全、口令会不会在 2026 年逐渐式微,以及 VPN 到底能不能保护好安全,等等。 如果让我提出一个有关网络安全的暴论,我会提出「安全键盘并不能守护你的帐户安全」。这句话里的「安全键盘」,泛指的是包括中国大陆在内的部分国家或地区的手机银行 app 中,普遍性地在密码输入框中使用自己实现的一套触屏软键盘。如果要让我评价中国大陆金融机构近十年以来最抽象的几个网络安全操作,它应该能排进前三位。
让我们把时间往回拨 30 年、个人电脑甚至还没有完全普及的年代。早在 1997 年,招商银行就推出了面向零售和个人的网上银行服务「一网通」,这应该比大多数人想象得要早得多,毕竟彼时距离发出那封著名的「越过长城走向世界」邮件只过去十年,而彼时的 QQ 还叫做 OICQ。 而在这个时候,个人电脑普及率也没有那么高,基本上得是那时候的「万元户」可能才会有一台家人共享的电脑,但包括即时通讯、网络游戏和网上银行在内的互联网应用的兴起,造成了对互联网需求的高峰,而彼时基础设施和个人电脑普及就显得像是个「远水」,解不了人民群众的「近火」,因此催生出了「网吧」,也就是提供公共互联网接入的服务。
现在我们知道,在公共设备上登录自己的互联网帐户有很多安全上需要注意的地方,例如用完电脑需要将登录状态移除(退出登录),或者要使用浏览器的「访客模式」或「隐身模式」等等。但有一种原始但有效的「中间人攻击」方式在彼时颇为流行,就是在键盘和计算机的 PS/2 接口中间,添加一个键盘记录器。
键盘记录器的作用,就是记录使用这台电脑的所有用户的键盘操作记录,你输入什么字符、按下什么按钮,它统统都记下来。而且,为了(在视觉上)隐蔽键盘记录器,它通常都会被做得很小,以便隐蔽在电脑机箱后侧。
设想一下,如果你在网吧上网,选了一台被人设置了这种键盘记录器的电脑,然后在电脑上打开了 QQ,通过键盘输入了你的 QQ 号和密码。你离开网吧之后,设置键盘记录器的人回收了记录着你输入过的所有字符的记录器,然后在你和网上的 GG 或者 MM 糖分超标的暧昧聊天记录之间找到了你的 QQ 号和密码。三天后,你的 QQ 就被盗了。
收到你和其他用户对这种问题反馈的腾讯和其他公司不得不向自家用户发出大量提醒,包括在网吧上网需要时刻检查机箱背面插键盘 PS/2 的地方是否有什么奇奇怪怪的东西,但投诉依然像雪片般飞来。这时候,有个工程师想到了一个主意:键盘记录器只能记录键盘的输入、但不能录制屏幕的显示,那我们设计一个能绕过键盘记录的「软键盘」,供用户输入,不就能绕过键盘记录器了吗?
这里的「软键盘」,实际上指的就是软件实现的键盘。通过在电脑屏幕上显示一个键盘 UI 然后通过鼠标点击这个键盘上的按键,来实现字符输入功能。由于通过鼠标输入文本绕过了键盘记录器,因此包括 QQ 在内的许多软件都提供了软键盘功能。更进一步,为了避免其他人拍照、录像而不小心将通过软密码输入的过程录制下来,一些软件还会推荐在输入密码的时候,用键盘输入几位、再用软键盘输入几位。
在电脑时代的「软键盘」,其实就是现如今手机银行 app 普遍采用的「安全键盘」的前身。更具体地说,现今手机银行 app 会在用户输入密码的时候,将系统或用户指定的第三方键盘替换成自己实现的一个键盘。在中国金融业业界中有一份编号为 JR/T 0068-2020 的标准,名为《网上银行系统信息安全通用规范》。其中第 6.2.1.1 条中是这样描述的: j) 客户端程序应提供客户输入支付敏感信息的即时防护功能,并对内存中的支付敏感信息进行保护,例如,采取逐字符加密、自定义软键盘、防范键盘窃听技术等措施。
a) 应使用即时加密等安全措施降低恶意软件窃取用户支付敏感信息的风险,使用软键盘方式输入密码时,应采取自定义键盘等措施防范密码被窃取。
另外,还有一份 JR/T 0092—2019 标准中的 5.1.2.1 一节也规定了金融业相关 app 需要在密码输入中提供「替换原文」、「逐字加密」、「自定义键盘」等措施来提供针对密码的安全防护。 很明显,这些描述对应的就是金融 app 中普遍使用的「安全键盘」。不过,你需要注意两件事情:首先,这些标准编号开头是 JR/T,其中的「T」代表这是一份「推荐性标准」而非强制执行标准(即使这样,在金融行业里推荐性标准在某种事实上约等于强制性标准,而且据说国密相关规定对于自定义密码键盘也是强制验收标准);其次,这份标准只规定了 app 的最终表现,但具体如何实现,各大银行可以说是八仙过海,怎么弄的都有。
位于善良守序阵营坐标的银行 app 会利用 Custom Input Views 功能(这个功能原意是在诸如聊天 app 中提供贴纸或照片发送功能,是的张小龙没有在微信里使用它),用接近原生或第三方键盘的体验来实现;一些绝对中立的银行会绘制一个假的输入框,然后用户点击时显示一个 z 轴比较大的 UI,以此来「模拟」键盘的效果。如果说这些好歹还算是「输入什么,框里就有什么」的正常人范围的话,那么银联云闪付 app 可谓是混乱邪恶的典型代表:虽然云闪付的密码输入框用的也是类似 SecurityField 的实现,甚至按住密码输入框还能显示「粘贴」按钮,但你真的从 1Password 复制密码之后粘贴进去,会发现提示密码错误,但是纯用安全键盘输入的密码是没有问题的。我猜测他们要么是在逻辑层实际记录安全键盘的输入、UI 只是显示一个点点而已;要么实际上每输入一个字符实际上在逻辑层被转换成了另一种 Unicode 字符,然后再放到输入框里…… 但是,这一顿操作猛如虎,它到底是真的有用,还是仅仅只是一个人为设限的赛博安慰剂?
之所以前文盘了很久安全键盘的历史,就是为了说明它其实是一个历史产物——在公共设备上网是那时候人们接触互联网的重要渠道。再说,别说键盘记录器了,如果那时候真有人有心,别说硬件层面了,就古早电脑那个「我家大门常打开」的劲儿,没准你去什么小网站中个毒,分分钟你就在黑客面前裸奔。
但现在,我们早就过了上网要专门跑去网吧的年代了。个人电脑的普及,至少让硬件被篡改的风险降低了许多;安全启动、内存校验等硬件上的措施,以及互联网用户对于网络卫生知识的提升和黑客攻防知识的普及,也进一步地降低了漏洞出现概率以及出现后的暴露窗口时间。更进一步,人手一台手机的年代,想探测记录触摸屏幕上的键盘输入基本不太可能。硬件层面上,做到同样的效果需要对屏幕的显示或触摸排线信号进行拦截,但真这么做,(无痕地)改造手机几乎是不可能的,这从根本上扼杀掉了键盘记录器这类硬件的存在空间;虽然我们还是会被诸如 O.MG Cable 这类硬件教导「不要乱用公共场所的充电器」,但这类攻击已经和「安全键盘」要解决的事情完全没有关系了。 硬件探测不可能,那么软件呢?隔壁「豆包手机被网银封杀」事件已经证明了,即使是贵为系统层级的 app 也不可能轻易地通过屏幕录制接口获取屏幕输入。如果用户使用第三方键盘呢?对于 iPhone 用户而言,即使在正常输入框中使用第三方键盘,在密码输入框也会被强制换回 iOS 系统内置键盘。部分国产 Android 手机默认会开启「密码键盘」功能,即使用户日常使用第三方键盘,在激活 SecurityField 的时候也会被强制更换成系统的密码键盘。虽然这个功能可以被主动关闭、转而使用第三方键盘来输入密码,但由于这个开关非常深,以至于你真的关闭它通常是会在「知道自己真的在做什么」的前提下关闭的。 聪明的你在这时候一定想到了通过陀螺仪检测手机摆动方向和幅度来倒推键盘输入,也的确有相关的学术论文(论文 1,论文 2,论文 3)。但是兄弟,普通手机输入法是软键盘,你自己实现的键盘难道就不是软键盘了吗?真的利用陀螺仪探测的话,人直接一个 AOE 打击,哪管你是哪来的软键盘神仙。除非你真的实现前文推荐标准中提到的「安全随机键盘」,即将所有按键全部打乱,而且是每次都打乱,这样即使真的有一个惊天地泣鬼神的恶意 app 本着你有这本事干点啥不好的精神突破系统重重安全封锁在后台持续监听陀螺仪而且不拖慢手机不被系统杀掉,也很难真正探测用户输入的内容了。 但真做到这一步,手机银行 app 们就能高枕无忧了吗?
我们先来看看另一个与密码有关的策略的反例。在早先许多网站上,有一种十分复杂的密码策略。在注册或修改密码的时候,密码输入框附近会有一组检查列表,例如密码至少有一个小写字母、一个大写字母、一个数字、一个特殊符号、多少位……
看上去这个逻辑是说得通的:通过强制的复杂性要求来鼓励用户提高密码的随机性,进而令密码更难被猜测。但在密码世界,高随机性和高熵值(这才是安全的密码需要追求的)并不能直接划上等号。和 Enigma 机后期限制密钥组合反而减少了猜测难度一样,限制密码的格式等于是在「可能的密码组合」这个集合中,排除了「不符合的条件」。从数学上来说,减少的这批数量在总可能密码数量的占比中相当可观,对于使用暴力破解手段的攻击者而言,这无异是在减轻暴力破解的负担。
同时,额外的限制反而让用户设置的密码「坍缩」到人更容易记忆的密码组合,例如 P@$$w0rd1。更危险的是,一些用户会刻意设置一个「能符合所有地方要求的密码」,来避免额外的密码记忆。如此一来,所谓的「复杂密码条件」的设置,完全变成了一个形同虚设的用户体验障碍。你可以在微软研究室的这篇博客文章中,看到更详细的解释。 打乱的「安全键盘」实际上也是一样的道理:为了在被打乱的、无规律的键盘上提升那么一点输入体验,用户更倾向于使用自己熟悉的密码,以换取一点点的效率和体验提升。说白了,不管是复杂密码策略,还是打乱的安全键盘,本质上是在与人的懒惰作斗争。常年和拖延症打交道的朋友们都能明白,在一些场合,面对一些反人性的、甚至是不必要的限制下,人类通常的行为是绕过它,而非采用与限制设置者预期中的方案来解决。很不幸,密码的设置和输入就是这样一个场合。
更进一步地,一些「安全键盘」功能的实现从系统底层禁止了密码管理器的介入。简单来说,包括 macOS、iOS 和 Android 在内的系统,支持从密码管理器 app 中直接传输密码到用户名和密码输入框。这种系统层面的行为不仅可以有效避免物理和软件层面的直接探测,陀螺仪分析猜测法对它也是束手无策(毕竟不需要直接输入密码)。而大多数「安全键盘」要么魔改了键盘、输入框,要么就像云闪付那样替换用户实际输入字符,令用户最终只能手动输入密码。最终的结果就是,不仅陀螺仪探测法有机会探测到输入,在事实上采用「安全键盘」,实际上在鼓励用户使用更容易输入、记忆的低熵密码——相对于使用密码生成器生成的高熵密码而言,安全性反而是下降的。
早期的网络安全中流传着这样一句话:安全和方便总需要牺牲一方。但在网上冲浪这么长时间,我逐渐开始认为,这句所谓的「绝对真理」可能就是在他妈的放屁。
这句话出现在「密码管理器」之前的密码身上可能是正确的:人类是真的不擅长生成、记忆一个高熵的密码。别说高熵了,就连一百多个在线帐户、每个用一个独立的密码这件事,人类也是极其不擅长的。因此,我们才会发明一种叫做「密码管理器」的东西。
从通行密钥产生的当下回过头去看密码管理器这个东西,会发现理想情况下两者在用户体验上并没有什么差别:都是密码管理器生成一组信息(可以是密码、也可以是一个密钥对),然后存储起来。当用户需要使用的时候,只需要用某种方法确认是用户本人在请求,然后直接完成授权。
而在底层,使用密码管理器管理密码和直接使用通行密钥,理想情况下二者唯一的差别,也只是非对称加密和对称加密在安全性上的一点点可能的潜在的妥协。在用户使用习惯(为每个帐户设置独立的高熵值密码)、密码管理器(做好基础密码存储与使用安全操作)、操作系统(提供安全和良好的填充接口)、传输链路(避免被中间人监听)、密码存储设施(使用 Pufferfish2 或 bcrypt 等算法哈希)都称得上良好的情况下,很难说高熵密码会比安全密钥差多少。可能唯一有差别的地方是,对于通过「社工学」和钓鱼诈骗模式来骗来偷袭的情况,你情急之下有可能会把密码交给跨国骗子,而安全密钥背后那个必须通过附近设备认证机制,以及非对称加密的数学力量,可以有效避免脑袋一热给骗子交了密码的问题。 但是我们都知道,真正的制约力量从来都不是标准规范,而是既成事实。密码时代的在线网络身份认证的整个流程已经完美体现了这句话:用户、链路、服务商,这三方都能 100% 按照理想情况部署安全设施的情况无异于三日凌空:即使你我都是十年资深 1Password 老用户,时不时发生的「拖库事件」都在提醒着我们,实际上有太多太多的网站还在使用明文密码存储到数据库中;反过来,互联网服务们即使真的能做好一整套基建安全流程,也抵不住太多的用户使用越来越简单、越来越有规律的密码。更糟糕的是,诸如「安全键盘」的措施,看似是对密码偷窥和探测的一种有效反制手段,但在事实上正在鼓励用户使用更不安全的低熵密码。 说到底,密码的问题从来不出在密码本身,而是围绕它出现的一系列的延伸问题:如何管理密码、如何加密密码、如何传输密码。但是,密码是一个「管生不管养、管杀不管埋」的小妖精,它只负责认证,却把其他一系列复杂问题交给了使用密码的人。而人的懒惰性会让我们尝试绕过这些问题,用一个「差不多就得了」的方式来交差,再回过头看又因为密码而衍生出如此多的(人为)事故,最终人们又怪罪上了密码。
从这个角度再回看通行密钥和它背后的 FIDO,他们希望解决的问题就是,将互联网认证过程中最复杂的问题都提供一个标准化的解决方案。你不是嫌设密码麻烦吗?那我帮你设,打个脸卡就行。你不是嫌哈希密码太麻烦吗?那我有开源库,我来帮你处理这一套流程。你怕传输链路有问题?没问题,数学先生的非对称加密很可靠。
FIDO 期望通过各种标准设计,将所有背后麻烦的一套东西封装起来,降低使用这一套流程的所有人的心智负担,只要你按照标准走,那么你就可以拥有世界上最安全、最好的认证流程体验。唯一的问题是,对于用了接近一百年密码的人类来说,想要一夜之间所有网站都使用通行密钥,那还是有点异想天开——毕竟,真正的制约力量从来都不是标准规范,而是既成事实。
除了密码和安全密钥,事实上也有很多东西都在「更方便」的前提下变得「更安全」。例如手机 NFC 支付钱包。从体验上来说,Apple Pay 使用起来十分丝滑,只需要双击侧键、打个脸卡,然后往 POS 机一刷,就能完成刷卡动作。但是在这背后也利用了非对称加密的力量:在打脸卡的瞬间,你的手机会用安全芯片中的独特密钥签发一个授权证明,随 NFC 发送给银行;银行再直接用公钥确认授权来确认支付请求确实是来自你本人,完成授权交易。这显然不仅要比通过实体卡更安全、更难盗刷,而且在事实上也更方便:出门你可以不带银行卡,但是你一定会带一台手机。
从各种意义上来说,方便从来都不是安全的敌人,复杂才是;或者说,脱离人参与的安全策略,从来都不是一个好的安全策略。当人的体验和主观能动性被安全流程设计排除在外的时候,这个安全策略注定会失败。密码如是,「安全键盘」也是,所有其他网络安全流程亦是。
文中图片来自 Unsplash+、维基百科、Microsoft Research 官网。
评论区
共 条评论热门最新