Ruby версия Crypto JS Base64 stringify - PullRequest
0 голосов
/ 25 марта 2020

Я пытаюсь создать код ruby на примере JavaScript.

const hmac = crypto.HmacSHA1(signature, secret); // 58132bfd8761cac6e6888124753adfda13fb49f0
CryptoJS.enc.Base64.stringify(hmac); // WBMr/YdhysbmiIEkdTrf2hP7SfA=
hmac = OpenSSL::HMAC.hexdigest('sha1', secret, signature) # 58132bfd8761cac6e6888124753adfda13fb49f0
Base64.encode64(hmac) # NTgxMzJiZmQ4NzYxY2FjNmU2ODg4MTI0NzUzYWRmZGExM2ZiNDlmMA==

Вывод crypto- js stringify [1] отличается от версии ruby [2].

[1] https://github.com/brix/crypto-js/blob/develop/src/enc-base64.js#L25

[2] https://ruby-doc.org/stdlib-2.7.0/libdoc/base64/rdoc/Base64.html#method -i-encode64

1 Ответ

1 голос
/ 25 марта 2020

Cryto JS 'HmacSHA1 возвращает двоичные данные, тогда как Ruby' hexdigest возвращает (шестнадцатеричное) строковое представление.

Чтобы получить тот же результат, необходимо base64-encode двоичный файл digest вместо:

secret = 'NzAwZmIwMGQ0YTJiNDhkMzZjYzc3YjQ5OGQyYWMzOTI='
signature = "date: Mon, 25 Jul 2016 16:36:07 GMT\nx-mod-nonce: 28154b2-9c62b93cc22a-24c9e2-5536d7d"

hmac = OpenSSL::HMAC.digest('sha1', secret, signature)
#=> "X\x13+\xFD\x87a\xCA\xC6\xE6\x88\x81$u:\xDF\xDA\x13\xFBI\xF0"

Base64.strict_encode64(hmac)
#=> "WBMr/YdhysbmiIEkdTrf2hP7SfA="
...