基于HMAC的RFC 4226一次性密码算法HOTP使用“动态截断”函数将20字节的hma-sha-1值转换为31位字符串。动态截断(来自5.3节)的工作方式如下(和可能是没用的):
DT(String) // String = String[0]...String[19]
Let OffsetBits be the low-order 4 bits of String[19]
Offset = StToNum(OffsetBits) // 0 <= OffSet <= 15
Let P = String[OffSet]...String[OffSet+3]
Return the Last 31 bits of PTOTP (RFC 6238)允许在HOTP中使用SHA-256和SHA-512作为HMAC哈希,但似乎没有为它们定义一个新的动态截断函数:
TOTP实现可以使用基于SHA2 -256或SHA-512的HMAC-SHA-256或HMAC-SHA-512函数,而不是为RFC4226中的HOTP计算指定的HMAC-SHA-1函数。
我应该使用低4位的String[19]作为偏移量,使用低4位的String[length-1],还是使用其他一些位数,或者使用完全不同的截断算法?
发布于 2015-08-15 09:36:10
我通过复制测试向量找到了它。
TL;DR:标准假设您使用哈希的最后一个字节的低4位,而不管它的长度。因此,将原来DT定义中的19替换为31表示SHA-256,或者将63替换为SHA-512,这样就可以了。
找出这一点并不完全简单,因为标准中只列出了一个测试秘密:
测试令牌共享秘密使用ASCII字符串值"12345678901234567890“。当时间步长X= 30,以Unix纪元作为计算时间步骤的初始值时(其中T0 =0),TOTP算法将显示指定模式和时间戳的下列值。
事实上,要重现SHA-256和SHA-512的测试向量值,您必须将这个秘密扩展到32/64个字符。即使用ASCII字符串“1234567890123458901234589012”和"1234567890123456789012345678901234567890123456789012345678901234“。
https://crypto.stackexchange.com/questions/27474
复制相似问题