繁体   English   中英

Python和Ruby之间的匹配签名

[英]Matching Signing between Python and Ruby

我已经尝试了几天,以验证一些使用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)

红宝石:

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包含相同的值,而它们不包含。 有人可以告诉我我在那儿想念什么吗?

这些代码片段均未​​真正产生正确的签名。

在Ruby OpenSSL库中,您要使用sign方法,而不要使用private_encrypt方法, private_encrypt方法是一种低级操作,不能完成产生有效签名所需的所有操作。

在两个库中, 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM