使用HOTP生成字母数字OTP

时间:2016-08-17 11:57:46

标签: cryptography hmac hmacsha1

据我所知,HOTP可用于创建数字一次性密码。背后的算法是:

  

K是一个秘密密钥
  C是柜台
  HMAC(K,C)= SHA1(K⊕0x5c5c...∥SHA1(K⊕0x3636...∥C)),⊕为XOR,∥为串联,(C为信息)

截断是一个函数,以定义的方式从HMAC的结果中选择4个字节。

然后HOTP(K,C)在数学上定义为:

  

HOTP(K,C)=截断(HMAC(K,C))& 0x7FFFFFFF的

我已经为我的测试使用了以下示例实现,它运行正常:

https://svn.forgerock.org/openam/tags/10.0.0-docs/products/amserver/source/com/sun/identity/authentication/modules/hotp/HOTPAlgorithm.java

我的问题是,是否可以使用HOTP而不是数字生成字母数字OTP。显而易见的优点是OTP的强度在给定长度上增加了许多倍。因此,8位字母数字代码远比8位数字代码更宽。

2 个答案:

答案 0 :(得分:1)

当然,您可以在HMAC(K,C)之后做任何您想做的事情。您可以将其映射到HEX或字母数字。

但是,您还必须创建自己的OTP令牌 - 硬件令牌或智能手机应用程序。 这是标准的好处,你不必创建自己的标准! ; - )

答案 1 :(得分:0)

字母数字有一个棘手的基础,基础62.如果你允许另外两个字符,那么你可以使用base 64(用你喜欢的任何值替换+/)。

否则,只需查找一个Base N编码库,例如Java的this one(没有尝试,不能评论正确性或性能)。

这不会影响安全性,因为生成的HOTP位与给定表示之间存在1:1的关系。换句话说,不同的基本表示和字母表在相同的位值上只是一个不同的视图