使用 SHA256 摘要签名的 OpenSSL RSA

OpenSSL RSA signing with SHA256 digest

我正在尝试找出与我拥有的 ruby 小脚本等效的 shell 脚本。这是 ruby 脚本:

require 'openssl'
require 'base64'

k = OpenSSL::PKey::RSA.new(File.read("key.pem"))
res = File.read("res.tmp")
digest = OpenSSL::Digest::SHA256.new
signature = k.sign(digest,res)
File.write("foo1.txt",Base64.strict_encode64(signature))

就是这样。它需要一些数据,获取它的 SHA256 哈希值,然后用我拥有的私钥对其进行签名。我认为终端上的等效命令应该是:

openssl sha -sha256 -sign key.pem < res.tmp | base64 -w 0 > foo2.txt

但是这些不会产生相同的输出。谁能告诉我为什么?

-- 编辑--

我正在添加更多信息,以便人们可以在需要时尝试在他们的计算机上重现它。 res.tmp的内容是:

This is some sample text. 
This is some sample text. 
This is some sample text. 
This is some more sample text. 
This is some more sample text. 
This is some more sample text.

私钥(不是实际用于任何生产系统的私钥,只是澄清一下)是:

-----BEGIN PRIVATE KEY-----
MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBALNY2EtJTj78tvnL
G1v+5HFqn8mZ85AToUqj/n86/eymcMqEjskHAoVmU9FOr+ZsnSxopNvUVLCzDkv6
w88tUtHGblzFtzJpQrxvtH8VCd2BNUc6Esxx7lmQeCxJMMPnmY2ZkDZuH6L+UsVL
DbM7LCvJyluo/A3AP68G9YL+XTjFAgMBAAECgYBkJzsyX894UTwFJq0ypJcB1x9A
P97KGIw72HTorBLdMt1N2tS54lZAFLK98gk8zm6/O/jEYkChJHzZZUIv0gmq+HOG
CHLyBNsf3BzmBXmwLRIOf54MxwaafysjpHifuYB4Po7G/utvlYqIxg1mBo/KtnMC
Wl2Enmrunei6gN3SAQJBAN94UfraP7lG50OYWhkcso95xpGrCeoFT64dV9I56FhU
q4tD6SSeIXj50hvSH2MQMdFBjsUHPIt+X7zw17ywgwUCQQDNdETg4FD3YT1xolWD
IFEowLlKfNqSaDIQia0dMIzk1/IqOoYhRKH03A97Wae1w/iyMgefyOVvkk+FZUs7
r0rBAkAnZox1wTNJFIJD/cGs+c1V1K+5EUIPO95/oXbRfxpDMLKKPHAH38WhEdME
yrhz++/8qCVnAc6f/akdpA01nJ2NAkEArC1GE9aow8fgADz0wMDygt6P6ZacbZmY
azeVtiKb0KQQM8d75KFpwJQy/UJzQ+aJonw+2282p7vLnJT46XnLgQJALxzSBu0D
hXIDTAMBpon+zgXjiy0ndiigLDPh1jJyCXrH0tBwj3FN+Br3yxbZT2LmE6PLIaJy
rkTCKqlnkG2h+w==
-----END PRIVATE KEY-----

现在,任何人都应该能够 运行 我在上面给出的命令并获得相同的结果。 shell 脚本的输出是这样的:

l4BxJyo/GQ0vUF5YR/vO7NtX5Sn/9bGfNHiVGS+W1CMfrwVlCtT0afHERXowx5T8mOiZ90VCJioHMj9Z6ssmfF1SpUbpoo1HYwNBCAfEcIjPLBj4N4KDLpy4gbMZtHEo2B8DZitYLwYDyvkCEudrMiU9b39DqOL+p3pwjJxT5iE=

当然没有尾随换行符。 ruby 脚本生成:

l4BxJyo/GQ0vUF5YR/vO7NtX5Sn/9bGfNHiVGS+W1CMfrwVlCtT0afHERXowx5T8mOiZ90VCJioHMj9Z6ssmfF1SpUbpoo1HYwNBCAfEcIjPLBj4N4KDLpy4gbMZtHEo2B8DZitYLwYDyvkCEudrMiU9b39DqOL+p3pwjJxT5iE=

也没有尾随换行符。我只对结果进行了 base 64 编码,使它们可以呈现给人类。那部分不是问题。真正的问题是我在 ruby 脚本和 shell 脚本中对 openssl 的调用正在做不同的事情。在评论中,人们不断询问中间结果。需要明确的是,在 base64 编码之前,原始二进制结果中唯一可以被视为 "intermediate result" 的东西(在这里 post 对我来说既无用又不可能)。我 运行ning 的 openssl 命令只是一个不透明的命令(在两个脚本中),所以在任何一种情况下我都无法访问 SHA256 哈希。我想它会用这个命令生成:

sha256sum res.tmp

在命令行给出的是:

688a84cb84ce3b203460a2775248a31d4c3e9590a41ba27134dc342c328b8f9c  res.tmp

但我不能确定上面的散列实际上是两个脚本中任何一个的任何中间结果。如果我可以提供更多信息,请告诉我。谢谢。

不知何故,我最终弄错了,看来这两个脚本确实产生了相同的输出。对不起。