(注意:我实际上并不打算这样做。这个问题是严格的理论问题。)
TOTP通常用作双因素身份验证中的第二个因素。它是一个开放标准,可在多种编程语言和平台上实现。有一个易于使用的 iOS 和 Android 客户端应用程序,形式为 Google Authenticator 应用程序。
使用 TOTP 作为单因素身份验证方法代替密码是否存在任何基本的安全问题?当然,应该不鼓励忽略单因素身份验证。
(注意:我实际上并不打算这样做。这个问题是严格的理论问题。)
TOTP通常用作双因素身份验证中的第二个因素。它是一个开放标准,可在多种编程语言和平台上实现。有一个易于使用的 iOS 和 Android 客户端应用程序,形式为 Google Authenticator 应用程序。
使用 TOTP 作为单因素身份验证方法代替密码是否存在任何基本的安全问题?当然,应该不鼓励忽略单因素身份验证。
我对这个话题做了一些思考,我想提出我的想法。随意得出自己的结论。
事实
TOTP 算法使用的密钥是一个用 base32 编码的 80 位随机生成的密钥。这可能比大多数人使用的密码更安全。
密钥通常以 QR 码的形式呈现,由 Authenticator 应用程序扫描。或者,某些服务还提供 base32 编码的密钥以供手动输入。
在 Android 设备中,密钥未加密地存储在 SQLi 数据库文件中。SQLi 文件位于/data/data/com.google.android.apps.authenticator2/databases/databases
. 但是,除了 Authenticator 应用程序本身之外,任何应用程序都无法访问此文件。显然,这不适用于有根设备。我没有植根 iOS 设备,因此无法评论 iOS 版本的 Google Authenticator 应用程序的细节。
我的结论
在我看来,用 TOTP 身份验证解决方案替换密码有一些优点和缺点。
好处
假设有问题的 Android 设备没有 root,除了 Authenticator 应用程序之外,没有其他应用程序可以访问存储在数据库中的秘密。这消除了恶意软件劫持用于身份验证的秘密的非常大的风险。任何键盘记录器/屏幕记录器只能获取 60 秒后过期的临时密码。这是一个非常小的窗口,除非您是非常有针对性的攻击的焦点。
使用 TOTP 消除了攻击者对服务执行在线暴力攻击的可能性。机会之窗实在是太短了。
对某些人来说,这是安全性和便利性之间的良好权衡。我认识的大多数人都在 24/7 左右携带智能手机。身份验证是访问应用程序并键入 6 位数字的简单问题。对某些人来说,这可能比记住相对强的密码或携带密码数据库要容易。
缺点
数据库泄露意味着必须重置密码。这对用户来说真的很麻烦。
用户丢失他/她的智能手机意味着无法访问该服务。
这很有趣。但是,在现实世界中,您显然应该将常规密码和一次性密码一起用于 2FA。
另一个需要考虑的因素是最终 TOTP 结果的熵非常低 - 6 位数字。如果您有大量用户名,您可以继续为所有用户尝试相同的 TOTP,并且您最终会在其中一些用户上成功,并且这个数字会不断上升,因为您将每 30 秒再运行一次。
标准速率限制解决方案适用于此,但在这种情况下 - 您不必一直尝试所有组合(密码就是这种情况) - 如果您有目标用户帐户 - 您只需继续每 30 秒尝试有限数量的 TOTP(根据您的速率限制)。
任何拥有种子的人都可以生成相同的令牌/密码序列。我认为这不够安全,不允许将其作为单一登录令牌。
这基本上就是 Twitter 使用他们的“数字”身份验证系统所做的事情 https://get.fabric.io/digits
该算法的优势在于它对暴力攻击的抵抗力以及无法从代码本身重建秘密。
对于大多数简单的基于密码的系统,通过确保用户知道与您知道的相同的秘密(即密码)来建立信任。另一方面,使用 TOTP,通过确保用户拥有共享秘密来建立信任。因此,如果有人偷了你的手机,他们就可以在不知道任何其他密码的情况下访问系统(解锁代码可能会短暂减慢他们的速度,但这些密码并不难绕过)。
从根本上说,我认为协议的安全性取决于用户拥有多少秘密价值。我认为大多数人都会密切关注他们的手机,但他们经常会丢失或与朋友和亲人分享。