Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >动态令牌之 OTP,HOTP,TOTP 的基本原理 Python

动态令牌之 OTP,HOTP,TOTP 的基本原理 Python

作者头像
用户7886150
修改于 2020-12-30 07:48:09
修改于 2020-12-30 07:48:09
2.7K0
举报
文章被收录于专栏:bit哲学院bit哲学院

参考链接: Python | 生成一次性密码(OTP)的程序

名词解释和基本介绍: 

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

原理介绍 

OTP基本原理 

计算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个字节,按照大端方式组成一个整数;截取这个整数的后6位或者8位转成字符串返回。 

HOTP基本原理 

知道了OTP的基本原理,HOTP只是将其中的参数C变成了随机数HOTP(K,C) = Truncate(HMAC-SHA-1(K,C)) 即:C作为一个参数,获取动态密码。 HOTP的python代码片段: 

class HOTP(OTP):

    def at(self, count):

        """

        Generates the OTP for the given count

        @param [Integer] count counter

        @returns [Integer] OTP

        """

        return self.generate_otp(count)

一般规定HOTP的散列函数使用SHA2,即:基于SHA-256 or SHA-512 [SHA2] 的散列函数做事件同步验证; 

TOTP基本原理 

TOTP只是将其中的参数C变成了由时间戳产生的数字。 TOTP(K,C) = HOTP(K,C) = Truncate(HMAC-SHA-1(K,C)) 不同点是TOTP中的C是时间戳计算得出。 C = (T - T0) / X; 

T 表示当前Unix时间戳T0一般取值为 0.X 表示时间步数,也就是说多长时间产生一个动态密码,这个时间间隔就是时间步数X,系统默认是30秒; 

例如: 

T0 = 0; 

X = 30; 

T = 30 ~ 59, C = 1; 表示30 ~ 59 这30秒内的动态密码一致。 

不同厂家使用的时间步数不同; 

阿里巴巴的身份宝使用的时间步数是60秒;Google的 身份验证器的时间步数是30秒;腾讯的Token时间步数是60秒; 

TOTP的python代码片段: 

class TOTP(OTP):

    def __init__(self, *args, **kwargs):

        """

        @option options [Integer] interval (30) the time interval in seconds

            for OTP This defaults to 30 which is standard.

        """

        self.interval = kwargs.pop('interval', 30)

        super(TOTP, self).__init__(*args, **kwargs)

    def now(self):

        """

        Generate the current time OTP

        @return [Integer] the OTP as an integer

        """

        return self.generate_otp(self.timecode(datetime.datetime.now()))

    def timecode(self, for_time):

        i = time.mktime(for_time.timetuple())

        return int(i / self.interval)

代码说明 

self.interval 是时间步数X 

datetime.datetime.now()为当前的Unix时间戳 

timecode表示(T - T0) / X,即获取获取动态密码计算的随机数。 

TOTP 的实现可以使用HMAC-SHA-256或者HMAC-SHA-512散列函数; 

python的otp实现 

https://pypi.python.org/pypi/pyotp https://github.com/pyotp/pyotp 

基于pyotp的简单应用 

>>> import base64

>>> base64.b32encode('This is my secret key')

'KRUGS4ZANFZSA3LZEBZWKY3SMV2CA23FPE======'

>>> secretKey = base64.b32encode('This is my secret key')

>>> import pyotp

>>> totp = pyotp.TOTP(secretKey)

>>> totp.now()

423779

程序的简单说明 

加载base64的模块,将我的秘钥做一下base32的加密,加载pyotp模块,otp使用base32加密后的秘钥传作为种子,生成随机数字验证的。 

可以使用pyotp和expect一起实现基于google authenticator的自动登录(免去每次双认证,输入密码和动态密码)。 

pyotp的TOTP的使用说明(官网) 

totp = pyotp.TOTP('base32secret3232')

totp.now() # => 492039

# OTP verified for current time

totp.verify(492039) # => True

time.sleep(30)

totp.verify(492039) # => False

pyotp的HOTP的使用说明(官网) 

hotp = pyotp.HOTP('base32secret3232')

hotp.at(0) # => 260182

hotp.at(1) # => 55283

hotp.at(1401) # => 316439

# OTP verified with a counter

hotp.verify(316439, 1401) # => True

hotp.verify(316439, 1402) # => False

使用场景 

服务器登录动态密码验证(如阿里云ECS登录,腾讯机房服务器登录等);公司VPN登录双因素验证;网络接入radius动态密码;银行转账动态密码;网银、网络游戏的实体动态口令牌;等动态密码验证的应用场景。 

市面上基于HOTP的产品 

宁盾令牌阿里巴巴的 身份宝Google的 身份验证器(google-authenticator) 

Google基于TOTP的开源实现 

https://github.com/google/google-authenticator RFC6238中TOTP基于java代码的实现。 

golang的一个otp做的不错的实现 

https://github.com/gitchs/gootp 

RFC参考 

RFC 4226 One-Time Password and HMAC-based One-Time Password.RFC 6238 Time-based One-Time Password.RFC 2104 HMAC Keyed-Hashing for Message Authentication.

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
翻译[RFC6238] TOTP: Time-Based One-Time Password Algorithm
在闲暇时间做了一个TOTP相关的开源项目,在项目初步完成之余,我尝试对[RFC6238]文档进行了翻译,供大家参考与查阅,若有不妥之处,还望各位前辈海涵斧正。
翎野君
2023/05/12
5200
动态令牌_创建安全令牌
HMAC-based One-Time Password 简写,表示基于 HMAC 算法加密的一次性密码。是事件同步,通过某一特定的事件次序及相同的种子值作为输入,通过 HASH 算法运算出一致的密码。
全栈程序员站长
2022/11/17
1.8K0
动态令牌_创建安全令牌
手机没网了,却还能支付,这是什么原理?
现在生活已经离不开微信/支付宝电子支付,平常出去吃饭、购物只要带个手机,就可以解决一切,以致于现在已经好久没摸过真?了。 有一次出去吃饭,排着队付钱,等着过程非常无聊,准备拔出手机来把荒野乱斗,却发现
andyxh
2020/09/07
1.5K0
手机没网了,却还能支付,这是什么原理?
Java集成谷歌身份验证器
Google身份验证器 Google Authenticator 是谷歌推出的基于时间的一次性密码(Time-based One-time Password,简称TOTP),只需要在手机上安装该APP,就可以生成一个随着时间变化的一次性密码,用于帐户验证。
Blue_007
2023/10/21
4.2K14
Java集成谷歌身份验证器
[RFC6238] TOTP: 基于时间的一次性密码生成算法
在闲暇时间做了一个TOTP相关的开源项目,在项目初步完成之余,我尝试对[RFC6238]文档进行了翻译,供大家参考与查阅,若有不妥之处,还望各位前辈海涵斧正。
翎野君
2024/01/06
7990
[RFC6238] TOTP: 基于时间的一次性密码生成算法
为 Linux 服务器 SSH 添加 TOTP 动态验证码以及 Java 实现算法
TOTP 基于时间的一次性密码算法(Time-Based One-Time Password)是一种根据预共享的密钥与当前时间计算一次性密码的算法,利用不同设备时间相同的特性,将时间作为特定算法的一部分从而达到无需网络进行安全验证的目的。 该算法有两个输入,一个输出,一个输入是随机生成的密钥,密钥需要被验证方和验证器同时持有,另一个输入即系统时间,通常是 UNIX 时,输出则是两方相同的验证码。一般的验证码有效期为 30 秒,每 30
寒冰hanbings
2021/12/21
2K0
为 Linux 服务器 SSH 添加 TOTP 动态验证码以及 Java 实现算法
Google Authenticator
二、 验证 1、下载Google谷歌身份验证器。 2、通过Python 的qrcode和pyotp模块生成二维码。
py3study
2020/01/08
1.9K0
谷歌authenticator接入与使用
一、authenticator解决了什么问题二、authenticator的原理三、springboot集成authenticator四、做成可复用starter五、参考
叔牙
2023/08/09
7.1K1
谷歌authenticator接入与使用
CentOS7下利用Google Authenticator实现SSH登录的二次身份验证
Google Authenticator(谷歌身份验证器),是谷歌公司推出的一款动态令牌工具,解决账户使用时遭到的一些不安全的操作进行的“二次验证”,认证器基于RFC文档中的HOTP/TOTP算法实现 ,是一种从共享秘钥和时间或次数一次性令牌的算法。在实际应用中可以通过认证器方式对账户有更好的保护
yuanfan2012
2020/08/04
3K0
CentOS7下利用Google Authenticator实现SSH登录的二次身份验证
双因素认证(2FA)原理介绍及实现
😀 我们常说的认证(authentication)就是在确认用户的身份,是在进行重要操作时的必要手段,譬如网站登录、银行取现等。
鳄鱼儿
2024/05/21
2.4K0
双因素认证(2FA)原理介绍及实现
两步验证杀手锏:Java 接入 Google 身份验证器实战
大家应该对两步验证都熟悉吧?如苹果有自带的两步验证策略,防止用户账号密码被盗而锁定手机进行敲诈,这种例子屡见不鲜,所以苹果都建议大家开启两步验证的。
Java技术栈
2018/09/29
5.5K0
2FA双重身份验证工具 - GitHub、google、微软、百度、腾讯等全面启用
2024年github全面启用2FA模式登录github。在国内因为某些原因手机扫描github给出的QRCode(二维码)是无法启用该验证的,下面将手把手教你启用github的2FA验证。
天码行空
2025/07/08
8900
[信息安全] 4.一次性密码 && 身份认证三要素
在信息安全领域,一般把Cryptography称为密码,而把Password称为口令。日常用户的认知中,以及我们开发人员沟通过程中,绝大多数被称作密码的东西其实都是Password(口令),而不是真正意义上的密码。本文保持这种语义,采用密码来代指Password,而当密码和口令同时出现时,用英文表示以示区分。 0. OTP一次性密码 OTP是One Time Password的简写,即一次性密码。在平时生活中,我们接触一次性密码的场景非常多,比如在登录账号、找回密码,更改密码和转账操作等等这些场景,其
blackheart
2018/01/19
2.2K0
[信息安全] 4.一次性密码 && 身份认证三要素
使用aerogear生成totp
aerogear-otp-java-1.0.0-sources.jar!/org/jboss/aerogear/security/otp/Totp.java
code4it
2018/09/17
1.9K0
双因素认证(2FA)教程
所谓认证(authentication)就是确认用户的身份,是网站登录必不可少的步骤。 密码是最常见的认证方法,但是不安全,容易泄露和冒充。 越来越多的地方,要求启用双因素认证(Two-factor
ruanyf
2018/04/12
3.1K0
双因素认证(2FA)教程
多因子类身份认证
密码作为我们平时最常使用的用户身份验证方式有其便捷性,但是仔细思考你也不难发现其中存在着较多的安全问题。首先我们的密码是由用户自我定义设置的,期间不排除用户设置弱口令密码或者使用键盘布局的脆弱密码(当然部分考虑安全的系统会制定对应的密码策略对其进行限制),其次即便我们使用了极为复杂的密码,也不能完全规避"社工钓鱼"和"中间人"攻击等威胁,攻击者可以通过脱浏览器端的凭据信息等方式获取用户的密码,再者就是用户都有一个特征就是"惰性",很多用户在多个网站可能会使用同一个登录密码,故此攻击者可以通过找寻被泄露的账户密码获取到真实的账户密码信息并实现登录操作,基于以上多个风险层面,我们接下来对用户的身份认证进行简易的探讨并结合业务、测评等维度给出关联的安全设计
Al1ex
2024/01/02
1.9K0
多因子类身份认证
RHEL CentOS 8 SSH双因素认证
  双因素认证就是通过 用户已知信息(用户名和密码)+用户预先未知信息 二要素组合到一起实现双因素身份认证。双因素认证是一种采用时间同步技术的系统,采用了基于时间、事件和密钥三变量而产生的一次性密码来代替传统的静态密码。每个动态密码卡都有一个唯一的密钥,该密钥同时存放在服务器端,每次认证时动态密码卡与服务器分别根据同样的密钥,同样的随机参数(时间、事件)和同样的算法计算了认证的动态密码,从而确保密码的一致性,从而实现了用户的身份认证。
Kevin song
2020/06/09
1.9K0
RHEL CentOS 8 SSH双因素认证
细说API - 认证、授权和凭证
遗憾的是依然有大量候选人答非所问,无法搞清楚 cookie 和 session 之间的区别。而在工作中也有让人惊讶的真实案例:把 user ID 存储到 local storage 中当做 token 使用,原因是他们声称弃用了 cookie 这种落后的东西;一个移动端项目,服务器给出的 API 中需要客户端模拟一个 cookie,从而像浏览器中 ajax 那样消费 API。
ThoughtWorks
2019/05/05
3.3K0
细说API - 认证、授权和凭证
密码管理和2FA管理软件
现在网络上各种网站服务非常多,每个人至少都有注册过几十上百个网站,账号密码的管理显得尤为重要,很多人为了便于记忆,多种账号采用相同的密码,这种做法非常不安全,因为一旦有一个平台的密码泄露,就很容易被撞库攻击。
六月河
2023/06/26
1.7K0
什么是双因素验证 2FA,如何用 Python 实现?
你说,加上短信验证码不就安全了,其实短信验证码也是不安全的,容易被拦截和伪造,SIM 卡也可以克隆,已经有案例,先伪造身份证,再申请一模一样的手机号码,把钱转走。
somenzz
2022/10/25
1.3K0
什么是双因素验证 2FA,如何用 Python 实现?
相关推荐
翻译[RFC6238] TOTP: Time-Based One-Time Password Algorithm
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档