动态令牌之 OTP,HOTP,TOTP 的基本原理 Python
名词解释和基本介绍:
- 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 secondsfor 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.
动态令牌之 OTP,HOTP,TOTP 的基本原理 Python相关推荐
- 动态令牌-(OTP,HOTP,TOTP)-基本原理
动态令牌-(OTP,HOTP,TOTP)-基本原理 摘自https://www.cnblogs.com/voipman/p/6216328.html 名词解释和基本介绍 OTP 是 One-Time ...
- OTP动态令牌工作原理分析
OTP动态令牌是一种新型的强身份认证的信息安全产品,由于其具有使用简单,携带方便,安全性高,美观时尚等优点,已经广泛应用在网银系统,电子办公系统,网络游戏,网络支付等众多领域. OTP原理: OTP动 ...
- 动态令牌 (谷歌身份验证器)的实现
动态令牌-(OTP,HOTP,TOTP)-基本原理: https://www.cnblogs.com/navysummer/p/11943319.html 实现原理: https://blog.cs ...
- CSDN实训第四天(OTP——动态令牌的实现)
CSDN实训第四天(OTP--动态令牌的实现) 一.前言 出于对重要文件的保护,产生了 密码 和验证码这一产物.如今验证码有很多形式,Gif动画验证码.手机短信验证码.手机语音验证码.视频验证码等等, ...
- 天融信堡垒机怎么结合国密OTP动态令牌实现双因子身份认证?
摘要: 结合宁盾国密OTP动态令牌为天融信堡垒机登录开启双因子身份认证机制,能有效增强运维人员的账号安全,满足等保合规要求. 天融信运维安全审计系统(简称"堡垒机")是面向政府.企 ...
- CSDN实训 - Java模拟二次验证码(动态令牌)
文章目录 前言 一.什么是动态令牌? 二.使用的Jar包 1. 生成二维码Jar包 2. Apache Commons Codec 3. 项目工具类 4. 下载链接 三.IDEA导入外部Jar包 四. ...
- C1实训-动态令牌(二次验证码)原理及实现
目录 一.概念理解 二.所需资料 三.实验过程 四.深入理解 1. 安全性原因 2. 不联网原因 3. 优势 五.总结 本文介绍了动态令牌的概念.来源.国内外现状,用实验模拟"基于时间的动态 ...
- ASP.NET中使用动态令牌进行安全认证
一.前言 在有的项目中,为提高用户身份验证的安全性,需要在账号密码认证身份的基础上增加额外的认证,如加密狗.IC卡等.本例提供另一种方法,采用动态令牌的方式认证,用户在登录时需输入自己令牌产生的口令, ...
- 动态口令(OTP)认证技术概览
动态口令(OTP,One-Time Password)又称一次性密码,是使用密码技术实现的在客户端和服务器之间通过共享秘密的一种认证技术,是一种强认证技术,是增强目前静态口令认证的一种非常方便技术手段 ...
最新文章
- Jquery UI dialog 详解 (中文)
- KVM 虚拟化架构和实现原理
- Android--解析XML之PULL
- 使用ubuntu过程中遇到的问题汇总
- Bzoj4011 [HNOI2015]落忆枫音
- Oracle 当前用户给另一个用户授权查询指定表或视图的权,否则另一个用户提示不存在视图或表
- 怎么把图片的边缘弄圆_如何PS制做出边缘清晰或虚化的圆角照片
- DEM文件投影/基准面转换出现的问题
- 如何找出知乎的所有神回复
- JAVA毕业设计web家教管理系统计算机源码+lw文档+系统+调试部署+数据库
- php获取邮箱邮件列表,让PHP管理小型的邮件列表
- n(n-1)/2的奇偶性
- java swing多人聊天室_使用java swing和socket编程实现简单的多人聊天室-Go语言中文社区...
- LncBase:lncRNA与miRNA相互作用数据库
- 《小强升职记》 读书笔记
- 两点之间的球面距离的计算(C#)
- opencv(python)使用svm算法识别手写数字
- Github Android流行框架Top100
- jq 遍历 each方法
- 使用SQL Server 获取插入记录后的ID(自动编号)
热门文章
- 计算机高中合肥,合肥市一名高中生被美国麻省理工学院录取,系安徽省首位
- 云计算解码(第2版)运营商观点第一书
- 黑鸟每日安全资源推送​第24期(求关注转发,良心推送)
- 遭遇Trojan.DL.Multi.wfg(sss.exe、SCVHOST.EXE、autorun.inf)等
- HOOK启思录---第三章 HOOK的应用模式
- FL Studio21MAC电脑中文升级版安装图文教程
- python爬虫高级知识分子的风骨_Python程序员爬取《万物理论》10万影评,带你解读霍金的有趣故事...
- 数据结构——栈和队列(上)
- 编译pango-1.40.1时遇到的问题及解决方法
- 计算机毕业设计(附源码)python在线影评系统