2

我正在将我的 node.js 应用程序的哈希算法从基于 JS 的CryptoJS实现切换到节点自己的加密实现。

这是我的实现:

var password = "password1";
var salt = generateSalt();
var iterations = 4000;
var keySize = 768/32;
var cryptoJSKey = CryptoJS.PBKDF2(password, salt, { "iterations": iterations , "keySize": keySize });
// base64 encoded key
cryptoJSKey = cryptoJSKey.toString(CryptoJS.enc.Base64);

require("crypto").pbkdf2( password, salt, iterations, keySize, function(err, derivedKey){
    var nodeCryptoKey = new Buffer( derivedKey, "binary" ).toString( "base64" );

    console.log( cryptoJSKey == nodeCryptoKey ); // always false!
});

我注意到的一件事是nodeCryptoKey最终成为32字符长并且 cryptoJSKey 是192. 如果我将keySizefor only 节点的crypto版本增加到144( keySize * 6),则密钥最终192也会变成字符长 - 尽管它仍然不同。

我做错了什么还是实现方式彼此不同?

4

1 回答 1

5

看来我想通了。

在“CryptoJS v3.0.2.zip”(当前下载)中卷起的 PBKDF2.js 脚本中CryptoJS.enc.Base64undefined;这可能是有意的,但我没有注意到。

我正在将节点的 Base64 编码输出与 CryptoJS 的十六进制输出进行比较。

另一个需要注意的是,密钥大小在 CryptoJS 和 node.js 之间不兼容。节点需要keySize * 4为了输出一个相同的密钥。在这两种情况下,我都不熟悉引擎盖下发生的事情。但我只是假设这是有意的。

Node.js 的 PBKDF2 的文档非常稀缺;但是,它确实说它的“关键”参数名为keylen,它以字节为单位(或者它是位?我不确定)。

于 2012-06-29T21:45:23.717 回答