Crypto Hmac node.js эквивалент для ruby ​​для следующей функции

function hmac(key, string, encoding) {
  return crypto.createHmac('sha256', key).update(string, 'utf8').digest(encoding);
}
function hash(string, encoding) {
    return crypto.createHash('sha256').update(string, 'utf8').digest(encoding);
}

Для приведенной выше функции кодирование hmac является необязательным, или же оно имеет значение 'hex'. Я проверил библиотеку OpenSsl в ruby ​​и нашел похожие функции, но не получил те же выходные данные при работе в ruby.

Следующая ссылка используется в качестве ссылки в некоторой степени, но не совсем. Никто не сталкивался с подобным вариантом использования. Пожалуйста, дайте мне знать

1 ответ

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

Ruby-эквиваленты, которые я придумал, значительно более многословны, потому что я не знаю, как передать кодировку в качестве аргумента любому из методов.

Замечания: base64 а также hex кодировки между JS и Ruby эквивалентны. Похоже, что может быть разница в выводе узла latin1 кодирование в зависимости от того, как настроен Ruby, но я считаю, что необработанные байты эквивалентны.

require 'openssl'
require 'base64'

def hmac(key, string, encoding = 'hex')
  hmac = OpenSSL::HMAC.new(key, 'sha256')
  hmac << string
  case encoding
    when 'base64'
      Base64.encode64(hmac.digest)
    when 'hex'
      hmac.hexdigest
    else
      hmac.digest
  end
end

def hash(string, encoding = 'hex')
  sha256 = OpenSSL::Digest::SHA256.new
  sha256 << string
  case encoding
    when 'base64'
      Base64.encode64(sha256.digest)
    when 'hex'
      sha256.hexdigest
    else
      sha256.digest
  end
end

key = "NjNsSSpyaE83NyZGaGdpYXhLQmFjVUJhZ3UyMENqZWY="
string = "this is a test"
encoding = "hex";
puts hmac(key, string, encoding) # => adb2946c2815047327d51459b401836cebb1a31644604303b4886b028bb98e69
puts hash(string, encoding) # => 2e99758548972a8e8822ad47fa1017ff72f06f3ff6a016851f45c398732bc50c

И чтобы проверить, вы можете просто запустить эквивалент в узле

var key = "NjNsSSpyaE83NyZGaGdpYXhLQmFjVUJhZ3UyMENqZWY="
var string = "this is a test"
var encoding = "hex";
console.log(hmac(key, string, encoding)) // => adb2946c2815047327d51459b401836cebb1a31644604303b4886b028bb98e69
console.log(hash(string, encoding)) // => 2e99758548972a8e8822ad47fa1017ff72f06f3ff6a016851f45c398732bc50c
Другие вопросы по тегам