Соответствие подписи между Python и Ruby - PullRequest
1 голос
/ 04 апреля 2019

Я несколько дней пытался проверить какое-то сообщение, подписанное закрытым ключом в 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 будут содержать одно и то же значение, а они - нет. Может ли кто-нибудь объяснить мне, что мне там не хватает?

1 Ответ

2 голосов
/ 04 апреля 2019

Ни один из этих фрагментов кода на самом деле не производит правильную подпись.

В библиотеке 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...