【问题标题】:Ruby version of CryptoJS Base64 stringifyCryptoJS Base64 字符串化的 Ruby 版本
【发布时间】:2020-03-25 11:24:54
【问题描述】:

我正在尝试从 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

【问题讨论】:

    标签: ruby base64 encode hmac cryptojs


    【解决方案1】:

    CrytoJS 的 HmacSHA1 返回二进制数据,而 Ruby 的 hexdigest 返回(十六进制编码的)字符串表示形式。

    要获得相同的结果,必须对二进制 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="
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-26
      • 1970-01-01
      • 2019-08-19
      • 2021-10-23
      • 1970-01-01
      相关资源
      最近更新 更多