为什么 SMS OTP 不如 Microsoft Authenticator 等身份验证器应用程序安全?是因为移动通信的窥探吗?或者?
为什么 SMS OTP 不如 Microsoft Authenticator 等身份验证器应用程序安全?
几个原因:
- 攻击者劫持某人的电话号码相对容易(尽管越来越难,谢天谢地);攻击者说服手机提供商将受害者的号码移植到攻击者的计划中,或者攻击者获得具有该号码的新 SIM 卡。然后攻击者获取受害者的短信。
- 无线短信安全几乎不存在。我知道有人在入侵微信时不小心截获了一些东西。如果您在目标附近,或者能够接入移动网络,您可以在发送给用户的途中接收短信。
- 甚至在到达塔之前,SMS 经常要经过许多跳,其中一些可以完全未加密。可以利用移动运营商网络(电缆或微波传输之类的东西)的攻击者很可能会以这种方式获取 SMS。
- SMS 在终端设备上的安全性通常较低。例如,很多人将手机配置为在锁定屏幕上显示短信,这对攻击者窃取手机很有用。
- 类似地,如果攻击者偷了一部手机并且所有者没有足够快地停用线路(并且 SIM 没有密码,大多数人都没有),攻击者可能会移除 SIM 并在自己的情况下使用它设备窃取短信,或硬重置手机,然后用它来接收短信。在任何一种情况下,OTP 密钥都不会以相同的方式提供。
编辑:有人指出,为了对比,我应该介绍身份验证器应用程序的工作原理。
身份验证器应用程序通常以两种方式之一工作:TOTP 或推送身份验证。
TOTP 或基于时间的一次性密码是熟悉的代码,通常为六位数,每三十秒更改一次。它们是通过将当前时间(以 30 秒块为单位)与对称密钥(密钥是存储在您用于将站点添加到身份验证器应用程序的 QR 码中的大部分内容)进行加密组合而生成的。TOTP 是一种零知识证明形式,用户可以证明他们知道对称密钥,而无需传输密钥本身。一旦给定的代码过期,它就没有用了;即使有许多代码和知道它们何时有效的知识,也几乎不可能确定生成它们的密钥可能是什么。
- 密钥仅提供一次,通过通常比移动运营商使用的方式更安全的方式(防止攻击 1)向经过身份验证的用户提供。
- 它通过 TLS(通常是 HTTPS)传输,这比用于 SMS 的明文和弱加密的混合更安全(这可以防止攻击 2 和 3)。
- 设置应用程序后,该密钥将永远不会再传输到任何地方;它实际上只是“您拥有的东西”,不受其他任何人的控制(防止除 5 之外的 SMS 常见的所有攻击)。
- 用户必须解锁手机并启动应用程序才能查看代码;这可以防止攻击 4。
- 密钥存储在应用程序中,可能由应用程序本身加密,并且几乎可以肯定(在现代设备上)也由操作系统加密;它不存储在 SIM 卡或任何其他可移动组件上,如果手机恢复出厂设置,则密钥会被擦除(防止攻击 5)。
推送身份验证采用不同的方法:与其交换一次密钥,然后根本不再直接与应用程序通信,而是使用密钥来维持(或按需重新建立)应用程序和服务器之间的安全连接。然后,服务器可以随时告诉应用程序提示用户确认或拒绝身份验证(通过应用程序向用户推送身份验证请求)。与 TOTP 不同,TOTP 是许多应用程序支持的标准(尽管细节有时会有所不同),有很多方法可以进行推送身份验证,它通常取决于用户拥有特定站点支持的一个应用程序(这意味着您最终可能会有很多应用程序)。一种常见的方法是站点或服务发送一种特殊的移动网络命令,类似于 SMS,告诉手机唤醒并检查互联网上的通知(这就是推送通知的一般工作方式)。将有一个通知(通常使用特定于操作系统的通知框架)告诉操作系统特别唤醒身份验证器应用程序,让它连接到 Internet,并进行身份验证以检查来自其服务器的传入请求。
但是,所有推送身份验证方法都具有以下属性:
- 虽然唤醒应用程序的推送可能会被拦截或转到错误的设备,但这还不足以欺骗用户的响应。应用程序必须向服务器发送一条经过身份验证的消息,告诉它用户对推送的响应是什么。攻击者不会拥有该用户的应用程序凭据,因此攻击者无法伪造用户对应用程序关联服务器的响应。攻击者无法欺骗任何人相信实际上是您。这可以防止攻击 1。
- 在用户进行身份验证之前,应用程序向服务器证明其身份(身份验证)(使用一些内部存储的密钥)(与 SMS 不同,它只是将代码发送给可能正在收听的每个人)。应用程序的身份验证通过 TLS。这可以防止攻击 2 和 3。
- 应用程序在其私有存储中保护其身份验证机密,通常由应用程序、操作系统或两者加密。秘密不能(实际上)从手机中物理删除,重置手机会擦除它们。这可以防止攻击 5。
- 该应用程序通常不能(也不会尝试)在锁定屏幕上显示推送身份验证请求(它可能会让用户知道有一个,但通常甚至不会说从哪里来)。应用程序(和/或操作系统)绝对不会让用户在没有解锁手机的情况下响应推送,有时甚至不需要对应用程序本身进行额外的身份验证(例如指纹)。这可以防止攻击 4。
有点跑题了,但是...
请注意,如果您想要真正好的安全性,您应该查看FIDO2 / U2F / WebAuthn,它们独特地提供了其他第二个因素无法提供的安全级别:防止网络钓鱼页面。这些协议的工作方式,浏览器或其他应用程序告诉身份验证器哪个站点/应用程序正在请求访问并以加密方式使用它;类似域的网络钓鱼站点仍然无法验证实际目标站点。
尽管通常与专用硬件令牌(例如 Yubikeys)相关联,但实际上在许多平台中都有 WebAuthn/FIDO 提供程序(Windows 有 Windows Hello,它可以处理记忆的秘密、物理身份验证器或生物识别;Apple 有 TouchID 和 FaceID;Android 支持使用解锁方法,例如 PIN 或图表或生物识别)。使用此功能,您可以实现三因素身份验证(知道密码 + 拥有电话 + 成为有指纹的人)并击败网络钓鱼攻击,同时还可以通过点击指纹读取器登录,而无需打开应用程序和复制代码。