【问题标题】:javascript encoding not working properlyjavascript编码无法正常工作
【发布时间】:2013-12-12 16:46:00
【问题描述】:

我在用 JavaScript 编码时遇到问题,我在这里没有得到预期的结果

这里有几件事我想列出 - 1)当我在 ruby​​ 中进行编码时,会得到预期的结果。 - 2) 但是当我试图在 JavaScript 中遵循相同的步骤时,却没有得到预期的结果


1) 请在下面找到运行良好的 ruby​​ 代码。

require 'openssl'
require "base64"
key =  Base64.decode64("yZQungXDXtksG4Ypcl0f6moRXWTCHh/CYDViXnZvbC0=")
data = "<content><app-id>9cd73144-46ca-4a02-852b-fa452b1d8bdc</app-id><hmac>HMACSHA256</hmac><signing-time>2013-11-19T12:06:11.409Z</signing-time></content>"
result  = OpenSSL::HMAC.digest('sha256', key , data)
final_result = Base64.encode64(result)

ruby 输出:收到预期输出

Key =  "\xC9\x94.\x9E\x05\xC3^\xD9,\e\x86)r]\x1F\xEAj\x11]d\xC2\x1E\x1F\xC2`5b^vol-"
result = "\xC4\x9B\x94\x9C\anQT\xF9';\xE9$\x1C\x98k\xEE)\xD77\xFD\xCA\a\xD1L\xBB\x9B\xD2r\xE9\x1A\xA8"
final_result = "xJuUnAduUVT5JzvpJByYa+4p1zf9ygfRTLub0nLpGqg=\n"

2) 请在下方找到无法正常工作的 JavaScript 代码

  • 使用 crypo.js 进行编码和解码

<html>
  <head>
    <script src="http://crypto-js.googlecode.com/svn/tags/3.0.2/build/rollups/hmac-sha256.js"></script>
    <script src="http://crypto-js.googlecode.com/svn/tags/3.0.2/build/components/enc-base64-min.js"></script>

    <script>
      key = window.atob("yZQungXDXtksG4Ypcl0f6moRXWTCHh/CYDViXnZvbC0=");
      data = "<content><app-id>9cd73144-46ca-4a02-852b-fa452b1d8bdc</app-id><hmac>HMACSHA256</hmac><signing-time>2013-11-19T12:06:11.409Z</signing-time></content>";
      console.log("key");
      console.log(key);
      result = CryptoJS.HmacSHA256(data, key);
      console.log("result");
      console.log(result.toString());
      final_result = CryptoJS.enc.Base64.stringify(result);
      console.log("final_result");
      console.log(final_result.toString());
    </script>
  </head>
  <body>
  </body>
</html>

Javascript 输出:收到预期输出

Key =  "É.Ã^Ù,)r]êj]dÂÂ`5b^vol-"
result = "035a028de6bea2c7843b4310b28b57f5193d7597840ea2f23c255cb889d77d60"
final_result = "A1oCjea+oseEO0MQsotX9Rk9dZeEDqLyPCVcuInXfWA="

所以在这里我不明白,为什么我得到keyresultfinal_resultruby and JavaScript 不同

请分享你的经验,这对我很有帮助

谢谢

【问题讨论】:

    标签: javascript ruby encoding decoding cryptojs


    【解决方案1】:

    我尝试了很多,并在下面找到了解决方案。

    <html>
      <head>
        <script src="http://crypto-js.googlecode.com/svn/tags/3.0.2/build/rollups/hmac-sha256.js"></script>
        <script src="http://crypto-js.googlecode.com/svn/tags/3.0.2/build/components/enc-base64-min.js"></script>
        <script src="jquery.base64.js"></script>
        <script>
          var key = Base64.decode("yZQungXDXtksG4Ypcl0f6moRXWTCHh/CYDViXnZvbC0=");
          console.log(key)
          words = CryptoJS.enc.Latin1.parse(key);
          words = CryptoJS.enc.Hex.parse(words.toString());
         result = CryptoJS.HmacSHA256("<content><app-id>9cd73144-46ca-4a02-852b-fa452b1d8bdc</app-id><hmac>HMACSHA256</hmac><signing-time>2013-11-19T12:06:11.409Z</signing-time></content>", words);
         console.log(result);
         final_result = CryptoJS.enc.Base64.stringify(result);
         console.log(final_result);
       </script>
     </head>
    </html>
    

    现在我得到了预期的结果。

    key = "É.Ã^Ù,)r]êj]dÂÂ`5b^vol-"
    result = "c49b949c076e5154f9273be9241c986bee29d737fdca07d14cbb9bd272e91aa8"
    final_result = "xJuUnAduUVT5JzvpJByYa+4p1zf9ygfRTLub0nLpGqg="
    

    【讨论】:

      【解决方案2】:

      您可能需要使用 Base64.strict_encode64 (http://ruby-doc.org/stdlib-1.9.3/libdoc/base64/rdoc/Base64.html#method-i-strict_encode64) strict_encode 完全符合 RFC,而 .encode 不是。大多数实现并不关心这个特定问题(必须使用换行符),但有些实现。

      【讨论】:

      • 我担心的是为什么我没有得到与 ruby​​ 最终结果相同的 JavaScript 'final_result'。你能解释一下为什么会出现这种差异吗?
      • 输出并不相同,因为 ruby​​ 使用十六进制打印输出,因为并非所有字符都是 ascii 可打印的。 JavaScript 显然没有检测到这一点,并且无论如何都在打印输出。但是,仅通过查看,我就可以看出输出并不相同,即使它们的打印方式不同。如果它们是等价的,你仍然会得到 final_result 相同的答案,因为 base64 编码的数据总是 ascii 可打印的。
      • 问题的根源在于密钥不等价。即使它们的打印方式不同,您也可以通过比较第一个字符来判断它们可能不一样。 Hex C9 (\xC9) 不是 ascii 可打印的(没有超过 7f 的)。如果您将其视为 unicode,则第一个字符将是 \xC9\x94 根据this 是“向后 c”,这不是 js 版本中的第一个字符。我的猜测还是一样,创建 Key 时需要使用 Base64.strict_decode64
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-10
      • 1970-01-01
      • 2015-05-23
      • 2012-11-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多