bash中的HMAC-SHA1

时间:2011-09-02 14:36:52

标签: bash sha1 hmac

是否有bash脚本生成HMAC-SHA1哈希?

我正在寻找与以下PHP代码等效的东西:

hash_hmac("sha1", "value", "key");

5 个答案:

答案 0 :(得分:163)

我意识到这并不是你所要求的,但重新发明轮子和编写bash版本毫无意义。

您只需使用openssl命令在脚本中生成哈希值。

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

或者简单地说:

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

请记住将-necho一起使用,否则会在字符串后附加换行符,这会更改您的数据和散列。

该命令来自OpenSSL软件包,该软件包应该已经安装(或轻松安装)在您选择的Linux / Unix,Cygwin等中。

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


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

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

答案 1 :(得分:38)

这是一个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"

答案 2 :(得分:6)

感谢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/^.* //'

然后下一个调用需要提供键作为hexit:

$ echo -n "$data" | openssl dgst "-$digest" -mac HMAC -macopt "hexkey:$key" | sed -e 's/^.* //'

希望这可以帮助任何人,可能是那些尝试创建bash脚本以使AWS上的CloudFront条目无效的人(像我一样!)(我还没有对其进行测试,但我认为这就是原因所在为什么我的bash脚本不起作用,我的PHP脚本... ...

答案 3 :(得分:0)

对于那些喜欢在命令行上探索更多JWT的人: cool jwt bash script

答案 4 :(得分:0)

已安装node.js,可以使用HMAC-CLI工具:

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

返回:

57443a4c052350a44638835d64fd66822f813319