【发布时间】:2011-11-09 05:56:49
【问题描述】:
是否有 bash 脚本来生成 HMAC-SHA1 哈希?
我正在寻找与以下 PHP 代码等效的内容:
hash_hmac("sha1", "value", "key");
【问题讨论】:
是否有 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 与echo 一起使用,否则会在字符串中附加一个换行符,这会更改您的数据和哈希值。
该命令来自 OpenSSL 包,它应该已经安装(或轻松安装)在您选择的 Linux/Unix、Cygwin 等中。
请注意,旧版本的 openssl(例如 RHEL4 附带的版本)可能不提供 -hmac 选项。
作为替代方案,但主要是为了证明结果是一样的,我们也可以从命令行调用PHP的hmac_sha1():
[me@home]$ echo '<?= hash_hmac("sha1", "value", "key") ?>' | php
57443a4c052350a44638835d64fd66822f813319
【讨论】:
sha1 被替换为 sha256 :-)
openssl genrsa 创建的私钥吗?此外,openssl 文档链接会导致 404。
openssl 在哈希之前输出(stdin)= 。将-binary | xxd -plain 添加到openssl 命令的末尾可以解决此问题(请参阅unix.stackexchange.com/a/90242/58450)。
这是一个 bash 函数,其工作方式类似于 PHP 中的 hash_hmac:
#!/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 "sha1" "$(cat your-json-file)" "key"。或者,您可以直接通过 openssl dgst 管道传输您的文件,而不使用此 hash_hmac 函数。
感谢 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
【讨论】: