HMAC-SHA1在bash


67

有一个bash脚本生成一个散列HMAC-SHA1

我在寻找的东西相当于下面的PHP代码:

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

我知道这不是你问什么了,但没有点重新发明轮子,写一个bash版。

您可以简单地使用openssl命令生成脚本中的哈希值。

[[email protected]] echo -n "value" | openssl dgst -sha1 -hmac "key" 
57443a4c052350a44638835d64fd66822f813319 

或者干脆:

[[email protected]] echo -n "value" | openssl sha1 -hmac "key" 
57443a4c052350a44638835d64fd66822f813319 

记住使用-necho要不换行字符附加到字符串,并改变你的数据和散列。

这个命令来自哪个应该已经在你所选择的Linux/Unix,Cygwin和喜欢的安装(或易于安装)OpenSSL包。

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


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

[[email protected]]$ echo '<?= hash_hmac("sha1", "value", "key") ?>' | php 
57443a4c052350a44638835d64fd66822f813319 
  0

OpenSSL的实现是很慢的。如果你偶尔需要这样做,那很好,但是如果你想要计算大量的哈希,你想调查不同的途径。 02 9月. 112011-09-02 16:08:44

+1

@Marcin:你可以引用一个来源吗? 12 9月. 112011-09-12 08:49:50

  0
+4

我对HMAC-SHA256有同样的问题。同样的解决方案,'sha1'替换为'sha256' :-) 26 1月. 122012-01-26 14:18:32

  0

如果我在文件中有''value“',我可以这样做:'cat signature.txt | openssl sha1 -hmac“key”'? 19 4月. 132013-04-19 12:08:58

+1

是的,你可以,但请注意文件中的换行符,因为这也可以被认为是价值的一部分。 19 4月. 132013-04-19 12:57:17

+1

@ShawnChin,在这个例子中,密钥的编码/格式是什么?它应该是像使用'openssl genrsa'创建的私钥一样的base64编码吗?另外,openssl文档链接的结果为404. 18 8月. 152015-08-18 05:07:00

  0

如何在“key”是包含特殊字符的二进制数组时传递key来openssl? 05 10月. 162016-10-05 11:21:05

  0

感谢您的信息。最后多余的线路突破让我有一段时间在那里。 30 10月. 162016-10-30 11:22:59

  0

请勿使用'echo -n'。它不是便携式的。改用printf。 09 3月. 182018-03-09 14:01:28


30

这里是一个bash的功能就像hash_hmac from PHP:

#!/bin/bash 

function hash_hmac { 
    digest="$1" 
    data="$2" 
    key="$3" 
    shift 3 
    echo -n "$data" | openssl dgst "-$digest" -hmac "$key" "[email protected]" 
} 

# 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" 
  0

这是一个很好的方式来包装它。 +1 12 9月. 112011-09-12 09:34:41

+2

感谢二进制:) 07 9月. 122012-09-07 12:19:07

  0

+1因为不同于选定的答案,这一个回答问题。 (虽然两者都有帮助。) 22 6月. 132013-06-22 13:30:05


2

感谢您的hash_hmac功能!但这对我的应用程序来说还不够。在任何人想知道的情况下,我必须使用之前哈希结果的密钥重新哈希几次,因此是二进制输入。 (亚马逊AWS认证签名这样的创建。)

我需要那么什么是供应以某种方式,不会破坏算法二进制键的方式。后来我发现这一点:http://openssl.6102.n7.nabble.com/command-line-hmac-with-key-in-hex-td6754.html

斯蒂芬·亨森的答复要求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不能正常工作......)


0

对于那些谁喜欢探索在命令行上更多的智威汤逊: 个cool jwt bash script