【问题标题】:HMAC-SHA1 in bashbash 中的 HMAC-SHA1
【发布时间】:2011-11-09 05:56:49
【问题描述】:

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

我正在寻找与以下 PHP 代码等效的内容:

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

【问题讨论】:

    标签: bash sha1 hmac


    【解决方案1】:

    我意识到这并不是您所要求的,但是重新发明轮子并编写 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
    

    【讨论】:

    • @Marcin:你能引用一个消息来源吗?
    • 我对 HMAC-SHA256 有同样的问题。相同的解决方案,但 sha1 被替换为 sha256 :-)
    • 可以,但请注意文件中的换行符,因为这也会被视为值的一部分。
    • @ShawnChin,在这个例子中,密钥的编码/格式是什么?它应该是 base64 编码,例如使用 openssl genrsa 创建的私钥吗?此外,openssl 文档链接会导致 404。
    • 这在 Mac 上对我有用,但在 CentOS 7 机器上openssl 在哈希之前输出(stdin)= 。将-binary | xxd -plain 添加到openssl 命令的末尾可以解决此问题(请参阅unix.stackexchange.com/a/90242/58450)。
    【解决方案2】:

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

    【讨论】:

    • 这是一个很好的总结方式。 +1
    • +1 因为与所选答案不同,这个答案回答了所提出的问题。 (虽然两者都有帮助。)
    • 但是,如果它是多行的,如何将“数据”参数传递给脚本?就像 xml 或 json 正文一样,不会丢失缩进。
    • @HyperioN 如果您的文件中有 json 数据,您可以简单地执行以下操作:hash_hmac "sha1" "$(cat your-json-file)" "key"。或者,您可以直接通过 openssl dgst 管道传输您的文件,而不使用此 hash_hmac 函数。
    • 感谢您提供 -binary 位。这对我来说是缺失的部分
    【解决方案3】:

    感谢 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 脚本却……)

    【讨论】:

      【解决方案4】:

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

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

      返回:

      57443a4c052350a44638835d64fd66822f813319
      

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 2019-07-04
          • 1970-01-01
          • 2012-10-12
          • 2011-01-28
          • 1970-01-01
          • 2011-10-26
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多