使用SHA256摘要进行OpenSSL RSA签名

时间:2015-06-26 21:32:36

标签: 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.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=

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

sha256sum res.tmp

在命令行中给出了这个:

688a84cb84ce3b203460a2775248a31d4c3e9590a41ba27134dc342c328b8f9c  res.tmp

但我无法确定上面的哈希实际上是两个脚本中任何一个的任何中间结果。如果我能提供更多信息,请告诉我。感谢。

1 个答案:

答案 0 :(得分:1)

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