(如果这不是正确的网站,请告诉我……)
在为 GitHub 和其他网站选择身份验证应用程序时,我最终选择了 Sophos,因为,为什么不呢。显然,我可以选择 Google 应用程序或其他应用程序。
这表明它们基本上都在做同样的工作,而且该网站并不特别关心我使用哪个应用程序。我当然没有告诉网站我正在使用哪个应用程序,所以这表明它相当中立。
这是如何工作的?是否有一个身份验证中心点,还是它们都遵循相同的算法,或者是否有一个可接受的身份验证器列表?
(如果这不是正确的网站,请告诉我……)
在为 GitHub 和其他网站选择身份验证应用程序时,我最终选择了 Sophos,因为,为什么不呢。显然,我可以选择 Google 应用程序或其他应用程序。
这表明它们基本上都在做同样的工作,而且该网站并不特别关心我使用哪个应用程序。我当然没有告诉网站我正在使用哪个应用程序,所以这表明它相当中立。
这是如何工作的?是否有一个身份验证中心点,还是它们都遵循相同的算法,或者是否有一个可接受的身份验证器列表?
大多数此类应用程序遵循相同的算法,OATH TOTP(如 IETF RFC 6238 中所定义)。
它完全离线工作——您扫描的二维码包含一个密钥,6 位代码由此密钥与当前时间戳(四舍五入到最接近的半分钟)组合而成。因此,相同的代码可以导入到多个应用程序,只要时钟匹配,它们就会完全独立地生成相同的代码。
(也有例外;例如 RSA SecurID 在过去很常见,OATH HOTP 是一种罕见的可能性——基于计数器而不是基于时间——并且一些应用程序出于历史原因或其他原因使用自己的算法,但 OATH TOTP 是网络上普遍接受的算法。)
算法的核心就是
HMAC_SHA1(secret_key, timestamp)
。大多数网站都有以文本格式而不是二维码显示密钥的选项,然后您可以使用oathtool或hotpie进行实验。(确保不要遗失密钥。)QR码包含
otpauth://totp/USER?secret=ABC&issuer=SITE
,即相同的密钥加上输入标签(仅用于显示目的)。简而言之 - 它们以相同的方式生成代码。我相信TOTP是这里的“标准”。现代、始终在线系统的优点之一是您可以获得可靠的时间同步 - 使用它和私钥(包含在他们让您扫描的二维码中)以及相同的算法,您可以生成可预测的一次性密钥,而无需中央身份验证点。
这也意味着在理论上(和实践上),您可以将密钥导出到另一个设备/TOTP 客户端,只要您的时钟合理准确,它就可以工作。
如果记忆不错的话,他们会使用您第一次提供的 OTP 来确认它是“正确的”时间和密钥,但我对此并不完全确定。
所有经过适当保护的双因素身份验证系统背后的核心概念都涉及用户使用某些无法合理复制的先前商定的机制来证明其身份。
大多数“身份验证器”应用使用的特定机制称为 TOTP(基于时间的一次性密码)。这是旧机制 HOTP(HMAC 一次性密码)的改良版本。任一机制的设置工作方式如下。
otpauth://
方案编码特殊 URL 的二维码。此细节对于讨论来说也不是特别重要,只需知道它以身份验证器设备可以读取的方式对机密(以及有关网站本身的信息)进行编码即可。完成后,身份验证器将配置为向该帐户提供代码。实际使用身份验证器的流程如下:
服务器做完全相同的事情来验证代码。
需要注意的是,一旦配置了身份验证器,除了用户在提示时输入代码外,身份验证器和服务器之间没有任何通信,并且服务器与身份验证器之间根本没有通信。这一点非常重要,这也是为什么HOTP和 TOTP 通常被认为是安全的,而基于短信或电子邮件的 2FA 通常不安全的原因。
另外值得注意的是,HOTP 和 TOTP 都有一些固有的局限性:
一些系统使用类似于 TOTP 或 HOTP 的方法,但使用不同的算法,通常是出于遗留原因。一个特别突出的例子是 Valve 的“Steam Guard Mobile Authenticator”,它在功能上使用 TOTP,但完全自动化设置,并使用不同的机制从哈希算法输出中获取代码。
作为参考,另一个广泛使用的主流安全 2FA 实现是 FIDO2,它的工作方式略有不同,但仍然依赖于用户通过执行只有他们才能做的事情来证明其身份的概念(FIDO2 不是生成代码,而是使用先前在服务器上配置的密钥对身份验证质询进行数字签名,由于几个原因,它在技术上比 TOTP 更安全)。