我已经尝试了几天,以验证一些使用python中的私钥签名的消息。请注意,该消息已使用Ruby签名。
当我在python中签名相同的消息时,我可以验证它没有问题。请注意,我已经验证了哈希值是相同的。
Python代码:
string_to_encrypt = b"aaaaabbbbbaaaaabbbbbaaaaabbbbbCC"
sha1 = SHA.new()
sha1.update(string_to_encrypt)
# load private key
pkey = OpenSSL.crypto.load_privatekey(OpenSSL.crypto.FILETYPE_PEM, open('./license.pem', 'rb').read())
sign_ssl = OpenSSL.crypto.sign(pkey, sha1.digest(), 'RSA-SHA1')
b64_ssl = base64.b64encode(sign_ssl)
Ruby:
string_to_encrypt = "aaaaabbbbbaaaaabbbbbaaaaabbbbbCC"
sha1 = Digest::SHA1.digest(string_to_encrypt)
#sign it
private_key_file = File.join(File.dirname(__FILE__), 'license.pem')
rsa = OpenSSL::PKey::RSA.new(File.read(private_key_file))
signed_key = rsa.private_encrypt(sha1)
#update the license string with it
x = Base64.strict_encode64(signed_key)
我希望b64_ssl和x包含相同的值,而它们不会相同。有人可以告诉我我在那儿想念什么吗?
答案 0 :(得分:2)
这些代码片段均未产生正确的签名。
在Ruby OpenSSL库中,您要使用sign
方法,而不是private_encrypt
方法,该方法是一种低级操作,不能执行产生有效签名所需的所有操作。 / p>
在两个库中,sign
操作都会为您执行哈希处理,您无需事先执行此操作。实际上,您的Python代码实际上是对数据进行了两次 哈希处理。
尝试以下Python代码:
import OpenSSL
import base64
string_to_encrypt = b"aaaaabbbbbaaaaabbbbbaaaaabbbbbCC"
# load private key
pkey = OpenSSL.crypto.load_privatekey(OpenSSL.crypto.FILETYPE_PEM, open('./license.pem', 'rb').read())
sign_ssl = OpenSSL.crypto.sign(pkey, string_to_encrypt, 'SHA1')
b64_ssl = base64.b64encode(sign_ssl)
print(b64_ssl.decode())
产生与此Ruby代码相同的输出:
require 'openssl'
require 'base64'
string_to_encrypt = "aaaaabbbbbaaaaabbbbbaaaaabbbbbCC"
#sign it
private_key_file = File.join(File.dirname(__FILE__), 'license.pem')
rsa = OpenSSL::PKey::RSA.new(File.read(private_key_file))
signed_key = rsa.sign('sha1', string_to_encrypt)
#update the license string with it
x = Base64.strict_encode64(signed_key)
puts x