我在通过 CLI 使用 OpenSSL HMAC 提供计算一次性密码所需的计数器时遇到了问题。我认为我的问题在于计数器的编码。我无法在 RFC 中重现测试向量:
计数十六进制 HMAC-SHA-1(秘密,计数) 0 cc93cf18508d94934c64b65d8ba7667fb7cde4b0 1 75a48a19d4cbe100644e8ac1397eea747a2d33ab
我试过了:
回显-n“ 1” | openssl dgst-sha1-hmac“ 12345678901234567890”
我也尝试过 echo -e“\001”。
答案1
你的第二次尝试很接近了,但请注意,计数器始终8 个字节(大端字节序)。因此,如果计数器数值为 1,则它将以字节形式输入到 HMAC 00 00 00 00 00 00 00 01
。
$ echo -e -n '\x00\x00\x00\x00\x00\x00\x00\x00' | openssl dgst -sha1 -hmac 12345678901234567890
(stdin)= cc93cf18508d94934c64b65d8ba7667fb7cde4b0
$ echo -e -n '\x00\x00\x00\x00\x00\x00\x00\x01' | openssl dgst -sha1 -hmac 12345678901234567890
(stdin)= 75a48a19d4cbe100644e8ac1397eea747a2d33ab
为了进行比较,如果你用 Python 实现它:
key = b"12345678901234567890"
counter = 1
msg = struct.pack(">Q", counter)
result = hmac.HMAC(key, msg, hashlib.sha1)