`
usenrong
  • 浏览: 514912 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

动态令牌-(OTP,HOTP,TOTP)

 
阅读更多

名词解释和基本介绍

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

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-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变成了随机数

公式修改一下

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

 

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秒内的动态密码一致。

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 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实现

基于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的开源实现

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

 

RFC参考

RFC 4226One-Time Password and HMAC-based One-Time Password.

RFC 6238Time-based One-Time Password.

RFC 2104HMAC Keyed-Hashing for Message Authentication.

Done.

分享到:
评论

相关推荐

    PyPI 官网下载 | django-otp-0.7.5.tar.gz

    1. **多因素认证(MFA)集成**:支持多种OTP验证方式,如硬件令牌、手机应用(如Google Authenticator)和短信验证码。 2. **模型和表单**:提供了模型和表单组件,用于存储和验证用户的OTP设置。 3. **后台管理**:...

    nd-otp-webcrypto:简单的TOTP代码生成器

    @ joph-auth / nd-otp-webcrypto @joph-auth/nd-otp-webcrypto是一个简单的,无依赖性的库,用于生成和验证HOTP和TOTP令牌。 该软件包使用 ,因此只能在可用window.crypto和window.crypto.subtle情况下使用。 为了与...

    androidtoken:适用于Andriod设备的TOTP和HOTP令牌

    该应用程序支持HOTP(事件令牌, //tools.ietf.org/html/rfc4226)和TOTP令牌(时间令牌, //tools.ietf.org/html/draft-mraihi-totp-timebased- )。 该应用程序支持使用以下资源配置令牌 二维码手动创建。 可以...

    dart-otp:RFC6238基于时间的一次性密码Google身份验证器库

    生成TOTP(RFC6238)和HOTP(RFC4226)代码。 入门 Pubspec pub.dartlang.org :(如果您只想始终使用最新版本,则可以使用“ any”而不是版本) dependencies : otp : 3.0.0-nullsafety.0 import 'package:...

    OTP_JAVA版资料

    - 为了增强安全性,可以采用双因素认证,结合OTP和另一种验证方式,如短信验证码或物理令牌。 7. **应用示例**: - OTP常用于网上银行、电子邮件、云服务等的安全登录,提供比静态密码更高的安全性。 - ...

    secure-pass-otp:从 code.google.compsecure-pass-otp 自动导出

    用于 SecurePass 身份验证服务的完整黑莓一次性密码...支持 TOTP(基于时间的一次性密码算法)和 HOTP(基于 HMAC 的一次性密码)令牌类型 适用于黑莓设备 5.0 及以上 该项目由 SecurePass 赞助。 有关更多信息,请访问

    OpenOTP Authentication Plugin RoundCube:RounCube的OpenOTP身份验证本机插件-开源

    OpenOTP是一个服务器应用程序,它基于一次性密码(OTP)技术为您的LDAP用户提供多种(高度可配置)身份验证方案,其中包括:-OATH HOTP / TOTP / OCRA软件/硬件令牌-Google身份验证器-移动OTP (mOTP)软件令牌-SMS...

    行业资料-电子功用-动态令牌的前端硬件电路及其授种子或生产配置的方法的介绍分析.rar

    生成OTP的算法通常是基于时间同步(Time-based One-Time Password, TOTP)或事件同步(Event-based One-Time Password, HOTP)的。TOTP根据当前时间生成密码,而HOTP则是基于计数器的,每使用一次,计数器加一,然后...

    动态令牌OTPHOTPTOTP基本原理.docx

    动态令牌是一种安全认证机制,主要用于增强用户登录过程的安全性,防止未经授权的访问。它主要分为两种类型:HOTP(HMAC-Based One-Time Password)和TOTP(Time-Based One-Time Password)。这两种方法都属于OTP...

    OpenOTP Authentication Plugin SugarCRM:SugarCRM的OpenOTP身份验证本机插件-开源

    OpenOTP是一个服务器应用程序,它基于一次性密码(OTP)技术为您的LDAP用户提供多种(高度可配置)身份验证方案,其中包括:-OATH HOTP / TOTP / OCRA软件/硬件令牌-Google身份验证器-移动OTP (mOTP)软件令牌-SMS...

    OpenOTP Authentication Plugin Joomla:适用于joomla 2.x和3.x的OpenOTP身份验证本机插件。-开源

    OpenOTP是一个服务器应用程序,它基于一次性密码(OTP)技术为您的LDAP用户提供多种(高度可配置)身份验证方案,其中包括:-OATH HOTP / TOTP / OCRA软件/硬件令牌-Google身份验证器-移动OTP (mOTP)软件令牌-SMS...

    OpenOTP Authentication Plugin Wordpress:适用于Wordpress 3.x的OpenOTP身份验证本机插件-开源

    OpenOTP是一个服务器应用程序,它基于一次性密码(OTP)技术为您的LDAP用户提供多种(高度可配置)身份验证方案,其中包括:-OATH HOTP / TOTP / OCRA软件/硬件令牌-Google身份验证器-移动OTP (mOTP)软件令牌-SMS...

    OpenOTP Authentication Plugin Magento:Magento的OpenOTP身份验证本机插件-开源

    OpenOTP是一个服务器应用程序,它基于一次性密码(OTP)技术为您的LDAP用户提供多种(高度可配置)身份验证方案,其中包括:-OATH HOTP / TOTP / OCRA软件/硬件令牌-Google身份验证器-移动OTP (mOTP)软件令牌-SMS...

    Python库 | django_otp-0.9.2-py3-none-any.whl

    `django_otp`支持多种OTP生成器,包括基于时间的(TOTP)和基于挑战-响应的(HOTP)。 **安装与使用** 要在Python环境中安装`django_otp-0.9.2-py3-none-any.whl`,首先确保已经安装了pip,然后可以通过以下命令...

    AX3_OTP_Auth-1.0.3-py3-none-any.whl.zip

    这可能涉及生成和验证OTP,以及与硬件令牌设备或手机应用程序(如Google Authenticator)的交互。 7. **注意事项**: 在使用OTP库时,确保正确地存储和管理密钥种子,因为这是生成OTP的基础,泄露会导致OTP系统的...

    otp输入

    在OTP输入系统中,常见的方法有硬件令牌、短信验证码、电子邮件验证和移动应用程序如Google Authenticator。这些方法的核心是生成一个短暂有效的密码,与用户的基本登录凭据(用户名和主密码)一起使用,增加了账户...

    谷歌验证码.net版

    谷歌验证码(Google OTP)是一种基于时间同步的一次性密码(TOTP)或基于挑战-响应的硬件令牌(HOTP)的认证方式。在.NET环境中实现谷歌验证码,可以帮助开发者为应用程序添加安全的双因素身份验证(2FA),提高用户...

    一次性口令身份认证的设计与实现c++

    常见的OTP算法有HOTP(基于计数器的)和TOTP(基于时间的)。 1. TOTP算法:TOTP基于时间戳生成密码,通常每隔30秒或60秒更新一次。计算过程包括以下几个步骤: - 获取当前时间戳(通常是自1970年1月1日以来的秒数...

    AX3_OTP_Auth-1.0.1-py3-none-any.whl.zip

    在实际应用中,AX3 OTP Auth可能需要与硬件令牌设备(如YubiKey)或手机应用程序(如Google Authenticator)配合使用,生成一次性密码。开发人员可能会利用这个库在他们的应用程序或服务中集成OTP验证,为用户提供...

Global site tag (gtag.js) - Google Analytics