![在 Bash 中生成 HMAC,而不泄露秘密](https://linux22.com/image/126438/%E5%9C%A8%20Bash%20%E4%B8%AD%E7%94%9F%E6%88%90%20HMAC%EF%BC%8C%E8%80%8C%E4%B8%8D%E6%B3%84%E9%9C%B2%E7%A7%98%E5%AF%86.png)
我想在 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
软件包提供sha1hmac
、sha512hmac
等。
所以你可以替换:
$ echo -n toto | openssl dgst -hmac tata -sha1
SHA1(stdin)= 6c497bab7bcc37d768364b570445ee10a4fb17d6
和
$ echo -n toto | sha1hmac -k <(echo -n tata)
6c497bab7bcc37d768364b570445ee10a4fb17d6
看手册页
这可以防止密钥在进程列表中泄漏(您仍然需要检查该密钥是否未写入 Bash 历史记录中,但这不是您问题的范围)。