动态密码卡TOTP算法

TOTP NET实现:http://googleauthcsharp.codeplex.com/

引用:http://www.cnblogs.com/wangxin201492/p/5030943.html

1. OTP

OTP(One-Time Password)译为一次性密码,也称动态口令。是使用密码技术实现的在客户端和服务器之间通过共享秘密的一种认证技术,是一种强认证技术,是增强目前静态口令认证的一种非常方便技术手段,是一种重要的双因素认证技术。

1.1 OTP的认证原理

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

1.3 OTP的实现方式

  1. 时间同步(TOTP)
  2. 事件同步(HOTP)
  3. 挑战/应答(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))$$
TOTPHOTP的一个变种,将HOTP中的计数器C替换为依托时间的参数T,T是由当前时间(CurrentUnixTime、初始时间(T0)、步长(X)决定的。即:

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

  • CurrentUnixTime:当前的Unix时间。
  • T0: 开始计步初始化时间,默认为0
  • X : 步长,默认情况下为30s

3.2 TOTP的要求

  1. 客户端和服务器必须能够彼此知道或者推算出对方的Unix Time
  2. 客户端和服务器端必须共享一个密钥
  3. 算法必须使用HOTP作为其关键实现环节
  4. 客户端和服务器端必须使用相同的步长X
  5. 每一个客户端必须拥有不同的密钥
  6. 密钥的生成必须足够随机
  7. 密钥必须储存在防篡改的设备上,而且不能在不安全的情况下被访问或使用。
  8. 对该算法中T的实现必须大于int32,因为它在2038年将超出上限。
  9. T0和X的协商必须在之前的步骤中就已经做好了。

3.3 安全性考虑

3.3.1 安全性分析

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

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

3.3.2 时延兼容

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

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

3.3.3 步长设置

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

    1. 一个越大的步长,就会导致一个越大的窗口被攻击。当一个动态密码被生成而且在其有效期内暴露在第三方环境下,那么第三方系统就可以在该动态密码无效前使用这个密码。
    2. 我们推荐默认的步长时间是30s,这个默认值是在权衡了安全性和可用性的基础上提出的。
    3. 下一个动态密码肯定会在下一个步长生成,用户必须等待当前步长的结束。这个等待时间的理想值会随着步长的设置而增大。一个太长的窗口设置不使用网络用户登录这种场景,用户可能等不了一个步长的时间,就放弃登录

转载于:https://www.cnblogs.com/50614090/p/5848409.html

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
TOTP(Time-Based One-Time Password)是一种基于时间的一次性密码算法,用于生成动态密码。它是基于HOTP(HMAC-Based One-Time Password)算法的扩展,通过结合时间戳和密钥生成密码,以提供更高的安全性。 以下是使用uniapp实现TOTP算法的示例代码: ```javascript // 导入js库 import jsSHA from 'jssha'; // 生成TOTP密码 function generateTOTP(secretKey) { // 获取当前时间戳 const timestamp = Math.floor(Date.now() / 1000); // 将时间戳转换为8字节的大端字节数组 const timeBytes = new Array(8); for (let i = 7; i >= 0; i--) { timeBytes[i] = timestamp & 0xff; timestamp >>>= 8; } // 使用HMAC-SHA1算法计算哈希值 const shaObj = new jsSHA('SHA-1', 'ARRAYBUFFER'); shaObj.setHMACKey(secretKey, 'ARRAYBUFFER'); shaObj.update(new Uint8Array(timeBytes)); const hmac = shaObj.getHMAC('ARRAYBUFFER'); // 获取哈希值的最后一个字节 const offset = hmac[hmac.length - 1] & 0xf; // 从哈希值中截取4个字节作为动态密码 const otp = ( ((hmac[offset] & 0x7f) << 24) | ((hmac[offset + 1] & 0xff) << 16) | ((hmac[offset + 2] & 0xff) << 8) | (hmac[offset + 3] & 0xff) ) % 1000000; // 将动态密码转换为6位字符串 const otpString = otp.toString().padStart(6, '0'); return otpString; } // 使用示例 const secretKey = 'JBSWY3DPEHPK3PXP'; // 密钥 const totp = generateTOTP(secretKey); console.log('TOTP密码:', totp); ``` 请注意,上述代码中使用了`jssha`库来计算HMAC-SHA1哈希值。在使用之前,需要先安装该库。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值