Ruby 使用SHA256摘要的OpenSSL RSA签名

Ruby 使用SHA256摘要的OpenSSL RSA签名,ruby,shell,openssl,rsa,Ruby,Shell,Openssl,Rsa,我正试图找出与我拥有的一个小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.

我正试图找出与我拥有的一个小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
私钥(不是实际用于任何生产系统的私钥,只是澄清一下)是:

现在,任何人都应该能够运行我上面给出的命令并获得相同的结果。shell脚本将生成以下内容作为其输出:

l4BxJyo/GQ0vUF5YR/vO7NtX5Sn/9bGfNHiVGS+W1CMfrwVlCtT0afHERXowx5T8mOiZ90VCJioHMj9Z6ssmfF1SpUbpoo1HYwNBCAfEcIjPLBj4N4KDLpy4gbMZtHEo2B8DZitYLwYDyvkCEudrMiU9b39DqOL+p3pwjJxT5iE=
当然没有尾随的换行符。ruby脚本生成:

l4BxJyo/GQ0vUF5YR/vO7NtX5Sn/9bGfNHiVGS+W1CMfrwVlCtT0afHERXowx5T8mOiZ90VCJioHMj9Z6ssmfF1SpUbpoo1HYwNBCAfEcIjPLBj4N4KDLpy4gbMZtHEo2B8DZitYLwYDyvkCEudrMiU9b39DqOL+p3pwjJxT5iE=
也没有尾随的换行符。我只对结果进行了Base64编码,以使其对人类形象化。这部分不是问题所在。真正的问题是,我在ruby脚本和shell脚本中调用openssl做了不同的事情。在评论中,人们不断询问中间结果。需要明确的是,在base64编码之前的原始二进制结果中,唯一可以被视为“中间结果”的东西(我不可能在这里发布这一点,也没有任何帮助)。我正在运行的openssl命令只是一个不透明命令(在两个脚本中),因此在这两种情况下我都无法访问SHA256散列。我认为它将通过以下命令生成:

sha256sum res.tmp
这将在命令行中给出:

688a84cb84ce3b203460a2775248a31d4c3e9590a41ba27134dc342c328b8f9c  res.tmp

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

不知何故,我错了,看来这两个脚本确实产生了相同的输出。抱歉。

您每次都从ruby脚本中得到相同的结果吗?您是否从ruby脚本和openssl命令获得相同的中间结果?您正在使用哪个版本的openssl?@EtanReisner是的。这两个脚本都是完全确定的。它们每次运行时都给出相同的结果。“中间结果”(如果您指的是base64编码之前的原始二进制数据)每次也是相同的。我不知道运行这些命令的计算机上的openssl是什么版本,但它应该是ubuntu quantum quetzal repo中的版本。两个脚本之间的中间步骤相同吗?(这就是导致不同输出的步骤。)它们是否都肯定会生成sha256哈希(即长度是否正确?应该是43-44字节)Ruby和OpenSSL命令在我的机器上都会生成完全相同的结果。。。虽然我得到的结果和你的不一样,因为sha256总和对于res.tmp是不同的。在这种情况下,我认为这个问题不再有用了,那么;-)这是真的。如果有人想关闭或移除它,我会同意的。
sha256sum res.tmp
688a84cb84ce3b203460a2775248a31d4c3e9590a41ba27134dc342c328b8f9c  res.tmp