2

我需要十六进制形式的签名数据,所以我使用:

openssl dgst -sha256 -hex -sign ./id_rsa my.data > my.signature

openssl 文档指出:

无法使用 openssl 验证十六进制签名。相反,在验证之前使用“xxd -r”或类似程序将十六进制签名转换为二进制签名。资源

但是,当我尝试这样做时......

echo "$(cat my.signature)" | xxd -r -p > binary.signature

...我什么也得不到

谁能看到我做错了什么?

4

1 回答 1

4

丹,十六进制签名文件不是普通的十六进制字符串。xxd它以无法解析的非十六进制前缀开头。类似的东西RSA-SHA256(my.data)=。您需要在验证之前将其删除。

cat my.signature | sed -e 's/.*= \([^ ]\+\)$/\1/' | xxd -r -p > binary.signature

一点小窍门。如果你是用来ssh-keygen创建文件id_rsa的,那么对应id_rsa.pub的就不适合了openssl,它是ssh格式的。您需要生成 PEM 格式的公钥。

openssl rsa -in id_rsa -pubout > id_rsa.pub.pem

这是验证的正确格式。

openssl dgst -verify id_rsa.pub.pem -signature binary.signature my.data
-> Verified OK
于 2017-12-22T06:21:34.070 回答