【问题标题】:Matching Signing between Python and RubyPython 和 Ruby 之间的匹配签名
【发布时间】:2019-08-26 15:39:12
【问题描述】:

我已经尝试了几天来验证一些使用 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 包含相同的值,但它们没有。有人可以向我解释一下我在那里缺少什么吗?

【问题讨论】:

    标签: python ruby openssl cryptography


    【解决方案1】:

    这些代码 sn-ps 实际上都没有产生正确的签名。

    在 Ruby OpenSSL 库中,您希望使用 sign 方法,而不是 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
    

    【讨论】:

    • 是的,谢谢,虽然我仍然不清楚如何在 python/中重现 private_encrypt 的输出
    • @dibus2 我不认为 Python OpenSSL 库公开了您需要这样做的低级函数(这是有道理的,Ruby 绑定公开它们可能是一个错误)。
    • 感谢您的帮助。
    猜你喜欢
    • 2018-11-05
    • 2016-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多