安全开发:身份认证方案之 Google 身份验证器和基于时间的一次性密码 TOTP 算法

news2024/12/26 23:03:20
  • 参考资料在文末注明,如本文有错漏欢迎评论区指出👏

目前很多应用都逐步采用了双因子认证或者说MFA认证方案,因此本文介绍一下背后的机制和TOTP算法原理。使用TOTP算法,只要满足两个条件:1)基于相同的密钥;2)时钟同步;只需要事先约定好密钥,TOTP算法就可以保证校验段和被校验端具有相同的输出。

OTP

在介绍 TOTP 算法前,先介绍一下 OTP 算法。OTP,One Time Password,又称一次性口令、一次性密码、动态密码、单次有效密码。OTP 基于专门的算法每隔一定的时间间隔生成一个不可预测的随机数字组合。OTP密码有效期仅在一次会话或者交易过程中,因此不容易受到重放攻击。OTP分为计次使用和计时使用两种,计次使用的OTP产出后,可在不限时间内使用。计时使用的 OTP 需要设置密码有效时间,从30秒到两分钟不等,而 OTP 在进行认证之后即废弃不用,下次认证必须使用新的密码,降低了不经授权访问限制资源可能性。

OTP密码进一步分为:

  • HOTP:HMAC-based One-Time Password ,基于 HMAC 算法的一次性密码。事件同步,通过某一特定的事件次序及相同的种子值作为输入,通过 HASH 算法运算出一致的密码。
  • TOTP:Time-based One-Time Password写,基于时间戳算法的一次性密码。 时间同步,基于客户端的动态口令和动态口令验证服务器的时间比对,一般每 30 秒产生一个新口令,要求客户端和服务器能够十分精确的保持正确的时钟,客户端和服务端基于时间计算的动态口令才能一致。

计算 OTP 串的公式:OTP(K,C) = Truncate(HMAC-SHA-1(K,C))
K 表示秘钥串;C 为随机数;HMAC-SHA-1 表示使用 SHA-1 做 HMAC;Truncate 表示怎么截取加密后的串,并取加密后串的哪些字段组成一个数字;

对 HMAC-SHA-1 方式加密来说,Truncate 实现如下:
HMAC-SHA-1 加密后的长度得到一个 20 字节的密串;取这个 20 字节的密串的最后一个字节,取这字节的低 4 位,作为截取加密串的下标偏移量;按照下标偏移量开始,获取4个字节,按照大端方式(符合人类习惯的形式,比如 0x12 34 , 0x12 存放在低地址,大端即大端在前/高位在低地址存放的意思)组成一个整数;截取这个整数的后 6 位或者 8 位转成字符串返回。

TOTP 将其中的参数 C 变成了由时间戳产生的数字:C = (T - T0) / X; T 表示当前 Unix 时间戳:T0 一般取值为 0,也就是 1970 年 1 月 1 日。X 表示时间步数,也就是说多长时间产生一个动态密码,这个时间间隔就是时间步数 X,系统默认是 30 秒;

一个信息系统要集成 OTP 的认证方式,需要完成以下的工作:
1、开发手机令牌
2、开发认证的服务端,服务端需要完成令牌种子生成、令牌种子分发、动态口令生成等功能。
3、在OTP认证的服务端需要将业务系统的用户与分发的令牌建立关联,这样才能完成最终的登录验证。

TOTP


TOTP 算法(Time-based One-time Password algorithm) 即基于具有时间戳计数器的 OTP。通过定义纪元(T0)的开始并以时间间隔(TI)为单位计数,将当前时间戳变为整数时间计数器(TC)。TOTP 实现可以使用 HMAC-SHA-256 或HMAC-SHA-512 (基于 SHA-256 或 SHA-512)函数来实现,而不是 HOTP 计算中的 HMAC-SHA-1 函数【注:SHA1 存在 HASH 碰撞】。

TOTP 密码生成过程

  1. 初始化:用户在服务提供商(如 Google 等)注册账户时,服务提供商(服务器)会为用户生成一个 密钥(Secret Key) 并保存在数据中。然后把这个密钥会以某种方式(通常是 二维码 )分享给用户,用户将其添加到(通过扫码)自己的身份验证器应用(如 Google Authenticator、Microsoft Authenticator)中。
  2. 生成 TOTP:身份验证器应用会按照固定的时间间隔(常见的是 30 秒)使用 HMAC-SHA1 算法,使用当前的时间戳和在初始化步骤中获取的密钥,生成一个新的一次性密码,这个密码通常是一个 6 位数字(但也可能更长或更短)。
  3. 验证 TOTP:当用户尝试登录或执行需要验证的操作时,会被要求提供当前的一次性密码。用户从自己的身份验证器应用中获取这个密码,并输入到服务提供商的网站或应用中。服务提供商会使用同样的算法和密钥,以及当前的时间戳,生成一个一次性密码,并将其与用户提供的密码进行比较。如果两个密码匹配,那么用户的身份就被认为已经验证。

基于 Node.js 实现支持 Google 身份验证器的 TOTP 算法

import { Secret, TOTP } from 'otpauth';

// 生成密钥
const secret = Secret.fromUTF8('your_secret_key'); 

// 生成TOTP实例
const totp = new TOTP({
  secret,
  issuer: 'Example',
  label: 'alice@example.com'  
});

// 生成token
const token = totp.generate();  // 30s
console.log('totp token:')
console.log(token);

// 验证token
const isValid = totp.validate({
  token,
  window: 1  // 一个窗口为一个 period
});

if(isValid !== null) {
  console.log('Valid token'); 
} else {
  console.log('Invalid token');
}

// 转成uri格式
const uri = totp.toString(); 
console.log(uri);

Reference

  1. Google身份验证器、基于时间的一次性密码 (TOTP)算法
  2. OTP概念及实现原理简析
  3. 基于时间的一次性密码 TOTP 详解
  4. 密码学I:密码系统、OTP密码和密码的安全性
  5. 一文搞懂 OTP 双因素认证
  6. 使用 Golang 实现基于时间的一次性密码 TOTP
  7. 基于 Node 实现 TOTP:Otplib

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1302097.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

RocketMQ源码

RocketMQ的核心三流程 启动流程 RocketMQ服务端由两部分组成NameServer和Broker,NameServer是服务的注册中心,Broker会把自己的地址注册到NameServer,生产者和消费者启动的时候会先从NameServer获取Broker的地址,再去从Broker发…

BEUEC品牌比例阀放大器厂家

HE-SP1/HE-SP2/HE-SP2-U/HE-MPS1/HE-MPS2/HE-MAPQ-V/HE-MAPQ-K/HE-MPT2-Y/HE-MPT2-U比例放大器适配控制各种不带位置反馈比例阀; BEUEC品牌比例放大器控制如博世力士乐(Bosch Rexroth)、伊顿威格士(EATON Vickers)、油…

shiro入门demo

搭建springboot项目&#xff0c;引入以下依赖&#xff1a; <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--单元测试--><depe…

[CIKM 2023] 基于会话推荐的双通道多稀疏图注意网络

Bi-channel Multiple Sparse Graph Attention Networks for Session-based Recommendation GitHub - QEpiphany/MSGAT: Multiple Sparse Graph Attention Networks for Session-based Recommendation 摘要 基于会话的推荐&#xff08;SBR&#xff09;最近受到了极大的关注&…

安装程序无法自动安装Virtual Machine Communication Interface Sockets(VSock)驱动程序

环境情况&#xff1a; 物理机win10系统 虚拟机windowserver08系统 vmware 16.0的版本 问题触发&#xff1a; 在虚拟机win7系统上安装vmware tools出现提示&#xff0c;报错信息“安装程序无法自动安装Virtual Machine Communication Interface Sockets&#xff08;VSock&a…

iPhone 数据恢复:iMyFone D-Back iOS

iMyFone D-Back iOS 最佳 iPhone 数据恢复&#xff0c;最好的 iPhone 数据恢复软件&#xff0c;恢复成功率最高。 直接从iOS设备、iTunes/iCloud/第三方程序备份快速恢复数据。 有选择地恢复已删除的照片、WhatsApp、消息和 18 多种其他数据类型。 仅通过 iCloud 帐户访问即可从…

jmeter 压测需要的部分配置

修改jmeter 目录的bin目录下的jmeter.properties文件 解除KeepAlive设置 修改接口的高级中的实现和超时 解除httpclient4.retrycount前的注释符并将0修改为1 即修改为&#xff1a;httpclient4.retrycount1 解除httpclient4.idletimeout前的注释符并修改为合适间隔 即修改为…

java--Arrays类、自定义排序规则Comparable、自定义比较器Comparator

1.Arrays 用来操作数组的一个工具类。 2.Arrays类提供的常见方法 3.如果数组中存储的是对象&#xff0c;如何排序 方法一&#xff1a;让该对象的类实现Comparable(比较规则)接口&#xff0c;然后重写CompareTo方法&#xff0c;自己来定制比较规则。 方法二&#xff1a;使用下…

​ 轻量应用服务器:亚马逊云科技打造全球领先的云计算解决方案

随着“第四次工业革命”的爆炸式发展&#xff0c;众多企业都将自己的业务与迅速发展的应用开发和网站建设领域高度绑定。而对于众多有上云需求的企业和个人用户来说&#xff0c;选择一款自己的服务器配置就成为了一项至关重要的任务。而随着需求端的不断扩大&#xff0c;云服务…

ssm基于HTML5的出租车管理系统论文

摘 要 网络技术和计算机技术发展至今&#xff0c;已经拥有了深厚的理论基础&#xff0c;并在现实中进行了充分运用&#xff0c;尤其是基于计算机运行的软件更是受到各界的关注。加上现在人们已经步入信息时代&#xff0c;所以对于信息的宣传和管理就很关键。因此出租车信息的管…

工业级路由器在货运物流仓储管理中的应用

工业级路由器在货运物流仓储管理中扮演着重要的角色&#xff0c;为整个物流系统提供了稳定可靠的网络连接和数据传输支持。下面将从以下几个方面介绍工业级路由器在货运物流仓储管理中的应用。 实时监控和追踪&#xff1a;工业级路由器通过与各种传感器、监控设备和物联网设备的…

〖Python网络爬虫实战㊷〗- 极验滑块介绍(四)

订阅&#xff1a;新手可以订阅我的其他专栏。免费阶段订阅量1000 python项目实战 Python编程基础教程系列&#xff08;零基础小白搬砖逆袭) 说明&#xff1a;本专栏持续更新中&#xff0c;订阅本专栏前必读关于专栏〖Python网络爬虫实战〗转为付费专栏的订阅说明作者&#xff1…

Vue项目使用Sortable.js实现拖拽功能

想了解更多-可前往 Sortable.js官网 查看组件属性及参数 安装组件&#xff08;我这里使用的是NPM安装&#xff09; npm install sortablejs --save在需要使用拖拽功能的页面中使用&#xff08;完整功能代码&#xff09; <div class"tag_box"><div class&q…

十六、机器学习进阶知识:线性回归与逻辑回归算法

文章目录 1、线性回归1.1 一元线性回归及实例1.2 多元线性回归及实例 2、逻辑回归2.1 逻辑回归与线性回归的区别2.2 逻辑函数2.3 逻辑回归的概念2.4 损失函数及参数的确定2.6 逻辑回归实例 1、线性回归 回归分析&#xff08;Regression Analysis&#xff09;是确定两种或两种以…

学习 NVIDIA Omniverse 的最基础概念

无用的前言 近两年关于 Omniverse 的宣传一直很多&#xff0c;可我一直没去了解&#xff0c;连它是个啥都不知道。最近正好有契机需要了解它&#xff0c;于是我今天抽时间看了些它的官方介绍&#xff0c;并按照自己的理解梳理在这里。 官方资料索引 Omniverse 官网主页&…

HashMap常见面试问题

简述HashMap原理&#xff1f; HashMap基于数组加链表的方式来实现&#xff0c;数组下标通过hash值来计算&#xff0c;当下表冲突时&#xff0c;就会进行遍历链表&#xff0c;当链表长度大于8的时候会转化为红黑树。 HashMap的put过程&#xff1f; put的第一步是计算hash值&a…

自定义异步任务管理器和线程

import com.lancoo.common.utils.Threads; import com.lancoo.common.utils.spring.SpringUtils;import java.util.TimerTask; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit;/*** 异步任务管理器* * author lancoo*/ public c…

apisix下自定义 Nginx 配置

apisix下自定义 Nginx 配置 在apisix配置文件/conf/config.yaml中添加nginx配置。生成的nginx.conf配置文件如下&#xff1a;说明&#xff1a; APISIX 会通过 apisix/cli/ngx_tpl.lua 这个模板和 conf/config-default.yaml 加 conf/config.yaml 的配置生成 Nginx 配置文件。 在…

如果将视频转化为gif格式图

1.选择视频转换GIF&#xff1a; 2.添加视频文件&#xff1a; 3.点击“开始”&#xff1a; 4.选择设置&#xff0c;将格式选择为1080P更加清晰&#xff1a; 5.输出后的效果图&#xff1a;

传统渠道与互联网新零售较量中:2023年之后电商如何引流裂变?

传统渠道与互联网新零售较量中&#xff1a;2023年之后电商如何引流裂变&#xff1f; 互联网新零售是指通过互联网技术和数据驱动&#xff0c;打造以消费者为中心、以线上线下融合为特点的全新零售模式&#xff0c;也是近年来电商行业转型升级的必然趋势。目前普通市场竞争激烈…