Cryptography 使用HOTP生成字母数字OTP

Cryptography 使用HOTP生成字母数字OTP,cryptography,hmac,hmacsha1,Cryptography,Hmac,Hmacsha1,我知道HOTP可以用来创建一次性数字密码。背后的算法是: K是一个秘密密钥 C是一个计数器 HMAC(K,C)=SHA1(K⊕ 0x5c5c…∥ SHA1(K⊕ 0x3636…∥ C) )与⊕ 作为异或,∥ 作为串联,(C是消息) Truncate是一个函数,它以定义的方式从HMAC的结果中选择4个字节 那么HOTP(K,C)的数学定义为: HOTP(K,C)=截断(HMAC(K,C))&0x7fffff 我在测试中使用了以下示例实现,效果良好: 我的问题是,是否可以使用HOTP而不是数字生成

我知道HOTP可以用来创建一次性数字密码。背后的算法是:

K是一个秘密密钥
C是一个计数器
HMAC(K,C)=SHA1(K⊕ 0x5c5c…∥ SHA1(K⊕ 0x3636…∥ C) )与⊕ 作为异或,∥ 作为串联,(C是消息)

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

那么HOTP(K,C)的数学定义为:

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

我在测试中使用了以下示例实现,效果良好:


我的问题是,是否可以使用HOTP而不是数字生成字母数字OTP。明显的优点是,对于给定的长度,OTP的强度增加了很多倍。因此,8位字母数字代码远比8位数字代码更严格。

当然,在HMAC(K,C)之后,你可以做任何你想做的事情。您可以将其映射为十六进制或字母数字

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

字母数字有一个棘手的基数,基数62。如果允许再输入两个字符,则可以使用base 64(将
+
/
替换为您喜欢的任何值)

否则,只需查找Base N编码库,例如for Java(没有尝试过,无法对正确性或性能进行评论)


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

感谢cornelinux,很高兴知道这是可以做到的。你能给我多一点关于如何做的指导吗。我的SHA1返回一个20字节的值(-127到127)。如何使其成为字母数字值?首先,您应该决定要使用哪些字符。因此,您可以得到一个可能的列表(26+26+10=56个可能的字符)。然后您可能应该将一个字节映射到字符…好的,所以我需要将256个可能的字节组合从HMAC映射到62个可能的字符集。这基本上意味着256字节集中的4个字节将对应于62字节输出集中的1个字节。这很容易做到,但你认为这会降低HOTP的安全性/强度吗?不,我不这么认为。HOTP将输出减少到4字节(介于1.000.000之间的数字)。