JavaScript base64编码btoa()vs CryptoJS为什么它们不同?

时间:2017-05-04 18:47:54

标签: javascript base64 cryptojs

小提琴here

var canonicalString = 'GET'+'\n'
  +'/?a=&b=c'+'\n'
  +'application/json'+'\n'
  +'\n'
  +'Mon, 26 Mar 2007 19:37:58 +0000';

console.log(canonicalString);
canonicalString = CryptoJS.HmacSHA256(canonicalString, 'bar');

console.log(CryptoJS.enc.Base64.stringify(canonicalString));
console.log(btoa(canonicalString.toString()));

我无法理解为什么结果会有所不同。哪里我错了?顺便说一句,正确的应该是btoa()版本。

1 个答案:

答案 0 :(得分:0)

使用Base64 online decoder我们可以看到输入采用不同的编码:

7Sbw7FL9uyWDsrrW+Hi9sjdWoOtHT52Fqp9gfViFW1E=
ED26F0EC52FDBB2583B2BAD6F878BDB23756A0EB474F9D85AA9F607D58855B51

ZWQyNmYwZWM1MmZkYmIyNTgzYjJiYWQ2Zjg3OGJkYjIzNzU2YTBlYjQ3NGY5ZDg1YWE5ZjYwN2Q1ODg1NWI1MQ==
65643236663065633532666462623235383362326261643666383738626462323337353661306562343734663964383561613966363037643538383535623531

在第一种情况下,最初的原始字符是“E”
在第二种情况下,最初的原始字符是“65”

ASCII字符“E”以十六进制编码为“65”。

这第一种情况编码了一个字符表示,而decomnd情况编码了一个十六进制表示。不同的Base64实现以不同方式处理输入编码。

问题中缺少的是代码示例,需要有Minimal, Complete, and Verifiable example