双因素认证java_java 双因素认证(2FA)TOTP demo

双因素认证java_java 双因素认证(2FA)TOTP demoTOTP 的全称是 基于时间的一次性密码 Time basedOne timePassword 它是公认的可靠解决方案 已经写入国际标准 RFC6238 很早就知道有这个东西了 一直不知道是怎么实现的 比如安全中心的密钥 U 盾 就是动态密码之类的 今天看到阮一峰老师的博客才知道实现原理 概念性的东西参考 http www ruanyifeng com blog 2017 11 2

TOTP 的全称是”基于时间的一次性密码”(Time-based One-time Password)。它是公认的可靠解决方案,已经写入国际标准 RFC6238。

很早就知道有这个东西了,一直不知道是怎么实现的.

比如 安全中心的密钥,U盾,就是动态密码之类的.

今天看到阮一峰老师的博客才知道实现原理.

概念性的东西参考

http://www.ruanyifeng.com/blog/2017/11/2fa-tutorial.html

实现代码:

package totp;

import java.security.MessageDigest;

import java.util.Date;

import java.util.UUID;

import java.util.regex.Matcher;

import java.util.regex.Pattern;

public class TOTP {

// TC = floor((unixtime(now) − unixtime(T0)) / TS)

// TC = floor(unixtime(now) / 30)

// TOTP = HASH(SecretKey, TC)

private static final char[] HEX_DIGITS = “0abcdef”.toCharArray();

public static void main(String[] args) {

Pattern pattern = Pattern.compile(“\\d”);

String key = UUID.randomUUID().toString().replace(“-“, “”);

for (int i = 0; i < 70; i++) {

String TC = String.valueOf((int) Math.floor(new Date().getTime() / 1000 / 30));

String TOTP = sha1(TC + key);

Matcher matcher = pattern.matcher(TOTP);

String result = “”;

while (matcher.find()) {

result += matcher.group();

}

result = result.substring(result.length() – 6);

System.out.println(i + ” — ” + result);

try {

Thread.sleep(1000);

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

public static String sha1(String srcStr) {

return hash(“SHA-1”, srcStr);

}

public static String hash(String algorithm, String srcStr) {

try {

MessageDigest md = MessageDigest.getInstance(algorithm);

byte[] bytes = md.digest(srcStr.getBytes(“utf-8”));

return toHex(bytes);

} catch (Exception e) {

throw new RuntimeException(e);

}

}

public static String toHex(byte[] bytes) {

StringBuilder ret = new StringBuilder(bytes.length * 2);

for (int i = 0; i < bytes.length; i++) {

ret.append(HEX_DIGITS[(bytes[i] >> 4) & 0x0f]);

ret.append(HEX_DIGITS[bytes[i] & 0x0f]);

}

return ret.toString();

}

}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/225858.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 上午8:23
下一篇 2026年3月17日 上午8:23


相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号