为什么 OpenSSL 工具可以成功验证未签名的文件?

Why OpenSSL tools can successfully verify a not signed file?

我有两个内容相同的文件:msg.txt 和 msg2.txt。 msg.txt 已签名,msg2.txt - 未签名。但是我看到两个文件都通过了签名验证。

为什么会这样?我想如果我签署一个文件,签名应该附在文件的某处。但是 hexdump 显示文件之间没有区别。

msg.txt

$ hexdump -C msg.txt
00000000 48 69 0a                     |Hi.|
00000003

msg2.txt

$ hexdump -C msg2.txt 
00000000 48 69 0a                     |Hi.|
00000003

现在每个包含 "Hi" 个单词的新文件都可以成功验证。如果另一个用户创建了一个包含 "Hi" 个单词的文件怎么办?!

重现步骤:

  1. 创建自签名 PEM 证书-密钥对
openssl req -x509 -sha512 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 
  1. 创建文件
$ echo "Hi" > msg.txt
$ echo "Hi" > msg2.txt
  1. 签名msg.txt
$ openssl dgst -sha512 -sign key.pem -out /tmp/signature msg.txt
$ openssl base64 -in /tmp/signature -out signature
  1. 验证msg.txt签名
$ openssl base64 -d -in signature -out /tmp/signature
$ openssl x509 -pubkey -noout -in cert.pem > pubkey.pem
$ openssl dgst -sha512 -verify pubkey.pem -signature /tmp/signature msg.txt
Verified OK
  1. 验证msg2.txt签名
$ openssl dgst -sha512 -verify pubkey.pem -signature /tmp/signature msg2.txt
Verified OK

I thought if I sign a file, the signature should be attached somewhere to the file.

您明确地将签名放入单独的文件 /tmp/signature 中,您稍后在验证签名时使用该文件 - 这解释了为什么签名不是文件的一部分。

而且您没有签署文件,而是签署了文件的内容 - 这解释了为什么可以将签名应用于内容完全相同的两个单独的文件。