CryptoJS 和 Closure 中的 SHA512 不一样

Posted

技术标签:

【中文标题】CryptoJS 和 Closure 中的 SHA512 不一样【英文标题】:SHA512 not the same in CryptoJS and Closure 【发布时间】:2014-11-09 23:50:40 【问题描述】:

我在一个简单的加密挑战中遇到了一些麻烦。

我想做以下事情:

获取 url 编码和 base64 编码的值 做网址解码 做base64解码 使用 Sha512 散列

在使用 CryptoJS 时,我使用以下代码:

var parameter = "Akuwnm2318kwioasdjlnmn";
var urlDecoded = decodeURIComponent(parameter);
var base64Decoded = CryptoJS.enc.Base64.parse(urlDecoded);
var hashed = CryptoJS.SHA512(base64Decoded).toString(CryptoJS.enc.Base64);
//hashed = "UxupkI5+dkhUorQ+K3+Tqct1WNUkj3I6N76g82CbNQ0EAH/nWjqi9CW5Qec1vq/qakNIYeXeqiAPOVAVkzf9mA=="/eWTS2lUgCEe6NJDXhNfYvXMRQDvH6k2PHVmy6LJS7RloVvcQcpVjRNVU5lJpAg=="

在使用 Closure 时,我使用以下代码:

var parameter = "Akuwnm2318kwioasdjlnmn";
var urlDecoded = decodeURIComponent(parameter);
var byteArray = goog.crypt.base64.decodeStringToByteArray(urlDecoded);
var base64Decoded = goog.crypt.byteArrayToHex(byteArray);
var sha512 = new goog.crypt.Sha512();
sha512.update(base64Decoded);
var hashed = sha512.digest();
hashed = goog.crypt.byteArrayToHex(hashed);
//hashed = "bc2a878edfffb0937fbc6c0f9dbc9566edc59b74080d68d4c8bdfeb4027f17c4316a02285baaf446872d2df37b1144ac3ce18d62ab9c786b1f1fb18a53acea1d"

那么,为什么哈希值不同?

如果有人能告诉我如何调整 Closure-Code 以获得与 CryptoJS 代码提供的相同的哈希值,我将非常高兴。

非常感谢!

PS:

我也试过了:

var parameter = "Akuwnm2318kwioasdjlnmn";
var urlDecoded = decodeURIComponent(parameter);
var base64DecodedByteArray = goog.crypt.base64.decodeStringToByteArray(urlDecoded);
var sha512 = new goog.crypt.Sha512();
sha512.update(base64DecodedByteArray);
var hashed = sha512.digest();
hashed = goog.crypt.byteArrayToHex(hashed);
//hashed = "531ba9908e7e764854a2b43e2b7f93a9cb7558d5248f723a37bea0f3609b350d04007fe75a3aa2f425b941e735beafea6a434861e5deaa200f3950159337fd98"

但是,如您所见,我得到了另一个哈希值。为什么??

【问题讨论】:

已更新,因为我提到该参数是一个错误的选择。现在,我什至得到了三个不同的哈希值。为什么?? 【参考方案1】:

第一个哈希值与第三个相同,只是它是 base64 编码而不是十六进制编码。您可以更改为十六进制编码并获得相同的值:

var hashed = CryptoJS.SHA512(base64Decoded).toString(CryptoJS.enc.Hex);
//hashed = "531ba9908e7e764854a2b43e2b7f93a9cb7558d5248f723a37bea0f3609b350d04007fe75a3aa2f425b941e735beafea6a434861e5deaa200f3950159337fd98"

您展示的第二种方法具有不同的价值,因为您没有散列相同的数据;相反,您将 byteArray 转换为十六进制字符串,然后散列该字符串表示形式,而不是基础值。

【讨论】:

如何在angular 2中执行上述语句?

以上是关于CryptoJS 和 Closure 中的 SHA512 不一样的主要内容,如果未能解决你的问题,请参考以下文章

国产接口工具ApiPost如何利用CryptoJS对请求参数进行MD5/AES加解密

JS前端接口加密/解密

无法使用 CryptoJS 解密(适用于 Java、Python)

记录一下前端使用CryptoJS的几种加密方式

php中的AES加密,然后用Javascript(cryptojs)解密

crypto-js计算文件的sha256值