在 Bash 中生成 HMAC,而不泄露秘密

在 Bash 中生成 HMAC,而不泄露秘密

我想在 bash 脚本中计算 HMAC-SHA512 摘要。到目前为止,我发现只有这个在许多不同的网站上重复了很多次。

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

显然,没有人意识到这不是将秘密字符串传递给程序的正确方法,因为秘密将在系统上运行的每个其他进程的进程列表中可见。有没有其他方法(也许使用其他工具)可以轻松地在 shell 中创建 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

重定向不是参数列表的一部分。

这被认为是安全的,不会受到 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

我已经问过同样的问题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 历史记录中,但这不是您问题的范围)。

相关内容