1、OTP、HOTP、TOTP 简介

1.1、OTP

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

1.2、HOTP

HMAC-based One-Time Password 简写,表示基于 HMAC 算法加密的一次性密码。是事件同步,通过某一特定的事件次序及相同的种子值作为输入,通过 HASH 算法运算出一致的密码。

1.3、TOTP

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

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

2、TOTP 弱点和漏洞编辑

TOTP 代码可以像密码一样被钓鱼,但它们需要网络钓鱼者实时代理凭证,而不是及时收集它们,不限制登录尝试的实现容易受到强制执行代码的攻击。

窃取共享密钥的攻击者可以随意生成新的有效 TOTP 代码。如果攻击者破坏了大型身份验证数据库,这可能是一个特殊问题。

由于 TOTP 设备的电池电量不足,时钟可以解除同步,并且由于软件版本在用户可能丢失或被盗的手机上,因此所有实际实施都有绕过保护的方法(例如:打印的代码,电子邮件 - 重置等),这可能给大型用户群带来相当大的支持负担,并且还为欺诈用户提供额外的利用向量。

TOTP 代码的有效期超过它们在屏幕上显示的时间(通常是两倍或更多倍)。这是一个让步,认证和认证方的时钟可以大幅度扭曲。
所有一次性基于密码的身份验证方案(包括 TOTP 和 HOTP 等)仍然容易受到会话劫持,即在用户登录后占用用户的会话。

3、原理介绍

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

示例:

Java 代码实现:

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-1byte[] hash = hmac_sha(crypto, K, C);// hash为20字节的字符串// put selected bytes into result int// 获取hash最后一个字节的低4位,作为选择结果的开始下标偏移int offset = hash[hash.length - 1] & 0xf;// 获取4个字节组成一个整数,其中第一个字节最高位为符号位,不获取,使用0x7fint 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位前面补0result = Integer.toString(otp);while (result.length() < codeDigits) {result = "0" + result;}return result;}

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

3.2、HOTP 基本原理

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

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

HOTP:

Generates the OTP for the given count

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] 的散列函数做事件同步验证;

3.3、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,也就是 1970 年 1 月 1 日。

因此上式可以简化为:

C = T / X;

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

例如:

T0 = 0;X = 30;

简化为:C = T / 30

1)T = 30 ~ 59

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

2)T = 60 ~ 89

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

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

阿里巴巴的身份宝使用的时间步数是 60 秒;宁盾令牌使用的时间步数是 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 散列函数;

TOTP 的要求:

客户端和服务器必须能够彼此知道或者推算出对方的 Unix Time;

客户端和服务器端必须共享一个密钥;

算法必须使用 HOTP 作为其关键实现环节;

客户端和服务器端必须使用相同的步长 X;

每一个客户端必须拥有不同的密钥;

密钥的生成必须足够随机;

密钥必须储存在防篡改的设备上,而且不能在不安全的情况下被访问或使用;

对该算法中 T 的实现必须大于 int32,因为它在 2038 年将超出上限;

T0 和 X 的协商必须在之前的步骤中就已经做好了。

4、参考

4.1、python 的 otp 实现

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

4.2、基于 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的自动登录(免去每次双认证,输入密码和动态密码)。

4.3、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

4.4、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

4.5、使用场景

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

4.6、市面上基于 HOTP 的产品

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

4.7、Google 基于 TOTP 的开源实现

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

4.8、golang 的一个 otp 实现

https://github.com/gitchs/gootp

4.9、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.

refer:

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

http://www.bubuko.com/infodetail-1884978.html

【IoT】加密与安全:动态令牌 OTP、HOTP、TOTP 原理解析相关推荐

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

    动态令牌-(OTP,HOTP,TOTP)-基本原理 摘自https://www.cnblogs.com/voipman/p/6216328.html 名词解释和基本介绍 OTP 是 One-Time ...

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

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

  3. c++中的多态---1(多态概念,静态联编和动态联编,多态原理解析,重载,重写,重定义的对比)

    多态的基本概念 多态是面向对象设计语言数据抽象和继承之外的第三个基本特征 多态性(polymorphism)提供接口与具体实现之间的另一层隔膜,从而将"what"和"ho ...

  4. 使用 cglib_java动态代理(JDK和CGLIB原理解析与使用)

    CGLIB的动态代理 原理 代理为控制要访问的目标对象提供了一种途径.当访问对象时,它引入了一个间接的层.JDK自从1.3版本开始,就引入了动态代理,并且经常被用来动态地创建代理.JDK的动态代理用起 ...

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

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

  6. 【IoT】加密与安全:动态密码 OTP 算法详解

    动态密码,亦称一次性密码(One Time Password, 简称 OTP),是一种高效简单又比较安全的密码生成算法,在我们的生活以及工作中随处可见. 1.动态密码背景介绍 动态密码是指随着某一事件 ...

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

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

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

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

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

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

最新文章

  1. 东北农业大学农学院程晓非教授荣获植物病毒学国家“优青”资助
  2. django_2.0_请求处理
  3. 对于java的命名规范(标识符)
  4. 修改linux下全局数据库名,linux/unix下修改oracle数据库实例名的方法
  5. MZOJ 1345 hero
  6. Python案例:通过城市区域代码查询天气
  7. 在git 服务器挂载、创建新的项目、克隆新的项目
  8. 编程基本功:聊了一下午上学房子,晚上却自行加班
  9. 在OS X中使用Homebrew
  10. Linux 查看日志命令
  11. 彻底删除浏览器毒霸首页
  12. 将Excel表格中的数字文本格式转化为数字格式
  13. TIOBE 6 月编程语言排行榜:编程语言的长尾效应
  14. 十大免费响应式Joomla主题
  15. 关于pc浏览器浏览外网出现ERR_EMPTY_RESPONSE的问题
  16. js html监听ctrl v,js监听组合按键
  17. css如何把北京图片变小,css怎么把图片缩小
  18. Android requires compiler compliance level 5.0 or 6.0. Found '1.7' instead.
  19. 飞机飞行轨迹可视化Tacview
  20. 吐血整理!程序员常见的几种变现方式!

热门文章

  1. Ip网络技术组建--hybrid混合接口的简单配置例子
  2. 设A是n*n的对称矩阵,将A的对角线及对角线上方的元素以列为主的次序存放在一维数组B[1..n(n+1)/2]中,对上述任一元素aij(1=i,j=n,且i=j)在B中的位置为()
  3. 小程序-调取录音权限/拒绝后提示重新授权
  4. tkinter+miniblink实现网页组件
  5. bert中文分类模型训练+推理+部署
  6. 解决chrome插件安装时出现的“程序包无效”问题信息:程序包无效。
  7. python纳税_Python实现纳税,python,交税
  8. 中国房地产25条真实的谎言
  9. 《零基础入门数据挖掘 - 二手车交易价格预测》Baseline实施
  10. 使用localStorage存储数据每次调用setItem()它都会添加或覆盖现有值