我尝试加密一些负载,这是一个最小工作示例(是 RSA 私钥)
to_be_signed="2f93992bb1db9cab0b3b8fc2de0a2863"
#to_be_signed="7d6d2a584a227574e1c113aab56ea490"
# Sign poly_1305 with private key
signature=$(openssl dgst \
-sha256 \
-sign ${privkey} \
<(echo "${to_be_signed}")
)
if [ ${?} -eq 0 ]; then
echo "[*] to_be_signed correctly signed"
else
echo "ERROR signing to_be_signed" && exit 2
fi
第一个to_be_signed
没有生成任何警告,第二个to_be_signed
生成了:警告:命令替换:忽略了输入中的空字节
这到底是什么意思?对于某些特定值,我收到此与 bash 相关的警告;我用来对值进行签名的方式是否存在任何流程?
我绝对需要使用变量来将它们的值保存在内存中,即不存储在磁盘上的临时文件中。这是一个强烈的要求。
答案1
你的 shell 会对某些字符进行不同的处理 - 并且二进制签名可以包含任意数据。
- 如果您打算合作
[a-f0-9]
(正如您的输入所建议的那样)请加入-hex
通话dgst
。 - 如果您打算使用二进制数据,请更改传递包含空值的方式。管道将起作用,但直接使用包含空字节的字符串作为命令参数或分配给 shell 变量则不起作用。
提示:使用该程序shellcheck
生成有关此问题的自动警告 - 以及所有此类语法,您的代码可能会触发意外的 shell 解析器奇怪之处/功能。