![如何通过 CLI 为 rfc4226 提供计数器到 OpenSSL HMAC 函数?](https://linux22.com/image/1610824/%E5%A6%82%E4%BD%95%E9%80%9A%E8%BF%87%20CLI%20%E4%B8%BA%20rfc4226%20%E6%8F%90%E4%BE%9B%E8%AE%A1%E6%95%B0%E5%99%A8%E5%88%B0%20OpenSSL%20HMAC%20%E5%87%BD%E6%95%B0%EF%BC%9F.png)
我在通过 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)