簡體   English   中英

bash 中的 HMAC-SHA1

[英]HMAC-SHA1 in bash

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

我正在尋找與以下 PHP 代碼等效的內容:

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

我意識到這並不完全是您所要求的,但是重新發明輪子並編寫 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

這是一個類似於 PHP 中的hash_hmac的 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"

感謝 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 則起作用了...)

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

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

返回:

57443a4c052350a44638835d64fd66822f813319

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM