据我所知,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的
我已经为我的测试使用了以下示例实现,它运行正常:
我的问题是,是否可以使用HOTP而不是数字生成字母数字OTP。显而易见的优点是OTP的强度在给定长度上增加了许多倍。因此,8位字母数字代码远比8位数字代码更宽。
答案 0 :(得分:1)
当然,您可以在HMAC(K,C)之后做任何您想做的事情。您可以将其映射到HEX或字母数字。
但是,您还必须创建自己的OTP令牌 - 硬件令牌或智能手机应用程序。 这是标准的好处,你不必创建自己的标准! ; - )
答案 1 :(得分:0)
字母数字有一个棘手的基础,基础62.如果你允许另外两个字符,那么你可以使用base 64(用你喜欢的任何值替换+
和/
)。
否则,只需查找一个Base N编码库,例如Java的this one(没有尝试,不能评论正确性或性能)。
这不会影响安全性,因为生成的HOTP位与给定表示之间存在1:1的关系。换句话说,不同的基本表示和字母表在相同的位值上只是一个不同的视图。