Ruby 版本的 CryptoJS Base64 字符串化

Ruby version of CryptoJS Base64 stringify

我正在尝试根据 JavaScript 示例创建一些 ruby 代码。

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

CrytoJS' HmacSHA1 returns 二进制数据而 Ruby 的 hexdigest returns 一个(十六进制编码)字符串表示。

要获得相同的结果,必须对二进制文件 digest 进行 base64 编码:

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="