CryptoJS.enc.Base64.stringify()与普通Base64加密之间的区别

时间:2015-08-24 17:27:38

标签: javascript encoding base64 cryptojs

我正在尝试将以下哈希加密到base64:

6bb984727b8c8c8017207e54b63976dc42ea9d24ad33bd5feeaa66869b650096

需要访问网站的API。该网站使用CryptoJS.enc.Base64.stringify()方法在JavaScript中显示示例脚本以加密哈希。 这种方法的结果是

a7mEcnuMjIAXIH5Utjl23ELqnSStM71f7qpmhptlAJY=

但是,我尝试的每个在线base64加密工具都给出了以下结果:

NmJiOTg0NzI3YjhjOGM4MDE3MjA3ZTU0YjYzOTc2ZGM0MmVhOWQyNGFkMzNiZDVmZWVhYTY2ODY5YjY1MDA5Ng==

我需要在C ++中创建编码字符串。我也已经尝试了4种不同的base64encode实现(OpenSSL和自定义代码),但我也得到了上面的结果,并且API总是回答我的字符串没有正确编码。

那么区别在哪里,有人知道CryptoJS.enc.Base64.stringify()的C ++实现吗?

1 个答案:

答案 0 :(得分:7)

让我们来电话

a = "6bb984727b8c8c8017207e54b63976dc42ea9d24ad33bd5feeaa66869b650096";
b = "a7mEcnuMjIAXIH5Utjl23ELqnSStM71f7qpmhptlAJY=";
c = "NmJiOTg0NzI3YjhjOGM4MDE3MjA3ZTU0YjYzOTc2ZGM0MmVhOWQyNGFkMzNiZDVmZWVhYTY2ODY5YjY1MDA5Ng==";

两次转换都是正确的,但取决于您的实际需求。

例如,以下两个方程式

toBase64FromBytes(toBytesFromUtf8(a)) == c
toBase64FromBytes(toBytesFromHex(a)) == b

信任某种在线计算器是一个坏主意,因为他们通常不会透露他们如何编码内容,因此您将获得任意结果。如果您自己编程,如果您按照文档获得预期的结果。

我怀疑你通过将哈希或加密结果打印到控制台得到a,如下所示:

console.log(result.toString()); // a

CryptoJS中的大多数result个对象都是WordArray类型。当您在这样的对象上调用toString()函数时,您将获得该二进制对象的十六进制编码字符串。

如果您打印result.toString(CryptoJS.enc.Base64),那么您将获得二进制结果的Base64编码字符串。

如果您使用a并将其直接编码为Base64,则可能假设a已经是字符串(例如UTF-8编码)。在线计算器不知道它是十六进制编码的。