bashのHMAC-SHA1


95

HMAC-SHA1ハッシュを生成するbashスクリプトはありますか?

次のPHPコードに相当するものを探しています。

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

回答:


185

これはあなたが求めているものとは正確には違いますが、ホイールを再発明してbashバージョンを作成する意味はありません。

opensslコマンドを使用して、スクリプト内でハッシュを生成できます。

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

または単に:

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

文字列に改行文字が付加されているかどうかを忘れずに使用-necho、データとハッシュを変更します。

このコマンドは、選択したLinux / Unix、Cygwinなどにすでにインストールされている(または簡単にインストールできる)OpenSSLパッケージからのものです。

古いバージョンopenssl(RHEL4に同梱されているバージョンなど)では-hmacオプションを提供できない場合があることに注意してください。


代替ソリューションとして、主に結果が同じであることを証明するためにhmac_sha1()、コマンドラインからPHPを呼び出すこともできます。

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

OpenSSLの実装は非常に低速です。時々それを行う必要がある場合は問題ありませんが、大量のハッシュを計算しようとしている場合は、さまざまな方法を調査する必要があります。
Marcin

1
@Marcin:ソースを引用できますか?
sehe

6
HMAC-SHA256についても同じ質問がありました。同じソリューションですが、次のようsha1に置き換えられますsha256:-)
mogsie 2012年

1
はい、できますが、ファイル内の改行に注意してください。改行も値の一部と見なされます。
Shawn Chin

1
@ShawnChin、この例では、キーのエンコーディング/フォーマットは何ですか?それはを使用して作成された秘密鍵のようなbase64エンコーディングである必要がありますopenssl genrsaか?404でまた、OpenSSLの文書リンク結果
カルロスMacasaet

40

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"

それはそれをまとめる良い方法です。+1
Shawn Chin

+1は、選択した回答とは異なり、尋ねられた質問に答えます。(どちらも役に立ちます。)
Alexx Roche 2013

しかし、複数行の場合、スクリプトに 'data'引数をどのように渡しますか?インデントを失うことなくxmlまたはjson本体のように。
HyperioN 2018

@HyperioNあなたがあなたのjsonデータをファイルに持っているなら、あなたは単にこれを行うことができます:hash_hmac "sha1" "$(cat your-json-file)" "key"。または、openssl dgstこのhash_hmac関数を使用せずにファイルをパイプすることもできます。
マーティン

9

hash_hmac関数をありがとう!しかし、私のアプリケーションには十分ではありませんでした。誰かが不思議に思った場合に備えて、前回のハッシュの結果である、したがってバイナリ入力であるキーを使用して、何回か再ハッシュする必要がありました。(Amazon AWS認証署名は次のように作成されます。)

したがって、必要なのは、アルゴリズムを壊さない方法でバイナリキーを提供する方法でした。それから私はこれを見つけました:http : //openssl.6102.n7.nabble.com/command-line-hmac-with-key-in-hex-td6754.html

Stephen Hensonの応答では、hash_hmac関数が16進形式で値を返す必要があります。したがって、以下をエコーする必要があります。

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

うまくいけば、これが誰でも、おそらくAWSのCloudFrontエントリを無効にするbashスクリプトを作成しようとしている人(私のように!)を助けます(私はまだそれをテストしていませんが、これが私のbashスクリプトの原因であると思います動作しません、そして私のPHPは動作します...)


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.