HOTP

更新时间:2023-10-31 03:35:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

HOTP:一种基于HMAC的一次性口令算法

摘要

本文描述了一种基于HMAC的一次性口令生成算法。对该算法进行了安全性分析,并讨论了该算法安全使用的重要参数。该算法已广泛应用于VPN访问,Wi-Fi登录及面向交易的Web应用等多项网络服务。

本文由OATH组织成员合作完成,详细讨论了可在技术界自由传播的算法。作者相信一种通用且共享的算法可以通过商业或开放资源工具实现共享,从而为Interne上采用的二因子认证提供了便利。

1.概述

本文首先介绍了可以生成基于HMAC的一次性口令值的算法的背景,因而这种算法也称为基于HMAC的一次性口令算法。将在第4节列出这种算法的要求,在第5节说明HOTP算法,第6、7节主要对这种算法进行安全性分析,第8节对其进行扩充和完善,并在第10节对本文作出结论。在附录A,有兴趣的读者会发现对算法安全性的详细、全面分析:并对该算法的理想化版本进行了评价,之后对HOTP算法的安全性进行了分析。

2.引言

今天,双因子认证仍只是在极有限的范围和规模内得到应用。尽管威胁和攻击的水平在不断提高,大多数Internet应用薄弱的认证体系来监视用户访问。硬件和软件技术供应商之间缺少可操作性成为了双因子认证应用的制约因素。特别是由于缺乏统一规范,硬件和软件组件常常通过专有技术紧密的结合,从而导致高成本解决方案,不佳的采用和有限的创新。

在过去两年中,网络威胁的迅速增长暴露了Internet上认证主要手段静态口令的不足。同时,目前的方法要求一个终端用户携带一个昂贵的,只能用来进行网络认证的功能单一的装置。这显然也不是最好的方法。对于Internet上流传的双因子认证方法则必须在能够跨广泛应用范围的灵活性更高的装置中嵌入它。

这种既可以引入基础技术同时又保证广泛互操作性的能力要求其在广大硬件和软件开发者技术界中随时可得。只有一种开放系统方法可以保证基本的原始

双因子认证方法可用于下一代用户装置,如USB大量存储器、IP电话以及个人数字助理。

一次性口令当然是最简单而流行的保护网络访问权的双因子认证方法之一。例如,在大企业中,虚拟专用网络的访问通常都需要使用一次性口令来进行远程用户认证。一次性口令通常更适用于强认证方式如公钥体制(PKI)或生物统计,这是因为空气隔离装置不需要在用户机上安装客户桌面软件,因此可使他们在包括家用电脑、自动售货机、个人数字助理多台机器上漫游。

本文提出了一种简单的一次性口令算法,可以通过任何硬件制造商或软件开发者实现,从而建立了可互操作认证装置和软件代理。算法是基于事件的,因此它可用于大容量装置如Java智能卡、USB 安全装置以及GSM SIM卡。

所介绍的算法在IETF知识产权[RFC3979]规定的条件下可以在开发界自由使用。

本文的作者都是OATH组织成员。该组织成立于2004年,其目的是促进强认证技术提供者之间的合作。

3.术语

这篇文章中的关键词“必须”、“必须不”、“要求”、“即将”、“将不”、“应该”、“应该不”、“建议”、“可以”、和“可选”都如[RFC2119]中所定义。

4.算法要求

这一节说明了进行算法设计的要求。着重强调了终端用户的可用性和算法由低成本硬件实现的能力,从而使用户界面能力最小化。特别是以算法能插入高容量SIM和Java卡的为前提。

要求1算法必须是基于序列号或基于计数器的。这样的目的之一是可以将HOTP算法用于大容量装置如Java智能卡,USB安全装置和GSM SIM卡。

要求2算法应该是经济可实现的,硬件上对电池、按键、计算马力、LCD显示器尺寸的需要最小化。

要求3算法必须用在不支持任何数值型输入的令牌,但也可以用于更复杂的机器如安全PIN键盘。

要求4令牌上显示的HOTP值必须易于用户阅读和输入,这要求HOTP值必须有一个合理的长度。

HOTP只必须至少为6位,同时也希望它仅由数字构成,这样用户就很容易在电话这样的有限设备上输入。

要求5必须有用户——可利用的友好装置来实现计数器重同步,7.4节和附录E.4详细说明了本文提到的重同步装置。

要求6算法必须使用强共享的密钥,共享密钥的长度必须至少为128比特。本文建议共享密钥的长度为160比特。

5.HOTP算法

在这一节,我们介绍标记并描述HOTP算法的基本模块——计算HMAC-SHA1值的基本函数,以及抽取HOTP值的截短方法。

5.1标记和符号

一个数串通常为二进制数串,即0和1的序列。 如果s是一个数组,则|s|表示其长度。 如果n是一个数,则|n|表示其绝对值。

如果s是一个数组,则s[i]表示其第i比特。我们以0为开始对这些比特进行编号。因此s = s[0]s[1]...s[n-1],这里n = |s|是s的长度。

StToNum表示二进制串输入转换为十进制数的函数。 下面是本文中用到的符号列表

---------------------------------------------------------------

C 8-byte 计数器值,此计数器必须与HOTP生成器(客户端)和HOTP认证器(服务器)保持同步。

K 客户端和服务器之间的共享密钥;每一个HOTP生成器都有互不相同且唯一的密钥K。

T 阈值参数:用户尝试认证次数达到T次后,服务器将拒绝该用户接入。

S 重同步参数:服务器将通过依次的S个计数器值来验证接收到的认证码。

Digit 系统参数,HOTP值的位数。 5.2描述

HOTP算法是基于一个加法计数器和一个静态的对称密钥,该密钥仅有令牌和认证服务器知道。为得到HOTP值,我们使用HMAC-SHA-1算法,如RFC 2104 [BCK2]所定义。

由于HMAC-SHA-1计算输出为160比特,我们必须将其截短以便于用户输入。 HOTP(K,C) = Truncate(HMAC-SHA-1(K,C)) 这里:

Truncate表示将HMAC-SHA-1值转换为HOTP值的函数,如5.3节所定义。 首先对密钥(K),计数器(C),和Data值执行高阶字节散列。 HOTP生成器产生的HOTP值可以作为大尾数处理。 5.3.生成HOTP值

我们可以分为3个步骤来描述改过程

步骤1:生成一个HMAC-SHA-1值,令HS = HMAC-SHA-1(K,C)// HS是一个20字节的数组。

步骤2:生成一个4字节数组(动态截短) 令Sbits = DT(HS)//DT稍后定义 //返回31位的数串 步骤3:计算HOTP值

令Snum = StToNum(Sbits)//将Sbits转换为10进制数,取值在0值2^{31}-1之间

返回D = Snum mod 10^Digit//D是一个十进制数,取值在0至10^{digit}-1之间

截短函数用于步骤2和步骤3中,即进行动态截短之后与10^{digit}进行模运算。动态截短函数的作用是从160比特(20字节)的HMAC-SHA-1运算结果中

抽取4字节的动态二进制码。

DT(String) // String = String[0]...String[19] 令OffsetBits作为String[19]的低4位

Offset = StToNum(OffsetBits) // 0 <= OffSet <= 15 令P = String[OffSet]...String[OffSet+3] 返回P的后31位

不取P的最高位的原因是为了防止混淆有符号与无符号的模运算。不同的处理器回进行不同的处理,不取符号位可以消除这种模糊。

Digit必须最少取6位,可能的话取7到8位码。根据保密需要,应该考虑使Digit = 7或更高以得到长HOTP值。

5.4 Digit =6的HOTP值计算举例

下面的例子描述了抽取动态二进制码的过程,hmac_result是存放HMAC-SHA-1结果的一个字节数组

int offset = hmac_result[19] & 0xf ;

int bin_code = (hmac_result[offset] & 0x7f) << 24 | (hmac_result[offset+1] & 0xff) << 16 | (hmac_result[offset+2] & 0xff) << 8 | (hmac_result[offset+3] & 0xff) ;

SHA-1 HMAC Bytes (Example)

------------------------------------------------------------- | Byte Number | ------------------------------------------------------------- |00|01|02|03|04|05|06|07|08|09|10|11|12|13|14|15|16|17|18|19| ------------------------------------------------------------- | Byte Value |

本文来源:https://www.bwwdw.com/article/8hh2.html

Top