CryptoJS.enc.Base64.stringify() 与普通Base64加密的区别
Difference between CryptoJS.enc.Base64.stringify() and normal Base64 encryption
我正在尝试将以下哈希加密为 base64:
6bb984727b8c8c8017207e54b63976dc42ea9d24ad33bd5feeaa66869b650096
需要访问网站API。该网站在 JavaScript 中显示了一个使用 CryptoJS.enc.Base64.stringify()
方法加密散列的示例脚本。
这种方法的结果是
a7mEcnuMjIAXIH5Utjl23ELqnSStM71f7qpmhptlAJY=
但是,我尝试过的每个在线 base64 加密工具都会给我以下结果:
NmJiOTg0NzI3YjhjOGM4MDE3MjA3ZTU0YjYzOTc2ZGM0MmVhOWQyNGFkMzNiZDVmZWVhYTY2ODY5YjY1MDA5Ng==
我需要用 C++ 创建编码字符串。我也已经尝试了 4 种不同的 base64encode 实现(OpenSSL 和自定义代码),但我也得到了上述结果,并且 API 总是回答我的字符串未正确编码。
那么区别在哪里,有人知道 CryptoJS.enc.Base64.stringify()
的 C++ 实现吗?
我们打电话
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编码)。在线计算器不知道它是十六进制编码的。
我正在尝试将以下哈希加密为 base64:
6bb984727b8c8c8017207e54b63976dc42ea9d24ad33bd5feeaa66869b650096
需要访问网站API。该网站在 JavaScript 中显示了一个使用 CryptoJS.enc.Base64.stringify()
方法加密散列的示例脚本。
这种方法的结果是
a7mEcnuMjIAXIH5Utjl23ELqnSStM71f7qpmhptlAJY=
但是,我尝试过的每个在线 base64 加密工具都会给我以下结果:
NmJiOTg0NzI3YjhjOGM4MDE3MjA3ZTU0YjYzOTc2ZGM0MmVhOWQyNGFkMzNiZDVmZWVhYTY2ODY5YjY1MDA5Ng==
我需要用 C++ 创建编码字符串。我也已经尝试了 4 种不同的 base64encode 实现(OpenSSL 和自定义代码),但我也得到了上述结果,并且 API 总是回答我的字符串未正确编码。
那么区别在哪里,有人知道 CryptoJS.enc.Base64.stringify()
的 C++ 实现吗?
我们打电话
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编码)。在线计算器不知道它是十六进制编码的。