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

  • 参考资料在文末注明,如本文有错漏欢迎评论区指出👏

目前很多应用都逐步采用了双因子认证或者说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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

HTML行内元素和块级元素的区别? 分别有哪些?

目录 一、行内元素和块级元素的区别二、行内元素和块级元素分别有哪些1、行内元素2、块级元素 一、行内元素和块级元素的区别 1、行内元素不会占据整行,在一条直线上排列,都是同一行,水平方向排列;    2、块级元素可以包含行内…

订单接入支付宝流程实战与优化

概述 了解支付宝支付能力接入方式。电商项目如何对支付流程进行设计及优化。基于 RocketMQ 事务消息实现的订单确认机制,来完成订单超时回退功能。 支付宝接入流程简介 国内目前有支付牌照的公司总共只有两百来家,比如支付宝、云闪付、和包支付、翼支…

《PySpark大数据分析实战》-02.了解Hadoop

📋 博主简介 💖 作者简介:大家好,我是wux_labs。😜 热衷于各种主流技术,热爱数据科学、机器学习、云计算、人工智能。 通过了TiDB数据库专员(PCTA)、TiDB数据库专家(PCTP…

Flutter:web项目跨域问题解决

前后端解决系列 文章目录 一、Flutter web客户端解决本地环境调试跨域问题二、Flutter web客户端解决线上环境跨域问题 一、Flutter web客户端解决本地环境调试跨域问题 就一句命令【--web-browser-flag "--disable-web-security"】,用来屏蔽浏览器域名请…

axios 基础的 一次封装 二次封装

一、平常axios的请求发送方式 修改起来麻烦的一批 代码一大串 二、axios的一次封装 我们会在src/utils创建一个request.js的文件来存放我们的基地址与拦截器 /* 封装axios用于发送请求 */ import axios from axios/* (1)request 相当于 Axios 的实例对象 (2)为什么要有reque…

件夹和文件比较软件VisualDiffer mac功能介绍

VisualDiffer mac是一款运行在MacOS上的文件夹和文件快速比较工具。VisualDiffer可以对不同文件夹中文件或文档做出比较或者比较两个文件的路径。还可以通过UNIS diff命令快速、标准和可靠的比较出各类不同的文件夹和文件结果,使用不同的颜色直观地显示。 VisualDif…

西南科技大学数字电子技术实验四(基本触发器逻辑功能测试及FPGA的实现)预习报告

一、计算/设计过程 说明:本实验是验证性实验,计算预测验证结果。是设计性实验一定要从系统指标计算出元件参数过程,越详细越好。用公式输入法完成相关公式内容,不得贴手写图片。(注意:从抽象公式直接得出结果,不得分,页数可根据内容调整) (1)D触发器 特征方程: Q…

事务的四个特性、四个隔离级别以及数据库的常用锁

事务的四个特性、四个隔离级别以及数据库的常用锁 四大特性 事务的四大特性,通常被称为ACID特性,是数据库管理系统(DBMS)确保事务处理的关键属性。这四大特性分别是: 原子性(Atomicity)&#x…

微服务-理论 分布式事务

一、分布式事务理论模型 分布式事务问题也叫分布式数据一致性问题,简单来说就是如何在分布式场景中保证多个节点数据的一致性。分布式事务产生的核心原因在于存储资源的分布性,比如多个数据库,或者MySQL和Redis两种不同存储设备的数据一致性…

安装ThingBox Eclipse Plugin

1. ChatGPT问 The latest version of the ThingBox Eclipse Plugin requires Eclipse IDE 2021-06 or later. 2. PTC官网下载 MED-61378-CD-092_F000_Eclipse-Plugin-9-0-1.zip文件, 和 MED-61098-CD-085_F000_ThingWorx-Extension-SDK-8-5-0(需要账号&#xff09…

04-Nacos中负载均衡规则的配置

负载均衡规则 同集群优先 默认的ZoneAvoidanceRule实现并不能根据同集群优先的规则来实现负载均衡,Nacos中提供了一个实现叫NacosRule可以优先从同集群中挑选服务实例 当服务消费者在本地集群找不到服务提供者时也会去其他集群中寻找,但此时会在服务消费者的控制台报警告 第…

day33-37-SpringBootV12(整合Spring,SpringMVC,Mybatis,日志,api测试等框架)

ssm spring --> applicationContext.xml配置文件 springmvc --> springmvc.xml配置文件 mybatis —> mybatis-config.xml配置文件 —> springboot优化了之前的框架配置,思想是约定大于配置 一、引言 1.1 初始化配置 为了使用SSM框架去开发,准备SSM…

mysql数据库学习笔记(1)

今天开始学mysql数据库,为什么要学这个呢,因为数据库可结构化存储大量的数据信息,方便用户进行有效的检索和访问。数据库可有效地保持数据信息的一致性、完整性、降低数据冗余。数据库可满足应用的共享和安全方面的要求,把数据放在…

WPF仿网易云搭建笔记(4):信息流控制之消息订阅

文章目录 专栏和Gitee仓库前言消息订阅最简单的案例简单用例父组件订阅子组件回调 结果 消息订阅机制消息token是A还是B?传递消息的载体。双重token重复订阅问题 结论 专栏和Gitee仓库 WPF仿网易云 Gitee仓库 WPF仿网易云 CSDN博客专栏 前言 上一篇文章中,我们简单…

【三维重建】对极几何

极几何描述了同一场景或者物体的两个视点图像间的几何关系 可以发现P在左右相机的投影点一定在各自的极线上,如果求出极线就能缩小求解对应点的范围。 本质矩阵对规范化摄像机拍摄的两个视点图像间的极几何关系进行代数描述 规范化相机指的是相机的内参…

专栏十五:omicverse在单细胞分析中的实际使用体验和小改动

写一些自己的理解吧,一些小步骤,正在更新中。。。 安装 原作者写的很清楚了 大部分直接抄 个别地方:去选择下载适合自己的pytorch版本PyTorch, 比如我的是cuda12,下载命令实际是 pip3 install torch torchvision torchaudio 查看cuda版本命令 nvidia-smi 当然还有个命…

YB9225是一种固定工作频率的高效率电流模式升压转换器。

YB9225B 1.2 MHz。峰值5A 电流,升压转换器 概述 : YB9225是一种固定工作频率的高效率电流模式升压转换器。YB9225集成了一个非常低的 Rds-on NMOSFTET,以减少功率损耗和实现高效率。最高效率可达93% 。功率 MOSFET 的峰值电流限制在5 A。1.…

大模型应用_ChatGPT-Next-Web

1 用后感 这个工具,我也是用了好长时间,就是感觉如果不点亮一颗星,自己就不是人了的那种。 一开始在国内用 ChatGPT 非常麻烦,就买了一个套壳的服务,他使用的界面就是 ChatGPT-Next-Web,我和朋友们都觉得这…

DevEco Studio将编辑器整体文本改为简体中文

我们打开编辑器 随便进入一个项目 这里 我们左上角目录 选择 File下面菜单中的 Settings… 打开配置界面 然后在设置窗口左侧导航栏中 选择 Plugins 插件 然后上方导航栏中 选择 Installed 参考下图 然后 找到这个Chinese(Simplified) Chinese是什么应该不用我多说吧 我们把…

第二百零二回 介绍一个三方包bluetooth_enable_fork

文章目录 1. 概念介绍2. 使用方法2.1 自定义主题2.2 覆盖父主题 3. 示例代码 我们在上一章回中介绍了图片缩放相关的内容,本章回中将介绍如使用主题.闲话休提,让我们一起Talk Flutter吧。 1. 概念介绍 我们在这里说的主题包含两方面的内容:…