web-dev-qa-db-ja.com

秘密を明かさずにBashでHMACを生成する

BashスクリプトでHMAC-SHA512ダイジェストを計算したいのですが。これまでのところ、これは多くの異なるサイトで何度も繰り返されることがわかりました。

echo -n message | openssl dgst -sha256 -hmac secret -binary >message.mac

シークレットはシステムで実行されている他のすべてのプロセスのプロセスリストに表示されるため、これは誰にもプログラムにシークレット文字列を渡す適切な方法ではないことを認識しているようです。シークレットを渡すための優れたインターフェイスを備えたシェルでHMACを簡単に作成する他の方法(おそらく他のツールを使用)はありますか?

[〜#〜]更新[〜#〜]

私は次のツール(~/bin/hmac)今。 MACKEY環境変数からキーを取得します。

#!/usr/bin/env python3
import hmac, sys, os

key    = os.environ['MACKEY'].encode('utf-8')
algo   = os.getenv('MACALGO', 'sha512')
digest = hmac.new(key, digestmod = algo)

while True:
    buf = sys.stdin.buffer.read(512)
    if not buf:
        break
    digest.update(buf)

print(digest.hexdigest())

使用法:

echo -n message | MACKEY=foobar hmac
2
Mark Howard

リダイレクトは引数リストの一部ではありません。

これは、psスヌーピングから安全であると見なされます。

cmd </file/key
cmd <<<"key"

名前のないパイプもスクリプト内で可能です

echo "secret" | cmd

安全なパスワードの受け渡しの例

したがって、このスクリプトは安全であると見なされます。

#!/bin/bash

read secretkey </dev/stdin

var="<?= hash_hmac(\"sha512\", \"$1\", \"$secretkey\"); ?>"

php7.1 <<<"$var"

</dev/stdin</dir/keyfileキーをファイルに保存できる場合。

stdinバージョンの場合は、次のように使用します。

./script "Message" <<<"secretkey"
2
Isaac