您的位置:首页 > 编程语言 > PHP开发

OTP算法

2016-09-19 10:34 239 查看


简介

OTP全称是One-Time-Password,也称动态口令,是根据专门的算法每隔一定时间(例如:60秒)生成一个与时间相关的、不可预测的随机数字组合,每个口令只能使用一次,每天可以产生43200个密码。

它使用密码技术实现的在客户端和服务器之间通过共享秘密的一种认证技术,是一种强认证技术,是增强目前静态口令认证的一种非常方便的技术手段,是一种重要的双因素认证技术。


认证原理

动态口令的基本认证原理是在认证双方共享密钥,也称种子密钥,并使用同一个种子密钥对某一个事件计数、或时间值、或者是异步挑战数进行密码算法计算,使用的算法有对称算法、HASH、HMAC,之后比较计算值是否一致进行认证。可以做到一次一个动态口令,使用后作废,口令长度通常为6-8个数字,使用方便,与通常的静态口令认证方式类似。

通俗讲,动态密码的产生,主要是通过内置在硬件中不可导出的秘钥与一个变化因子通过安全算法进行计算完成的。动态因子通常有时间,事件,点击响应等。


权威性

一个算法是需要经过长时间的研发积累,经过长期广泛的市场验证才能够走向成熟。真正成熟算法的研究需要几年,甚至十几年的时间。坚石诚信ET系列动态令牌采用OTP领域中公认的最具权威的OATH国际组织的安全算法。算法的安全性得到了有效保障。自定义算法未被广泛验证和认可,安全性是一个未知数。


安全性

OTP的算法一般不采用对称加解密算法,如:3DES,AES等。而采用单向散列算法。原因是这样的,拿时间型令牌说明,密钥+时间(动态因子)=OTP,时间是知道的,每分钟产生的动态口令能通过硬件知道,3DES算法也是公开的,这样就有反推出密钥的可能性。而单向散列算法,即使知道通算法计算的结果OTP,由于算法保证单向,那么从根本上就断绝了反推密钥的途径。


实现方式

时间同步(TOTP)

事件同步(HOTP)

挑战 / 应答(OCRA)


HOTP

HOTP(HMAC-base On-Time Password)译为基于HMAC的一次性密码,也称事件同步的动态密码。

HOTP的工作原理


$$ HTOP(K,C) = Truncate(HMAC-SHA-1(K,C))$$

客户端和服务器事先协商好一个密钥K,用于一次性密码的生成过程。此外,客户端和服务器各有一个计数器C,并且事先将计数值同步。而Truncate是为了获得一个符合HTOP要求的值。


TOTP

TOTP(Time-base One-Time Password)译为基于时间的一次性密码,也称时间同步的动态密码.

TOTP的工作原理

$$TOTP = Truncate(HMAC-SHA-1(K,T))$$

TOTP是HOTP的一个变种,将HOTP中的计数器C替换为依托时间的参数T,T是由当前时间(CurrentUnixTime、初始时间(T0)、步长(X)决定的。即:

$$ T = (Current Unix time - T0) / X $$

CurrentUnixTime:当前的Unix时间。

T0: 开始计步初始化时间,默认为0

X : 步长,默认情况下为30s

TOTP的要求

客户端和服务器必须能够彼此知道或者推算出对方的Unix Time

客户端和服务器端必须共享一个密钥

算法必须使用HOTP作为其关键实现环节

客户端和服务器端必须使用相同的步长X

每一个客户端必须拥有不同的密钥

密钥的生成必须足够随机

密钥必须储存在防篡改的设备上,而且不能在不安全的情况下被访问或使用。

对该算法中T的实现必须大于int32,因为它在2038年将超出上限。

T0和X的协商必须在之前的步骤中就已经做好了。


安全性考虑


安全性分析

该算法的安全性和健壮性完全依赖于其关键实现环节HOTP。

安全性分析的结果是:在所有的测试中,该算法的结果均匀的、独立的分布。这个分析显示,最好的攻击和破解TOTP(HOTP
b955
)的方法是暴力破解。而在算法要求环节,要求key必须有足够的随机性。


时延兼容

在同一个步长内,动态密码生成的结果是一样的。当一个验证系统获得这个动态密码的时候,它并不知道动态密码的生产者是在哪个步长内产生的密码。由于网络的原因,客户端生成密码的时间和服务器接受密码的时间可能差距会很大,很有可能使得这2个时间不在同一个步长内。当一个动态密码产生在一个步长的结尾,服务器收到的密码很有可能在下一个步长的开始。

验证系统应该设置一个策略允许动态密码的传输时延,不应该只验证当前步长的动态密码,还应该验证之前几个步长的动态密码。但越大的传输时延窗口设置,就会带来越大的风险被攻击,我们推荐最多设置一个时延窗口来兼容传输延时。


步长设置

步长大小的设置,直接影响安全性和可用性:

一个越大的步长,就会导致一个越大的窗口被攻击。当一个动态密码被生成而且在其有效期内暴露在第三方环境下,那么第三方系统就可以在该动态密码无效前使用这个密码。

我们推荐默认的步长时间是30s,这个默认值是在权衡了安全性和可用性的基础上提出的。

下一个动态密码肯定会在下一个步长生成,用户必须等待当前步长的结束。这个等待时间的理想值会随着步长的设置而增大。一个太长的窗口设置不使用网络用户登录这种场景,用户可能等不了一个步长的时间,就放弃登录。 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  OTP TOTP HOTP