密码学中的一次性密码 (OTP) 算法
身份验证,识别和验证个人的过程是授予对任何受保护服务(例如个人帐户)的访问权限之前的基本步骤。身份验证已内置于网络安全标准中,可防止未经授权访问受保护的资源。今天的身份验证机制在解锁任何受保护的信息之前创建了一个双层网关。
这种称为双因素身份验证的双层安全性创建了一种途径,该途径需要验证凭据(用户名/电子邮件和密码),然后创建和验证一次性密码 (OTP) 。 OTP 是在每个身份验证事件期间随机且唯一生成的数字代码。这增加了额外的安全层,因为每次尝试身份验证时生成的密码都是一组新的数字,并且它为下一个创建的会话提供了不可预测的质量。
交付 OTP 的两种主要方法是:
- 基于短信:
这很简单。这是在常规身份验证成功后通过文本消息传递 OTP 的标准程序。在这里,OTP 在服务器端生成并通过文本消息传递给验证者。这是跨服务遇到的最常见的 OTP 交付方法。 - 基于应用:
这种 OTP 生成方法是在用户端使用特定的智能手机应用程序完成的,该应用程序扫描屏幕上的二维码。应用程序负责唯一的 OTP 数字。与基于 SMS 的交付相比,这减少了 OTP 的等待时间并降低了安全风险。
由开放认证倡议 (OATH) 定义的生成 OTP 的最常见方式是基于时间的一次性密码 (TOTP) ,它是一种时间同步 OTP。在这些 OTP 系统中,时间是生成唯一密码的主要因素。
生成的密码是使用当前时间创建的,它还包含密钥。此 OTP 生成的一个示例是基于时间的 OTP 算法 (TOTP),如下所述:
- 后端服务器生成密钥
- 服务器与生成 OTP 的服务共享密钥
- 使用获得的密钥和时间生成基于哈希的消息认证码 (HMAC)。这是使用加密 SHA-1 算法完成的。
由于服务器和请求 OTP 的设备都可以访问时间,这显然是动态的,因此在算法中将其作为参数。在这里,考虑了与时区无关的 Unix 时间戳,即从 1970 年 1 月 1 日开始以秒为单位计算时间。让我们将“0215a7d8c15b492e21116482b6d34fc4e1a9f6ba”视为从 HMAC-SHA1 算法生成的字符串。
- 生成的代码长度为 20 个字节,因此被截断为适合用户输入的所需长度。这里使用动态截断。对于 20 字节的代码“0215a7d8c15b492e21116482b6d34fc4e1a9f6ba”,每个字符占用 4 位。整个字符串被视为 20 个单独的一个字节字符串。
我们看最后一个字符,这里是a。取其十进制值来确定开始截断的偏移量。从偏移值开始,读取接下来的 10 个 31 位,得到字符串“6482b6d3”。剩下要做的最后一件事是取我们的十六进制数值,并将其转换为十进制,得到 1686288083。
我们现在需要的是获得的十进制字符串的最后一个期望的 OTP 数字长度,必要时补零。这很容易通过取十进制字符串来完成,模 10 ^ OTP 中所需的位数。我们最终以“288083”作为我们的 TOTP 代码。
- 计数器用于跟踪经过的时间并在设定的时间间隔后生成新代码
- 生成的 OTP 通过上述方法交付给用户。
除了上述基于时间的方法之外,还存在某些用于生成 OTP 的数学算法,例如从先前创建的 OTP 创建后续 OTP 的单向函数。
双因素身份验证系统是一种有效的策略,它利用了“你知道的东西”和“你拥有的东西”的身份验证原则。一次性密码算法实现的后一个原则的动态特性对安全性至关重要,并提供了一个针对恶意攻击者的有效保护层。 OTP 的不可预测性阻碍了剥离这种加密方法必须提供的层。