概念

TOTP算法(Time-based One-time Password algorithm)是一种从共享密钥和当前时间计算一次性密码的算法。 它已被采纳为Internet工程任务组标准RFC 6238,是Initiative for Open Authentication(OATH)的基石,并被用于许多双因素身份验证系统。
TOTP是基于散列的消息认证码(HMAC)的示例。 它使用加密哈希函数将密钥与当前时间戳组合在一起以生成一次性密码。 由于网络延迟和不同步时钟可能导致密码接收者必须尝试一系列可能的时间来进行身份验证,因此时间戳通常以30秒的间隔增加,从而减少了潜在的搜索空间。

算法描述

OTP基于具有时间戳计数器的OTP。
通过定义纪元(T0)的开始并以时间间隔(TI)为单位计数,将当前时间戳变为整数时间计数器(TC)。 例如:

  1. TC = floor,
  2. TOTP = HOTP(SecretKey,TC),
  3. TOTP-Value = TOTP mod 10d,其中d是一次性密码的所需位数。
    像google auth的二步认证使用了这种方式。

totp二步认证的过程我总结了一下

  1. 生成二维码,带有otpauth链接的google地址
  2. 生成公用密钥
  3. 返回给app,同时用户户和服务名也会返回,这时密钥是被base32加密过的,app存储,以后用这个密钥来生成6位校验码
  4. 服务端同时存储这个密钥和用户名,你可以把用户名当key,把密钥当value进行存储
  5. app每30秒生成一个6位校验码,用户使用这个码来网站进行登陆
  6. 服务器使用存储的密钥+fmac算法生成6位随机数,与客户端传来的数进行对比
  7. 两个码相等,授权成功,反之,失败.(注意,服务端可以根据当前登陆的用户名拿到它的密钥,有了密钥,再进行totp的算法生成校验码)

登陆的过程整理

  1. 用户和密码先登陆
  2. session里存储了用户名等信息
  3. 产生二维码及密钥,密钥存储到服务器的k/v介质里,k使用session里的用户名,v使用刚才的密钥
  4. 客户使用app扫二维码,产生新的6位数字
  5. 客户在用户名和密码登陆后,进行验证码页面,输入刚才的6位数字
  6. 提交到服务端,服务端根据用户名取出对应的密钥,然后使用totp算法生成6位数字
  7. 如果服务端与客户端数字相同,表示登陆成功!

totp核心算法

public static String generateTOTP(String key,String time,String returnDigits,String crypto){int codeDigits = Integer.decode(returnDigits).intValue();String result = null;// Using the counter// First 8 bytes are for the movingFactor// Compliant with base RFC 4226 (HOTP)while (time.length() < 16 )time = "0" + time;// Get the HEX in a Byte[]byte[] msg = hexStr2Bytes(time);byte[] k = hexStr2Bytes(key);byte[] hash = hmac_sha(crypto, k, msg);// put selected bytes into result intint 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);int otp = binary % DIGITS_POWER[codeDigits];result = Integer.toString(otp);while (result.length() < codeDigits) {result = "0" + result;}return result;}

在此我向大家推荐一个架构学习交流圈。交流学习微信:539413949(里面有大量的面试题及答案)里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化、分布式架构等这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

TOTP算法实现二步验证相关推荐

  1. PHP设置谷歌验证器(Google Authenticator)实现操作二步验证

    使用说明:开启Google的登陆二步验证(即Google Authenticator服务)后用户登陆时需要输入额外由手机客户端生成的一次性密码.实现Google Authenticator功能需要服务 ...

  2. Python 使用 PyOTP 实现二步验证

    二步验证 之前为服务器安装配置了 PVE 虚拟机系统,由于经常需要远程登陆以及通过 Web 进行管理,所以需要进一步提高安全性.PVE 提供了二步验证的功能,结合手机上的 FreeOTP 软件可以实现 ...

  3. 【SpringBoot】61、SpringBoot中使用谷歌身份验证器(Google Authenticator)实现二步身份验证

    Google 身份验证器 Google Authenticator 是谷歌推出的基于时间的一次性密码 (Time-based One-time Password,简称 TOTP),只需要在手机上安装该 ...

  4. 两步验证杀手锏:Java 接入 Google 身份验证器实战

    转载自   两步验证杀手锏:Java 接入 Google 身份验证器实战 什么是两步验证? 大家应该对两步验证都熟悉吧?如苹果有自带的两步验证策略,防止用户账号密码被盗而锁定手机进行敲诈,这种例子屡见 ...

  5. 【IoT】加密与安全:动态密码图解:HOTP 与 TOTP 算法

    1.简介 本文根据 RFC4226 和 RFC6238 文档,详细的介绍 HOTP 和 TOTP 算法的原理和实现. 两步验证已经被广泛应用于各种互联网应用当中,用来提供安全性. 对于如何使用两步验证 ...

  6. PHP实现谷歌验证器二次验证

    一.什么是谷歌身份验证器? 不少网站在登陆或者操作时都需要谷歌身份验证器(Google Authenticator),就是说在输入用户名和密码之后还需要输入一个动态密码,而这个动态密码由手机APP谷歌 ...

  7. 谷歌二次验证 Google Authenticator

    后台登录要搞令牌,类似于steam令牌.企鹅令牌等等 开启Google的登陆二步验证(即Google Authenticator服务)后用户登陆时需要输入额外由手机客户端生成的一次性密码. 实现Goo ...

  8. 关于Google身份验证器、基于时间的一次性密码 (TOTP)算法的初步了解

    一.Google Authenticator 1.概述 Google Authenticator是基于双因素身份验证 ( 2FA ) 的应用程序,有助于识别用户身份并确认用户声称自己是谁以及他是否真的 ...

  9. 用Abp实现两步验证(Two-Factor Authentication,2FA)登录(二):Vue网页端开发

    文章目录 发送验证码 登录 退出登录 界面控件 获取用户信息功能 项目地址 前端代码的框架采用vue.js + elementUI 这套较为简单的方式实现,以及typescript语法更方便阅读. 首 ...

最新文章

  1. Multiple substitutions specified in non-positional format; did you mean to add the formatted=”false”
  2. https://www.zhihu.com/question/41564604
  3. 吉大20春学期C语言程序设计作业二,吉大18春学期《C语言程序设计》在线作业二【答案】...
  4. Summary Ranges
  5. Farseer.Net ORM开源框架 V0.x 教程目录
  6. 定时备份windows机器上的文件到linux服务器上的操作梳理(rsync)
  7. SCCM2007系列教程之一SCCM2007的安装
  8. 10种防止网络被攻击的方法
  9. 《孙子兵法战场机变之军争篇》
  10. Vue中实现将页面生成微信二维码
  11. Jenkins ERROR: Server rejected the 1 private key(s)
  12. 逆函数求导公式_反三角函数求导公式的*1
  13. 羊了个羊, 听说这游戏很难
  14. 浏览器主页进来是hao123
  15. 操作系统生产者消费者问题实验报告
  16. 力扣算法学习计划打卡:第二天
  17. verilog实现有符号数求绝对值
  18. 【历史上的今天】10 月 18 日:Internet Explorer 7 正式发布;全球首家网络银行开业;“美版红白机” NES 诞生
  19. 基于MATLAB的人体行为检测与识别
  20. 30W pd快充方案PN8165+PN8307H兼容20W PD方案

热门文章

  1. python中在一个字符串中查找另一个字符串。实现一个字符串的find函数。
  2. 安徽理工大学计算机专业研究生好考吗,安徽理工大学研究生好考吗?有哪些不错的专业?...
  3. UE4中自定义的碰撞几何体使用注意事项
  4. 网络主机发送IP数据包过程
  5. 【译】Delta Lake 0.5.0介绍
  6. 《How to read a book》 书评和资源
  7. 【103期】面试技巧:面试的时候我只会聊项目,结果就把我挂了!
  8. 使用el-menu做侧边栏导航遇到需要点击两次菜单才展开
  9. 2047. 对布满灰尘的西洋棋宣告将军
  10. Kindle剩余空间变少