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

OTP详解,OTP、HOTP、TOTP区别以及Node平台OTP包轻体验

前言

最近上班过程中,谷歌到了一个概念OTP,看到它的全称之后,我发现它是一个我们日常生活中已经离不开的东西:(One-Time-Password),顾名思义,一次性密码。恐怕最常见的可能就是我们动态登录账号的时候选择短信(SSM)验证账号。这个验证码就属于OTP。虽然目前工作中没有用到OTP,但是我还是决定了解一下这个概念,说不定以后什么时候就用到了。

OTP概念

首先我们要知道的是,OTP是MFA(Multi-Factor-Authentication)的一个实现模型。先简单了解一下MFA的概念,MFA概括来说就是用户需要提供2种或2种以上的凭证去验证真实身份。相比仅凭账号密码,MFA提供了更加安全的资源保护。下面列举一些MFA的例子:

  1. 用户安全问题
  2. 密码
  3. OTPs
  4. 软件安全码、keys
  5. 指纹、人脸识别、声纹及其他生物特征
  6. 用户行为足迹分析

其实把资源安全的责任附加到用户身上(如上述的1、2等),并不是十分可靠,用户承担了记忆的责任。因此我认为OTP是一个比较负责任的MFA做法。
接下来介绍OTP。
OTP是应用主、网站提供给用户,需要用户接收并且输入的一次性密码,一旦用户使用过之后,再次登录应用或者页面则需要接受另一个新的密码。OTP的形式可以为短信、手机应用等等。
生成OTPs的标准算法有很多,例如SHA-1,它们都有一个共同点:有一个seed和一个moving factor,seed是绑定在账户上的静态值,从账户创建开始即保持不变,moving factor则在每一次OTP请求中改变。根据这个动态因子的不同,OTP又被分为两种:HOTPTOTP

HOTP

HOTP中,H指代 Hash-based Message Authentication Code,另一种不那么专业的解释方法为:HOTP是一种事件驱动的OTP,它的moving factor基于一个计数器。
HOTP每一次请求,都会让计数器递增,而生成的OTP在下一次计数前保持有效。OTP生成器和服务器会同步监测到用户的有效访问行为。HOTP的一个例子为Yubikey。
在这里插入图片描述

TOTP

TOTP中,T指代Time-based,类似HOTP,但是它的moving factor基于时间。
TOTP的有效时间被称为timestep(时间步长),通常被设定为30、60秒,如果在这个时间窗口内没有验证此密码,则会失效。

在这里插入图片描述

对比

由于TOTP存在时间窗口,所以在TOTP的运行时间(服务器生成到用户输入这段时间)可能会导致用户使用了无效的TOTP,造成一定的困扰。
而HOTP不存在时间窗口,所以在UE(user experience)上有一定的优势,另一方面,由于较长的输入验证时间,有一定几率被恶意破解。因此,在一些HOTP中,也加入了基于时间的组件,从而二者合一,模糊了TOTP、HOTP之间的界限。

一言

不管是使用HOTP还是TOTP,仅凭账号密码就可以轻松获取资源的时代已经一去不复返,各种行为验证、OTPs的验证正在铺天盖地般普及,了解了OTP的概念、作用,在我们真正要用到的时候,才能知己知彼,选择一个最适合应用、网站的验证方法。

Node.js上otp包的轻度体验。

npm上有许多有关otp的包,下面我来轻度体验其中几个。

notp

  • Weekly Downloads:26,565
  • Last publish: 6 yrs ago

这个包比较老,但是直到今天还是很多人依赖,它支持Google Authenticator(GA在各个移动端平台上都有免费应用,所以这类包都会说明支不支持)。
体验sample:

var notp = require("notp")
t2 = require('thirty-two')
K = '12345678901234567890'
const token = notp.totp.gen(K, {})
notp.totp.verify(token,K,{})

输出:

Object {delta: 0}
// 返回一个带数据倾斜属性的对象代表验证成功,返回null代表验证失败

otplib

  • Weekly Downloads:66,389
  • Last publish: a yr ago

这是一个比较全的包,文档内容也很丰富,可以看到周下载次数也很多。

var otplib = require("otplib")
const secret = 'KVKFKRCPNZQUYMLXOVYDSQKJKZDTSRLD';
const tokenT = otplib.totp.generate(secret);
const isValidT = otplib.totp.check(tokenT, secret);

输出:

true
var otplib = require("otplib")
const secret = 'KVKFKRCPNZQUYMLXOVYDSQKJKZDTSRLD';
var counter = '1234567890'
const tokenH = otplib.hotp.generate(secret, counter);
const isValidH = otplib.hotp.check(tokenH, secret, counter);

输出:

true

可以看到node库里已经有很多各种各样的otp包,它们的generator各异,几乎都包揽TOTP、HOTP方式,且支持GA,我们要做的就是依赖之后,在我们的服务器上保存Seed(Key)和Counter或者用TOTP进行验证即可。

相关文章:

  • [VSCode] 你需要知道的23个实用VSCode快捷键
  • js中 ^ !! ! 运算符的巧用 / 判断开始日和结束日案例 / 判断两个变量只有一个为空的情况
  • 【Java to Architect】Blocking Queue 阻塞队列应对并发
  • 【Java to Architect】HashSet TreeSet 集合 红黑树
  • 【Salesforce】【LWC】响应式验证标准查找输入框
  • 最长递增子序列问题(LIS) 动态规划 JavaScript
  • 位屏蔽(Bitmasking)中屏蔽字赋值语句 mask | (1 << j) 的解释
  • 【Java to Architect】synchronized保证内存可见性 demo的另一种解法
  • 利用位屏蔽和动态规划解决最小代价任务分配问题 Bitmasking Dynamic Programming
  • 算法:回溯法(backtracking)解决寻找给定字符串的所有排序(permutations)问题
  • 算法: 动态规划 寻找2D矩阵中到达某一坐标的最小代价路径
  • 算法:动态规划 寻找2D矩阵中到达某一坐标的可能路径总数
  • 算法:动态规划 寻找2D矩阵中到达某一坐标的可能路径总数进阶版(添加路障)
  • 算法: 动态规划,二维矩阵代价最值进阶版 两条行进路径,一次相交,求解最大代价
  • Programming Languages And Lambda calculi 1.1 定义集合
  • 【402天】跃迁之路——程序员高效学习方法论探索系列(实验阶段159-2018.03.14)...
  • 【vuex入门系列02】mutation接收单个参数和多个参数
  • bootstrap创建登录注册页面
  • Linux下的乱码问题
  • session共享问题解决方案
  • SOFAMosn配置模型
  • 短视频宝贝=慢?阿里巴巴工程师这样秒开短视频
  • 基于 Ueditor 的现代化编辑器 Neditor 1.5.4 发布
  • 计算机在识别图像时“看到”了什么?
  • 做一名精致的JavaScripter 01:JavaScript简介
  • 阿里云IoT边缘计算助力企业零改造实现远程运维 ...
  • ​力扣解法汇总1802. 有界数组中指定下标处的最大值
  • # centos7下FFmpeg环境部署记录
  • #LLM入门|Prompt#1.8_聊天机器人_Chatbot
  • #考研#计算机文化知识1(局域网及网络互联)
  • (06)金属布线——为半导体注入生命的连接
  • (30)数组元素和与数字和的绝对差
  • (4)(4.6) Triducer
  • (免费领源码)python+django+mysql线上兼职平台系统83320-计算机毕业设计项目选题推荐
  • (四)docker:为mysql和java jar运行环境创建同一网络,容器互联
  • (算法)N皇后问题
  • (转)Linq学习笔记
  • .NET Core WebAPI中使用swagger版本控制,添加注释
  • .net core 控制台应用程序读取配置文件app.config
  • .net图片验证码生成、点击刷新及验证输入是否正确
  • .pyc文件还原.py文件_Python什么情况下会生成pyc文件?
  • .sys文件乱码_python vscode输出乱码
  • /ThinkPHP/Library/Think/Storage/Driver/File.class.php  LINE: 48
  • @autowired注解作用_Spring Boot进阶教程——注解大全(建议收藏!)
  • @EnableWebMvc介绍和使用详细demo
  • @requestBody写与不写的情况
  • [ C++ ] STL---仿函数与priority_queue
  • [ Linux Audio 篇 ] 音频开发入门基础知识
  • [2019.3.5]BZOJ1934 [Shoi2007]Vote 善意的投票
  • [2024] 十大免费电脑数据恢复软件——轻松恢复电脑上已删除文件
  • [8-23]知识梳理:文件系统、Bash基础特性、目录管理、文件管理、文本查看编辑处理...
  • [Android]如何调试Native memory crash issue
  • [BT]小迪安全2023学习笔记(第15天:PHP开发-登录验证)
  • [Docker]十一.Docker Swarm集群raft算法,Docker Swarm Web管理工具
  • [E链表] lc83. 删除排序链表中的重复元素(单链表+模拟)