java 双因素认证(2FA)TOTP demo
时间:2018-08-06
本文章向大家介绍java 双因素认证(2FA)TOTP demo,需要的朋友可以参考一下。
TOTP 的全称是"基于时间的一次性密码"(Time-based One-time Password)。它是公认的可靠解决方案,已经写入国际标准 RFC6238。
很早就知道有这个东西了,一直不知道是怎么实现的.
比如 QQ 安全中心的密钥,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 = "0123456789abcdef".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();
}
}
- 【Spring实战】—— 13 AspectJ注解切面
- EasyUI日期选择框
- Java基础03 构造器与方法重载
- web.xml is missing and <failOnMissingWebXml> is set to true
- 【Spring实战】—— 11 通过AOP为特定的类引入新的功能
- 使用Maven创建web项目
- 纸上谈兵: 树, 二叉树, 二叉搜索树
- 【Spring实战】—— 9 AOP环绕通知
- 陈辉:蘑菇街技术架构规划与成长
- JavaSE(二)之继承、封装、多态
- 人与人工智能机器人,究竟谁更聪明?
- 【Spring实战】—— 10 AOP针对参数的通知
- 纸上谈兵: AVL树
- 基于配置的Spring AOP
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- DB2 Linux平台安装 Part 3 实例的建立与配置
- C++核心准则Con.2:默认情况下,将成员函数定义为const类型
- C++核心准则Con.3:默认情况下,传递参照常量的指针或引用
- C++核心准则Con.4:如果一个对象在构建之后值不会改变,使用const定义它
- C++核心准则Con.5:对于可以在编译时计算的值,使用constexpr进行声明
- DB2 Linux平台安装 Part 4 创建数据库
- VBA编写Ribbon Custom UI编辑器03——认识Ribbon的xml
- VBA编写Ribbon Custom UI编辑器04——解析xml
- VBA编写Ribbon Custom UI编辑器05——转换结构体XML
- MySQL 8.0.19 Linux平台安装 Part 1
- MySQL 8.0.19 Linux平台安装 Part 2
- 使用XtraBackup备份MySQL 8.0 Part 1 xtrabackup 8.0 安装
- 10个解放双手的 IDEA 插件,少些冤枉代码!
- 二叉树的 4 种遍历方式,你会多少?
- 【C++简明教程】Python和C++指定元素排序比较