一次性密码 (OTP) 是如何运作的?
在本文中,我们将介绍两种不同的一次性密码方法:邮箱/电话 + 验证码和动态码。
随着互联网的发展,我们一直在使用各种在线服务来满足我们几乎所有的需求。使用这些服务的第一步通常是注册和登录。在注册和登录时,用户 ID 和密码认证仍然被广泛使用,尽管从使用无法连接互联网的独立台式计算机的时代算起已经过去了三十多年。
过去,我们可能只需要记住电子邮件账户的密码,但现在我们经常使用几十甚至上百个在线服务,我们不能为所有服务使用相同的密码(如果一个账户的密码被泄露,使用相同密码的所有账户都会面临风险)。因此,无密码登录变得越来越流行并逐渐成为主流方法。
有许多不同的方法实现无密码认证,包括但不限于社交登录、邮箱/电话 + 验证码、以及使用动态密码的认证器应用程序。后两种方法可以归类为一次性密码 (OTP)。
什么是一次性密码 (OTP)?
OTP 是一种自动生成的字符序列,仅对单次登录会话或短时间内有效。由于 OTP 只能使用一次,它可以防止凭据泄露的风险,例如密码丢失或被盗。
理论上,OTP 可以是某个长度的随机字符,包括大写和小写字母,甚至是特殊符号。但为了用户体验,大多数服务在使用 OTP 时使用纯数字。
邮箱 / 电话 + 验证码
许多网站需要你通过发送验证码(或通过码)到你注册的邮箱或电话号码来验证你的身份。
想象一下,Jack 和 Joe 正在玩一个猜数字游戏,Jack 想出一个介于 0 到 999 之间的数字,并给 Joe 三次机会在一分钟内猜出这个数字。除了知道数字的范围外,Joe 没有其他信息。
我们都知道,仅靠三次尝试,Joe 几乎不可能在一分钟内正确猜出这个数字。
邮箱 / 电话 + 验证码的工作原理相同:验证码一般只在很短的时间内有效,通常不会超过 10 分钟(类似于 Jack 给 Joe "一分钟" 让他猜数字)。此外,用于验证验证码的 API 或方法通常具有速率限制,以防止对通过码的暴力攻击(就像 Jack 只给了 Joe "三次机会")。
对于潜在的攻击者来说,破解这种方法几乎是不可能的。然而,系统通过可信渠道(邮箱或电话)向用户告知验证码,使用户可以直接验证。
动态码
动态码,也称为基于时间的一次性密码 (TOTP),之所以称为“动态”,是因为它会随时间变化。通常,如果一个网络应用使用 TOTP,它将遵循 RFC6238 - 基于时间的一次性密码算法。
基于哈希的一次性密码
在介绍 TOTP 之前,我们需要简要解释一下 RFC4226 - 基于 HMAC 的一次性密码算法(HMAC 是一种哈希算法)。HOTP 算法的工作原理如下:
-
秘钥:HOTP 需要一个共享的秘钥 K,该秘钥在服务器和客户端之间相同。
-
计数器:HOTP 的核心是一个计数器 C,每次生成新密码时递增。
-
HMAC 计算:
-
使用 HMAC-SHA-1(或其他哈希函数)计算认证码:
-
其中,H 是一个 160 位的哈希值。
-
-
截断:提取哈希值 H 的一部分以生成 OTP。假设我们需要一个 6 位的 OTP,过程如下:
- 提取 H 的最后一个字节作为截断偏移量 O。
- 从 O 开始提取 4 个字节,将其转换为整数 T。
- 取 T 的最后 d 位,即 OTP = T mod 10^d。
总结来说,HOTP 公式为:
其中 d 为所需 OTP 的长度(通常为 6-8 位)。
基于时间的一次性密码
TOTP 是 HOTP 的扩展,它将计数器替换为时间步长。它使用当前时间生成动态验证码,因此 OTP 会随着时间自动失效。其工作原理如下:
-
时间步长:TOTP 使用当前时间 T 替代 HOTP 计数器 C。时间步长是设定的固定时间间隔(通常为 30 秒)。
- 例如,假设时间步长为 30 秒,当前 Unix 时间戳为 T。TOTP 计数器计算为:T' = T / time_step
- 其中 T′ 是时间步长计数器,以 30 秒为单位。
-
生成 OTP:将 T′ 代入 HOTP 算法以生成 OTP:
-
动态更新:由于 TOTP 基于时间步长,OTP 随时间变动,因此只要 OTP 在有效时间窗口内,服务器就可以验证其有效性。
总结来说,TOTP 公式为:
根据我们使用认证器应用的经 验,可以通过扫描二维码或直接复制粘贴来同步设备与服务器之间的秘钥值,然后需要输入当前动态码一次以确保秘钥值相同。
在使用移动设备的早期,我们可能会发现不同设备上的时间不一样,需要定期手动调整设备的时间。近年来,几乎所有的设备都使用网络时间服务 (NTP) 来定期同步和更新设备时间。即使设备的时钟不是完全准确,频繁的更新也可以确保不同设备之间合理地保持一致。在这种假设下,即使设备离线,动态码仍然可以使用,而接收验证码则会在离线状态下比较困难。
结束语
在本文中,我们介绍了两种不同的一次性密码方法:邮箱/电话 + 验证码和动态码。
邮箱/电话 + 验证码依赖于通讯基础设施和第三方电子邮件或短信服务 (SMS) 来实现;动态码不依赖外部服务和通讯设施,可以离线使用。
Logto 作为一个受欢迎、功能强大且高度可扩展的 IAM(身份和访问管理)服务,支持这两种 OTP 方法,使用户能够从业务角度选择最适合需求的解决方案。