Я пытаюсь реализовать 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"
Как мне сделать так, чтобы эти два равнялись?
Спасибо!