Узел двоичного дайджеста HMAC против Ruby - PullRequest
0 голосов
/ 06 мая 2019

Я пытаюсь реализовать Node API с использованием документации Ruby (тьфу).Проблема, в частности, заключается в проверке секрета, который передается через дайджест HMAC, а затем кодируется в base64.

Кажется, я не могу заставить их сравниться.Вот те же фрагменты в Node & Ruby:

Примечание : ниже также можно посмотреть онлайн через repl.it:

Узел

const crypto = require('crypto');

let text = 'example';
let key  = '123';

let h = crypto.createHmac('sha256', key).update(text).digest('binary');
Buffer.from(h).toString('base64');
# => 'acKNVMOwSUUowqdZw7HCnMKOwofCqcO5wp51wqXCiBvCkmfDrjkmwrzDtizCmS3ChMK6'

Рубин

require 'openssl'
require 'base64'

text = 'example'
key  = '123'

h = OpenSSL::HMAC.digest(OpenSSL::Digest.new('sha256'), key, text)
Base64.strict_encode64(h)
# => 'aY1U8ElFKKdZ8ZyOh6n5nnWliBuSZ+45Jrz2LJkthLo='

Переключение обоих на шестнадцатеричные произведения, например

Узел

crypto.createHmac('sha256', key).update(text).digest('hex')

Рубин

OpenSSL::HMAC.hexdigest(OpenSSL::Digest.new('sha256'), key, text)

К сожалению, я не могу переключиться на гекс -веб-сервис использует код ruby ​​для подписи.

Поиск документов ruby ​​для OpenSSL::HMAC.digest состояний:

Возвращает код аутентификации как двоичная строка .

Просто выводя результат из HMAC, я не могу сказать, является ли это разницей или просто проблемой рендеринга:

Node

crypto.createHmac('sha256', key).update(text).digest('binary');
# => 'iTðIE(§Yñ©ùu¥\u001bgî9&¼ö,-º'

Рубин

OpenSSL::HMAC.digest(OpenSSL::Digest.new('sha256'), key, text)
# => "i\x8DT\xF0IE(\xA7Y\xF1\x9C\x8E\x87\xA9\xF9\x9Eu\xA5\x88\e\x92g\xEE9&\xBC\xF6,\x99-\x84\xBA"

Как мне сделать так, чтобы эти два равнялись?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 06 мая 2019

Чтобы получить Ruby для вывода Base64:

require 'openssl'
require 'base64'

text = 'example'
key  = '123'

Base64.encode64(OpenSSL::HMAC.digest(OpenSSL::Digest.new('sha256'), key, text))
# "aY1U8ElFKKdZ8ZyOh6n5nnWliBuSZ+45Jrz2LJkthLo=\n"

Вы можете удалить \n переводы строки и завершающий отступ, если хотите.

0 голосов
/ 06 мая 2019

Если не вводить какую-либо конкретную кодировку в метод дайджеста Node, выводится необработанный буфер Unicode, соответствующий Ruby.

Это конечный результат:

crypto = require('crypto');

text = 'example';
key  = '123';

h = crypto.createHmac('sha256', key).update(text).digest();
Buffer.from(h).toString('base64');

Кто бы мог подумать- вы ничего не могли бы передать в метод ...

...