Ruby SHA1 RSA-подпись отличается от командной строки OpenSSL? - PullRequest
0 голосов
/ 25 мая 2018

Я пытаюсь реализовать проверку подписи RSA SHA1.К моему удивлению, инструмент командной строки OpenSSL не генерирует тот же ключ, что и Ruby OpenSSL.

Если я запускаю эти команды:

MacBook-Pro-de-Geoffrey:ssl_tests Escaflowne$ cat data.txt 
000
MacBook-Pro-de-Geoffrey:ssl_tests Escaflowne$ openssl dgst -sha1 -binary -sign prvkey.pem -out sig.bin data.txt
MacBook-Pro-de-Geoffrey:ssl_tests Escaflowne$ openssl base64 -in sig.bin -out sig64.txt
MacBook-Pro-de-Geoffrey:ssl_tests Escaflowne$ cat sig64.txt
AJEh2kA7O3j624Kdl7UCGN1HiEk/v2LQudB+cjxw1CfmRTjcSPBjUE/EAwy8NEut
K4zYgfRwwTs7NY3AwYiUEtAe5yohUM0Qv17qSDW+G4IWjwe9PKE7Sl00umiMdszA
q/1hqeQlHKgjme7YO7H6i1UcAXmriOOjn+ySRaovsHw=

Таким образом, конечный результат base64 в командной строке:AJEh2kA7O3j624Kdl7UCGN1HiEk/v2LQudB+cjxw1CfmRTjcSPBjUE/EAwy8NEut K4zYgfRwwTs7NY3AwYiUEtAe5yohUM0Qv17qSDW+G4IWjwe9PKE7Sl00umiMdszA q/1hqeQlHKgjme7YO7H6i1UcAXmriOOjn+ySRaovsHw=

Теперь, если я попытаюсь подписать его через мой скрипт ruby:

def sign_message(message)
    privkey = OpenSSL::PKey::RSA.new(File.read(Rails.root.join('lib', 'payment', 'prvkey.pem')))

    digest = OpenSSL::Digest.new('sha1')

    expected_sign = privkey.sign(digest, message)
    base_64_expected_sign = [expected_sign].pack('m')

    puts "Expected Signature"
    puts expected_sign
    puts "Base 64 Expected Signature"
    puts base_64_expected_sign

    return base_64_expected_sign
  end

И вызову функцию следующим образом:

  def test_sign
    message = "000"
    message_signature = sign_message(message)
    puts "Message Signature : #{message_signature}"

    puts "Valid : #{verify_signature(message_signature, message)}"
  end

Я получу вывод:

Expected Signature
??|??n?^~?T_1Y@??BR??u???k      x?*????S?L?:.7
                          t??tc?)崪? ?}DMp?p2??4?D-f??jT;!e
                                                              ?k??5??
Base 64 Expected Signature
QjhL1zQoUdGFLVCMg06/CKeE/HdhRTOhJ/p09wkWeK0qD/afsxfcU7tMtDou
Nw3rwXw/5W68XhZ+BK1UXwIxWUDbFYlCUpu6HnWTmI5rC3QP+f50Y8kp5bSq
gQkekH1ETXDmcDKvExeSNKVELWYe3uwTalQ7IWUMyWvnF541rvo=
Message Signature : QjhL1zQoUdGFLVCMg06/CKeE/HdhRTOhJ/p09wkWeK0qD/afsxfcU7tMtDou
Nw3rwXw/5W68XhZ+BK1UXwIxWUDbFYlCUpu6HnWTmI5rC3QP+f50Y8kp5bSq
gQkekH1ETXDmcDKvExeSNKVELWYe3uwTalQ7IWUMyWvnF541rvo=

Итак, последняя подпись Ruby OpenSSL: QjhL1zQoUdGFLVCMg06/CKeE/HdhRTOhJ/p09wkWeK0qD/afsxfcU7tMtDou Nw3rwXw/5W68XhZ+BK1UXwIxWUDbFYlCUpu6HnWTmI5rC3QP+f50Y8kp5bSq gQkekH1ETXDmcDKvExeSNKVELWYe3uwTalQ7IWUMyWvnF541rvo=

В сравнении с командной строкой: AJEh2kA7O3j624Kdl7UCGN1HiEk/v2LQudB+cjxw1CfmRTjcSPBjUE/EAwy8NEut K4zYgfRwwTs7NY3AwYiUEtAe5yohUM0Qv17qSDW+G4IWjwe9PKE7Sl00umiMdszA q/1hqeQlHKgjme7YO7H6i1UcAXmriOOjn+ySRaovsHw=

Я уже некоторое время борюсь с этими я не понимаю, что может иметь значение!

ОБНОВЛЕНИЕ:

Что ж, очевидно, результаты совпадут, если я заменим переменную сообщения на File.read(Rails.root.join('lib', 'payment', 'data.txt')) Так что, в основном, используя строку сТо же значение, что и в текстовом файле, не дает того же результата.Это означает, что это связано с кодировкой, верно?

ОБНОВЛЕНИЕ 2:

Таким образом, файл говорит, что он закодирован в us-ascii, если я запускаю file -I data.txt Однако, если я делаю message.encoding.name, он говорит, что загруженas UTF-8 Также, message.encode('ascii') не изменяет результат сгенерированной подписи, он по-прежнему соответствует командной строке openssl.Как только я переключаюсь на строку "000".encode('utf-8') или "000".encode('ascii'), подписи больше не совпадают.Таким образом, кодирование, похоже, не играет никакой роли.

Почему существует различие между одинаковым содержимым, независимо от того, происходит ли оно при чтении файла или в виде строки?

1 Ответ

0 голосов
/ 30 мая 2018

В файле data.txt есть завершающий символ новой строки, который вы не учитываете в своем коде.Использование

message = "000\n"

должно работать.

Вы также можете сделать

message = File.binread("data.txt")

, чтобы убедиться, что вы получаете точные данные в качестве командной строки.

...