是否有 bash 脚本来生成HMAC-SHA1
哈希?
我正在寻找与以下 PHP 代码等效的内容:
hash_hmac("sha1", "value", "key");
我意识到这并不完全是您所要求的,但是重新发明轮子并编写 bash 版本是没有意义的。
您可以简单地使用该openssl
命令在脚本中生成哈希。
[me@home] echo -n "value" | openssl dgst -sha1 -hmac "key"
57443a4c052350a44638835d64fd66822f813319
或者简单地说:
[me@home] echo -n "value" | openssl sha1 -hmac "key"
57443a4c052350a44638835d64fd66822f813319
请记住使用-n
with echo
,否则会在字符串中附加一个换行符,这会更改您的数据和哈希值。
该命令来自 OpenSSL 包,它应该已经安装(或轻松安装)在您选择的 Linux/Unix、Cygwin 等中。
请注意,旧版本openssl
(例如 RHEL4 附带的版本)可能不提供该-hmac
选项。
作为一种替代方案,但主要是为了证明结果是一样的,我们也可以hmac_sha1()
从命令行调用PHP的:
[me@home]$ echo '<?= hash_hmac("sha1", "value", "key") ?>' | php
57443a4c052350a44638835d64fd66822f813319
这是一个类似于hash_hmac
PHP 的 bash 函数:
#!/bin/bash
function hash_hmac {
digest="$1"
data="$2"
key="$3"
shift 3
echo -n "$data" | openssl dgst "-$digest" -hmac "$key" "$@"
}
# hex output by default
hash_hmac "sha1" "value" "key"
# raw output by adding the "-binary" flag
hash_hmac "sha1" "value" "key" -binary | base64
# other algos also work
hash_hmac "md5" "value" "key"
感谢 hash_hmac 函数!但这对我的申请来说还不够。万一有人想知道,我不得不使用以前散列的结果的密钥多次重新散列内容,因此是二进制输入。(Amazon AWS 身份验证签名是这样创建的。)
所以我需要的是一种以某种不会破坏算法的方式提供二进制密钥的方法。然后我发现了这个: http: //openssl.6102.n7.nabble.com/command-line-hmac-with-key-in-hex-td6754.html
Stephen Henson 的回复要求 hash_hmac 函数以十六进制格式返回值。所以它需要回显以下内容:
$ echo -n "$data" | openssl dgst "-$digest" -hmac "$key" | sed -e 's/^.* //'
然后下一个调用需要将密钥作为十六进制提供:
$ echo -n "$data" | openssl dgst "-$digest" -mac HMAC -macopt "hexkey:$key" | sed -e 's/^.* //'
希望这可以帮助任何人,可能是试图创建 bash 脚本以使 AWS 上的 CloudFront 条目无效的人(比如我!)(我还没有测试过,但我认为这就是为什么我的 bash 脚本的原因不起作用,而我的 PHP 则...)
安装 node.js 后,您可以使用HMAC-CLI工具:
npx hmac-cli generate 'value' -h sha1 -s key
返回:
57443a4c052350a44638835d64fd66822f813319
对于那些喜欢在命令行上探索更多 JWT 的人: cool jwt bash script