bash中的HMAC-SHA1

Mar*_*ark 86 bash sha1 hmac

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

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

hash_hmac("sha1", "value", "key");
Run Code Online (Sandbox Code Playgroud)

Sha*_*hin 168

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

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

[me@home] echo -n "value" | openssl dgst -sha1 -hmac "key"
57443a4c052350a44638835d64fd66822f813319
Run Code Online (Sandbox Code Playgroud)

或者干脆:

[me@home] echo -n "value" | openssl sha1 -hmac "key"
57443a4c052350a44638835d64fd66822f813319
Run Code Online (Sandbox Code Playgroud)

请记住使用-nwith echo,否则会在字符串后附加换行符,从而更改数据和散列.

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

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


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

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

  • 我和HMAC-SHA256有同样的问题.同样的解决方案,但`sha1`替换为`sha256` :-) (5认同)
  • 这在 Mac 上对我有用,但在 CentOS 7 机器上 `openssl` 在哈希之前输出 `(stdin)= `。添加 `-binary | 在 `openssl` 命令末尾添加 xxd -plain` 可修复此问题(请参阅 https://unix.stackexchange.com/a/90242/58450)。 (3认同)
  • @ShawnChin,在这个例子中,密钥的编码/格式是什么?它应该是像使用“openssl genrsa”创建的私钥一样的base64编码吗?此外,openssl 文档链接会导致 404。 (2认同)

Mar*_*tin 39

这是一个像hash_hmacPHP 一样工作的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"
Run Code Online (Sandbox Code Playgroud)


Wou*_*len 9

感谢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/^.* //'
Run Code Online (Sandbox Code Playgroud)

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

$ echo -n "$data" | openssl dgst "-$digest" -mac HMAC -macopt "hexkey:$key" | sed -e 's/^.* //'
Run Code Online (Sandbox Code Playgroud)

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