Bash 中的 HMAC-SHA1

是否有 bash 脚本来生成 HMAC-SHA1散列?

我正在寻找与下面的 PHP 代码类似的东西:

hash_hmac("sha1", "value", "key");
104776 次浏览

我知道这不是你想要的,但是重造轮子和编写 bash 版本是没有意义的。

您可以简单地使用 openssl命令在脚本中生成散列。

[me@home] echo -n "value" | openssl dgst -sha1 -hmac "key"
57443a4c052350a44638835d64fd66822f813319

Or simply:

[me@home] echo -n "value" | openssl sha1 -hmac "key"
57443a4c052350a44638835d64fd66822f813319

请记住在 echo中使用 -n,否则字符串后面会附加一个换行符,这会改变数据和散列。

这个命令来自 OpenSSL 包,这个包应该已经安装(或者很容易安装)在您选择的 Linux/Unix、 Cygwin 等等中。

请注意,旧版本的 openssl(例如随 RHEL4一起提供的版本)可能不提供 -hmac选项。


作为另一种解决方案,但主要是为了证明结果是相同的,我们还可以从命令行调用 PHP 的 hmac_sha1():

[me@home]$ echo '<?= hash_hmac("sha1", "value", "key") ?>' | php
57443a4c052350a44638835d64fd66822f813319

下面是一个 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 函数!但这对我的申请来说还不够。如果有人想知道的话,我必须使用前一个散列的结果键重新散列好几次,因此这是一个二进制输入。(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 脚本可以工作的原因... ...)

对于那些喜欢在命令行中探索更多 JWT 的人: 很酷的 jwt bash 脚本

安装了 node.js 之后,你可以使用 HMAC-CLI工具:

npx hmac-cli generate 'value' -h sha1 -s key

报税表:

57443a4c052350a44638835d64fd66822f813319