秘密を開示せずにBashでHMACを生成する

秘密を開示せずに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

答え1

リダイレクトはパラメータリストの一部ではありません。

これは垣間見ることから安全であると考えられる。

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

私も同じ質問をしたことがあります。OpenSSLメーリングリスト

Fedora 37またはRHEL 8を使用している場合、このlibkcapi-hmaccalcパッケージには背中がありますsha1hmacsha512hmac

したがって、次のものを置き換えることができます。

$ echo -n toto | openssl dgst -hmac tata -sha1
SHA1(stdin)= 6c497bab7bcc37d768364b570445ee10a4fb17d6

そして

$ echo -n toto | sha1hmac -k <(echo -n tata) 
6c497bab7bcc37d768364b570445ee10a4fb17d6

バラよりマニュアルページ

これにより、プロセスリストからキーが漏洩するのを防ぐことができます(キーがBash履歴に記録されていないことを確認する必要がありますが、これは質問の範囲ではありません)。

関連情報