当前位置: 首页 > news >正文

【SOLUTION】Java 生成 TOTP 验证码

OTP服务即:一次性密码服务,他有两种方式:

  • HOTP:基于计数器的一次性密码服务,设备必须和服务端保同步计数器和约定共享密钥、算法,否则验证不通过
  • TOTP:基于时间的一次性密码服务:设备和服务端约定时间的窗口期、共享密钥、算法;这种方法只需要确保客户端和服务端的时间是一致的就行(推荐)

TOTP是现在使用最多的,因为不需要和服务器持续交互,只需要保持系统时间是一致的就行,所以本文主要讲解如何生成当前时间下的TOTP验证码:如下代码

@Override
public void createCode(TotpInfo info) {// 共享时间String secretKey = 'xxxxxxxxxx';	// 刷新间隔时间,单位:秒Integer interval =30;Date date = new Date();// 这里可以理解为和HOTP一样,计算当前可生成验证码的次数long time = date.getTime() / (interval * 1000);byte[] data = new byte[8];for (int i = 8; i-- > 0; time >>>= 8) {data[i] = (byte) time;}// HMACSHA1 算法,先通过Base32解码共享密钥HMac sha1 = SecureUtil.hmacSha1(Base32.decode(secretKey));// 获取时间摘要byte[] hash = sha1.digest(data);int offset = hash[hash.length - 1] & 0xF;long truncatedHash = 0;for (int i = 0; i < 4; ++i) {truncatedHash <<= 8;truncatedHash |= (hash[offset + i] & 0xFF);}truncatedHash &= 0x7FFFFFFF;truncatedHash %= 1000000;// 格式化codeString code=String.format("%06d", truncatedHash)}

注意:

  1. TOTP二维码内容格式如下:
    • issuer: 颁发组织
    • account:用户名称
    • secretKey:共享密钥
# 不同的系统需要使用不同的issuer,防止account重复
otpauth://totp/{issuer}:{account}?secret={secretKey}&issuer={issuer}
  1. 共享密钥在每次重置TOTP绑定时,都会重新生成,防止之前的设备对重置后的TOTP依旧有效
http://www.xdnf.cn/news/716095.html

相关文章:

  • 政策与数字双赋能驱动:ERP助力外贸企业高质量发展路径解析
  • Maven-生命周期
  • 信创采购热潮下的隐忧:单一技术路线的市场垄断之困
  • Oracle RMAN自动恢复测试脚本
  • mongodb的安装使用
  • 20250529-C#知识:分部类和分部方法
  • 小白畅通Linux之旅-----Linux日志管理
  • 【芯片设计中的交通网络革命:Crossbar与NoC架构的博弈C架构的博弈】
  • 在Linux环境里面,Python调用C#写的动态库,如何实现?
  • Java集合操作常见错误与最佳实践
  • OSCP备战-SickOs1.2靶场详细步骤
  • 第九章 MQTT报文
  • C primer plus (第六版)第六章 编程练习第10题
  • 关于《DAHSF》即《火小兔智慧开发平台V2.0》的碎碎念
  • ADC同步采样
  • XMOS以全新智能音频及边缘AI技术亮相广州国际专业灯光音响展
  • 【NebulaGraph】查询案例(七)
  • 两个频率比较接近的简谐振动叠加后会产生拍形
  • C#学习:基于LLM的简历评估程序
  • 4. 算法与分析 (1)
  • 【Dify系列教程重置精品版】第十一章:Dify与slenium
  • Flutter下的一点实践
  • 手动移植FreeRTOS
  • 用 Python 模拟雪花飘落效果
  • Oracle 临时表空间详解
  • Oracle的NVL函数
  • 前端面试题-HTML篇
  • C++:栈帧、命名空间、引用
  • 第三章:地下三层的技术遗产
  • JaCoCo 是什么