动态令牌-(OTP,HOTP,TOTP)-基本原理

摘自https://www.cnblogs.com/voipman/p/6216328.html

名词解释和基本介绍

OTP 是 One-Time Password的简写,表示一次性密码。

HOTP 是HMAC-based One-Time Password的简写,表示基于HMAC算法加密的一次性密码。

  是事件同步,通过某一特定的事件次序及相同的种子值作为输入,通过HASH算法运算出一致的密码。

TOTP 是Time-based One-Time Password的简写,表示基于时间戳算法的一次性密码。

  是时间同步,基于客户端的动态口令和动态口令验证服务器的时间比对,一般每60秒产生一个新口令,要求客户端和服务器能够十分精确的保持正确的时钟,客户端和服务端基于时间计算的动态口令才能一致。  

原理介绍

OTP基本原理

计算OTP串的公式

1
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位转成字符串返回。

Java代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
public static String generateOTP(String K,
                                     String C,
                                     String returnDigits,
                                     String crypto){
       int codeDigits = Integer.decode(returnDigits).intValue();
       String result = null;
       // K是密码
       // C是产生的随机数
       // crypto是加密算法 HMAC-SHA-1
       byte[] hash = hmac_sha(crypto, K, C);
       // hash为20字节的字符串
       // put selected bytes into result int
       // 获取hash最后一个字节的低4位,作为选择结果的开始下标偏移
       int offset = hash[hash.length - 1] & 0xf;
       // 获取4个字节组成一个整数,其中第一个字节最高位为符号位,不获取,使用0x7f
       int binary =
               ((hash[offset] & 0x7f) << 24) |
               ((hash[offset + 1] & 0xff) << 16) |
               ((hash[offset + 2] & 0xff) << 8) |
               (hash[offset + 3] & 0xff);
       // 获取这个整数的后6位(可以根据需要取后8位)
       int otp = binary % 1000000;
       // 将数字转成字符串,不够6位前面补0
       result = Integer.toString(otp);
       while (result.length() < codeDigits) {
           result = "0" + result;
       }
       return result;
   }

返回的结果就是看到一个数字的动态密码。

HOTP基本原理

知道了OTP的基本原理,HOTP只是将其中的参数C变成了随机数

公式修改一下

1
HOTP(K,C) = Truncate(HMAC-SHA-1(K,C))

HOTP: Generates the OTP for the given count

即:C作为一个参数,获取动态密码。

HOTP的python代码片段:

1
2
3
4
5
6
7
8
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变成了由时间戳产生的数字。

1
TOTP(K,C) = HOTP(K,C) = Truncate(HMAC-SHA-1(K,C))

不同点是TOTP中的C是时间戳计算得出。

1
C = (T - T0) / X;

T 表示当前Unix时间戳

T0一般取值为 0.

X 表示时间步数,也就是说多长时间产生一个动态密码,这个时间间隔就是时间步数X,系统默认是30秒;

例如:

T0 = 0;

X = 30;

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

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

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

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

TOTP的python代码片段:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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):
        = 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的简单应用

1
2
3
4
5
6
7
8
>>> 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的使用说明(官网)

1
2
3
4
5
6
7
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的使用说明(官网) 

1
2
3
4
5
6
7
8
hotp = pyotp.HOTP('base32secret3232')
hotp.at(0# => 260182
hotp.at(1# => 55283
hotp.at(1401# => 316439
# OTP verified with a counter
hotp.verify(3164391401# => True
hotp.verify(3164391402# => 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.

Done.

分类: cipher,加解密相关,python

转载于:https://www.cnblogs.com/LiuYanYGZ/p/11174877.html

动态令牌-(OTP,HOTP,TOTP)-基本原理相关推荐

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

    名词解释和基本介绍: OTP 是 One-Time Password的简写,标识一次性密码 HOTP 是HMAC-based One-Time Password的简写,表示基于HMAC算法加密的一次性 ...

  2. 【IoT】加密与安全:动态令牌 OTP、HOTP、TOTP 原理解析

    1.OTP.HOTP.TOTP 简介 1.1.OTP One-Time Password 简写,表示一次性密码. 1.2.HOTP HMAC-based One-Time Password 简写,表示 ...

  3. 动态令牌 (谷歌身份验证器)的实现

    动态令牌-(OTP,HOTP,TOTP)-基本原理:  https://www.cnblogs.com/navysummer/p/11943319.html 实现原理: https://blog.cs ...

  4. CSDN实训第四天(OTP——动态令牌的实现)

    CSDN实训第四天(OTP--动态令牌的实现) 一.前言 出于对重要文件的保护,产生了 密码 和验证码这一产物.如今验证码有很多形式,Gif动画验证码.手机短信验证码.手机语音验证码.视频验证码等等, ...

  5. OTP动态令牌工作原理分析

    OTP动态令牌是一种新型的强身份认证的信息安全产品,由于其具有使用简单,携带方便,安全性高,美观时尚等优点,已经广泛应用在网银系统,电子办公系统,网络游戏,网络支付等众多领域. OTP原理: OTP动 ...

  6. 天融信堡垒机怎么结合国密OTP动态令牌实现双因子身份认证?

    摘要: 结合宁盾国密OTP动态令牌为天融信堡垒机登录开启双因子身份认证机制,能有效增强运维人员的账号安全,满足等保合规要求. 天融信运维安全审计系统(简称"堡垒机")是面向政府.企 ...

  7. CSDN实训 - Java模拟二次验证码(动态令牌)

    文章目录 前言 一.什么是动态令牌? 二.使用的Jar包 1. 生成二维码Jar包 2. Apache Commons Codec 3. 项目工具类 4. 下载链接 三.IDEA导入外部Jar包 四. ...

  8. C1实训-动态令牌(二次验证码)原理及实现

    目录 一.概念理解 二.所需资料 三.实验过程 四.深入理解 1. 安全性原因 2. 不联网原因 3. 优势 五.总结 本文介绍了动态令牌的概念.来源.国内外现状,用实验模拟"基于时间的动态 ...

  9. ASP.NET中使用动态令牌进行安全认证

    一.前言 在有的项目中,为提高用户身份验证的安全性,需要在账号密码认证身份的基础上增加额外的认证,如加密狗.IC卡等.本例提供另一种方法,采用动态令牌的方式认证,用户在登录时需输入自己令牌产生的口令, ...

最新文章

  1. 2022-2028年中国数据中台行业深度调研及投资前景预测报告(全卷)
  2. SAP Business One 产品功能综述
  3. CentOS7中通过二进制文件与配置环境变量的方式安装Node
  4. 在HTML文件中加载js
  5. SAP UI5 ComponentBase createMetaData signature - why is MD hard coded
  6. Visual studio 打包
  7. WPF 不支持从调度程序线程以外的线程对其 SourceCollection 进行的更改
  8. 最新!图像去噪综合比较研究
  9. SQL Server 2008 R2——ROW_NUMBER() 去掉不同行中相同列的重复内容
  10. EASYSIZE备份
  11. Linux 删除除某个文件之外的所有文件
  12. 7.Zeng_Cache(1) --- 简介
  13. Springboot整合JasperReport报表以及报表打印功能
  14. python 浅copy与深copy_python深copy与浅copy的区别
  15. makeinfo:未找到命令
  16. 实验十三:配置STP、RSTP以及负载均衡(生成树负载均衡)
  17. 【定时同步系列5】Farrow内插器结构原理和MATLAB实现
  18. pt100专用芯片_新能源 汽车电机专用温度传感器 PT100 进口芯片 德国
  19. OsgEarth星空背景
  20. SQL Server 2005数据库教程

热门文章

  1. ALV TREE DEMO
  2. php文件包含漏洞解决方法,DzzOffice 1.2.2 /index.php 本地文件包含漏洞
  3. 在ParaView中计算圆柱绕流算例里圆柱所受的升阻力
  4. 模糊控制应用实例——洗衣机的模糊控制详解
  5. intro是啥意思_outro 和intro是什么意思啊?
  6. 三菱FX3U +485 ADP与施耐德ATV-71变频器通讯程序 同时实现变频器 DRIVECOM流程,解决施耐德ATV变频器断电重启后,自准备工作
  7. 大数据时代维克托·迈尔·舍恩伯格 读书笔记
  8. 那些有趣/用的 Python 库 1
  9. 实现Select与输入框的数据联动
  10. 多IP服务器自动切换内网IP易语言源码