TOTP NET实现:http://googleauthcsharp.codeplex.com/
引用:http://www.cnblogs.com/wangxin201492/p/5030943.html
1. OTP
OTP(One-Time Password)
译为一次性密码,也称动态口令。是使用密码技术实现的在客户端和服务器之间通过共享秘密的一种认证技术,是一种强认证技术,是增强目前静态口令认证的一种非常方便技术手段,是一种重要的双因素认证技术。
1.1 OTP的认证原理
动态口令的基本认证原理是在认证双方共享密钥,也称种子密钥,并使用的同一个种子密钥对某一个事件计数、或时间值、或者是异步挑战数进行密码算法计算,使用的算法有对称算法
、HASH
、HMAC
,之后比较计算值是否一致进行认证。可以做到一次一个动态口令,使用后作废,口令长度通常为6-8个数字,使用方便,与通常的静态口令认证方式类似.
1.3 OTP的实现方式
- 时间同步(
TOTP
) - 事件同步(
HOTP
) - 挑战/应答(
OCRA
)
2. HOTP
HOTP(HMAC-base On-Time Password)
译为基于HMAC的一次性密码,也称事件同步的动态密码。
2.1 HOTP的工作原理
$$ HTOP(K,C) = Truncate(HMAC-SHA-1(K,C))$$
客户端和服务器事先协商好一个密钥K
,用于一次性密码的生成过程。此外,客户端和服务器各有一个计数器C
,并且事先将计数值同步。而Truncate
是为了获得一个符合HTOP
要求的值。
3 TOTP
TOTP(Time-base One-Time Password)
译为基于时间的一次性密码,也称时间同步的动态密码.
3.1 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
: 开始计步初始化时间,默认为0X
: 步长,默认情况下为30s
3.2 TOTP的要求
- 客户端和服务器必须能够彼此知道或者推算出对方的Unix Time
- 客户端和服务器端必须共享一个密钥
- 算法必须使用HOTP作为其关键实现环节
- 客户端和服务器端必须使用相同的步长X
- 每一个客户端必须拥有不同的密钥
- 密钥的生成必须足够随机
- 密钥必须储存在防篡改的设备上,而且不能在不安全的情况下被访问或使用。
- 对该算法中T的实现必须大于
int32
,因为它在2038年将超出上限。 - T0和X的协商必须在之前的步骤中就已经做好了。
3.3 安全性考虑
3.3.1 安全性分析
该算法的安全性和健壮性完全依赖于其关键实现环节HOTP
。
安全性分析的结果是:在所有的测试中,该算法的结果均匀的、独立的分布。这个分析显示,最好的攻击和破解TOTP(HOTP)
的方法是暴力破解。而在算法要求环节,要求key必须有足够的随机性。
3.3.2 时延兼容
在同一个步长内,动态密码生成的结果是一样的。当一个验证系统获得这个动态密码的时候,它并不知道动态密码的生产者是在哪个步长内产生的密码。由于网络的原因,客户端生成密码的时间和服务器接受密码的时间可能差距会很大,很有可能使得这2个时间不在同一个步长内。当一个动态密码产生在一个步长的结尾,服务器收到的密码很有可能在下一个步长的开始。
验证系统应该设置一个策略允许动态密码的传输时延,不应该只验证当前步长的动态密码,还应该验证之前几个步长的动态密码。但越大的传输时延窗口设置,就会带来越大的风险被攻击,我们推荐最多设置一个时延窗口来兼容传输延时。
3.3.3 步长设置
步长大小的设置,直接影响安全性和可用性:
-
-
- 一个越大的步长,就会导致一个越大的窗口被攻击。当一个动态密码被生成而且在其有效期内暴露在第三方环境下,那么第三方系统就可以在该动态密码无效前使用这个密码。
- 我们推荐默认的步长时间是
30s
,这个默认值是在权衡了安全性和可用性的基础上提出的。 - 下一个动态密码肯定会在下一个步长生成,用户必须等待当前步长的结束。这个等待时间的理想值会随着步长的设置而增大。一个太长的窗口设置不使用网络用户登录这种场景,用户可能等不了一个步长的时间,就放弃登录
-