所以这是我项目中的一个问题。
在此任务中,我们将使用OpenSSL生成数字签名。请准备任意大小的文件(example.txt)。还准备一个RSA公钥/私钥对。然后执行以下操作:
- 签名example.txt的SHA256哈希;将输出保存在example.sha256中。
- 在example.sha256中验证数字签名。
- 稍微修改example.txt,然后再次验证数字签名。
请描述您如何执行上述三个操作(例如,所使用的确切命令等)。描述您观察到的内容并解释您的观察结果。还请说明为什么数字签名通常很有用。
因此,我执行以下操作。
1.创建私钥/公钥对
openssl genrsa -out private.pem 1024
Run Code Online (Sandbox Code Playgroud)
2.提取公钥。
openssl rsa -in private.pem -out public.pem -outform PEM -pubout
Run Code Online (Sandbox Code Playgroud)
3.创建数据的哈希。
echo 'data to sign' > example.txt
openssl dgst -sha256 < example.txt > hash
Run Code Online (Sandbox Code Playgroud)
4.使用私钥将哈希签名到名为example.sha256的文件
openssl rsautl -sign -inkey private.pem -keyform PEM -in hash > example.sha256
Run Code Online (Sandbox Code Playgroud)
5.验证文件(example.txt)和数字签名(example.sha256)
openssl dgst -sha256 -verify public.pem -signature example.sha256 example.txt
Run Code Online (Sandbox Code Playgroud)
完成所有这些操作后,我收到一条错误消息,提示“ 验证失败 ”
如果我在某个地方出错,请纠正我。
不要rsautl为此使用。
根据PKCS1.5,在对进入RSA操作的数据格式进行签名时,如下所示:
<padding><metadata><hash of input>
Run Code Online (Sandbox Code Playgroud)
(元数据指定已使用的哈希函数。)
openssl dgst -verify当您尝试验证签名时,将使用此格式。但是,这不是您在步骤中创建的。
首先,默认的输出openssl dgst是结果哈希的十六进制编码,而不是原始字节。
其次,rsautl是相当“低级的”,并且在签名时没有添加openssl dgst -verify期望的元数据,尽管它确实添加了填充。
这两件事共同意味着您正在使用的数据如下所示:
<padding><hex digits of hash of input>
Run Code Online (Sandbox Code Playgroud)
显然,这与openssl dgst -verify预期不符,因此验证失败。
可能会为创建正确格式的输入rsautl,但这很麻烦并且涉及处理ASN.1详细信息。您也可以使用rsautl -verify代替dgst -verify,但是这还需要更多详细信息,这意味着您使用的是非标准签名格式。
最简单的解决方案是openssl dgst用于签名的创建和验证。用example.txt单个命令替换步骤3和4(创建文件除外):
$ openssl dgst -sha256 -sign private.pem -out example.sha256 example.txt
Run Code Online (Sandbox Code Playgroud)
这会哈希数据,正确格式化哈希并对其执行RSA操作。生成的文件应使用openssl dgst -verify命令正确验证。
小智 5
感谢马特提供的解决方案。小问题:OP似乎想要签署哈希值而不是实际的整个数据(也是我想做的事情)。因此使用下面的方法来生成签名:
openssl dgst -sha256 -sign private.pem -out hash.sig hash
Run Code Online (Sandbox Code Playgroud)
并在下面验证签名
openssl dgst -sha256 -verify public.pem -signature hash.sig hash
Run Code Online (Sandbox Code Playgroud)
最后如下所示来验证有效负载的完整性:
echo "`hash` example.txt" | sha256sum -c --strict
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8622 次 |
| 最近记录: |