OTP动态令牌的原理

OTP动态令牌是一种新型的强身份认证的信息安全产品,由于其具有使用简单,携带方便,安全性高,美观时尚等优点,已经广泛应用在网银系统,电子办公系统,网络游戏,网络支付等众多领域。

OTP动态密码的产生主要是通过内置在硬件中不可导出的密钥与一个变化因子通过安全算法进行计算完成的。即:算法{密钥(也称为种子),动态因子(时间,事件,冲击响应......)}=OTP口令

算法

可以看到算法有两个输入因子:密钥和动态因子。算法的好坏也决定了OTP的安全程序,一般算法应该考虑几点因素:

权威性:一个算法是需要经过长时间的研发积累,经过长期广泛的市场验证才能够走向成熟。真正成熟算法的研究需要几年,甚至十几年的时间。

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

效率/耗电:OATH算法是国际OTP领域中公认的安全算法。

密钥

唯一性:每个动态令牌中的密钥都是唯一且不相同的,每个动态令牌与不同的用户绑定,那么该令牌中的密钥就代表这个用户的身份。

不可复制性:动态令牌硬件保证密钥不可导出,断电即毁。动态口令的计算在硬件内部完成。保证了密钥的安全。

产生/生产:两种模式保证了OTP密钥的唯一性:软实现(符合FIPS140-2标准),硬实现(使用国密办认证的硬件加密卡)。生产时密钥以密文的方式烧入到智能卡中(智能卡由专门的授权的人员负责,读卡器、通讯协议、COS都是自主研发,不公开),使用工控机烧入动态令牌密钥时,智能卡的COS会将烧入成功的密钥删除,所有的密钥烧录成功完成后,智能卡中就没有密钥了。

动态因子

动态因子可以有多种选择,目前较多使用的有如下3种:

a、时间型:以时间为变化因子。

b、事件型:以每次触发计算动态口令的计算事件行为为变化因子。

c、冲击响应:以服务器产生的随机数为变化因子。

目前国内以时间型最为流行。

附录

http://www.what21.com/sys/view/service_server-service_1456896340934.html

https://github.com/andOTP/andOTP

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是用 Java 生成动态令牌 OTP 的示例代码: ```java import java.util.Date; import java.util.Random; import javax.crypto.Mac; import javax.crypto.spec.SecretKeySpec; import org.apache.commons.codec.binary.Base32; public class OTPUtil { private static final int DIGITS = 6; private static final int PERIOD = 30; public static String generateOTP(String secretKey) { try { byte[] keyBytes = new Base32().decode(secretKey); // 获取当前时间戳,单位为秒 long timestamp = new Date().getTime() / 1000; // 计算时间戳的时间段 long counter = timestamp / PERIOD; // 将计数器转为字节数组 byte[] counterBytes = new byte[8]; for (int i = counterBytes.length - 1; i >= 0; i--) { counterBytes[i] = (byte) (counter & 0xff); counter >>= 8; } // 计算 HMAC-SHA1 哈希值 Mac mac = Mac.getInstance("HmacSHA1"); mac.init(new SecretKeySpec(keyBytes, "RAW")); byte[] hash = mac.doFinal(counterBytes); // 获取哈希值的低位 4 位字节 int offset = hash[hash.length - 1] & 0xf; int binary = ((hash[offset] & 0x7f) << 24) | ((hash[offset + 1] & 0xff) << 16) | ((hash[offset + 2] & 0xff) << 8) | (hash[offset + 3] & 0xff); // 对低位 4 位字节进行模运算 int otp = binary % (int) Math.pow(10, DIGITS); // 将 OTP 转为字符串 String otpStr = Integer.toString(otp); while (otpStr.length() < DIGITS) { otpStr = "0" + otpStr; } return otpStr; } catch (Exception e) { throw new RuntimeException(e); } } public static String generateSecretKey() { byte[] bytes = new byte[20]; new Random().nextBytes(bytes); return new Base32().encodeAsString(bytes); } } ``` 这段代码使用了 Google Authenticator 的算法,可以生成 6 位数字的动态令牌 OTP。其中 `generateSecretKey` 方法用于生成随机的密钥,可以将生成的密钥通过二维码等方式传递给用户,让用户将其添加到 Authenticator 应用中。`generateOTP` 方法用于根据密钥生成动态令牌 OTP,可以在用户登录、重置密码等需要验证身份的场景中使用。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

张驰Terry

知识源于创作热情,感谢你的支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值