我需要从命令行使用 OpenSSL 执行以下 Java 代码片段:
private byte[] hmacSha256(byte[] key, byte[] payload) throws GeneralSecurityException {
Mac mac = Mac.getInstance("HmacSHA256");
mac.init(new SecretKeySpec(key, "HmacSHA256"));
mac.update(payload);
return mac.doFinal();
}
这些是适用于 Java 但不适用于 OpenSSL 的测试值:
KEY_BASE64="xtztqVgjD+5VHL4rVeKYm0USpDJTEy5Tjc9aK6I/oV0="
KEY_HEX="c6dceda958230fee551cbe2b55e2989b4512a43253132e538dcf5a2ba23fa15d"
PAYLOAD_BASE64="j9F8TrzCabcDoLdHUDaUuv6ea224xikwbPF1IW0OjkY="
DIGEST_HEX="c2ec711448a4f5bb851279eca0a628847254855966ad09de7e734b7df48e198a"
我已经尝试过了这个答案但我得到了不同的结果。它看起来像这样:
$ echo $PAYLOAD_BASE64 | base64 -d | openssl dgst -sha256 -hmac -hex -macopt hexkey:$KEY_HEX
(stdin)= 93d5555dbf95873441ccc63f9a4bc361e6f291f7b0a81db4edc35b8212b04dad
它确实为我提供了十六进制格式的输出,但该值与我使用相同的负载和键值运行该 Java 代码片段时得到的值不匹配。
我还可以使用另一个命令行工具,只要它在大多数 Linux 默认包管理器列表中广泛可用即可。
答案1
我得到了这个工作。我所要做的就是使用openssl sha256
而不是openssl dgst -sha256
.
这是完整的命令:
$ echo $PAYLOAD_BASE64 | base64 -d | openssl sha256 -hex -mac HMAC -macopt hexkey:$KEY_HEX
(stdin)= c2ec711448a4f5bb851279eca0a628847254855966ad09de7e734b7df48e198a
答案2
如果您安装了 NodeJ:
echo "console.log(require('crypto').createHmac('sha256', 'nonbase64key').update('password').digest('hex'))" | node
它在Python中的等价物是:
python3 -c 'import hashlib;import base64;import hmac;print(hmac.new(b"nonbase64key", "password".encode(), hashlib.sha256).hexdigest())'
等效的纯 shell 命令是:
echo -n "password" | openssl sha256 -hmac "nonbase64key"
答案3
macOS 终端的示例是错误的。
我的 2 美分,如果你使用的是 iOS(或 Mac OS...),厌倦了我写的。
https://apps.apple.com/it/app/hmac-sha256generator/id6448465719?l=en
答案4
openssl sha256 -hex -mac HMAC -macopt key:<key here> file.txt