PBKDF2的所有实现是否应该从相同的输入生成相同的密钥?

时间:2012-06-29 20:08:06

标签: node.js cryptography openssl pbkdf2 cryptojs

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

这是我的实施:

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。如果我将keySize仅针对节点的crypto版本144增加到keySize * 6192),则该密钥最终也会变为{{1}}个字符 - 尽管它仍然是不同。

我做错了什么或者实施方式是否彼此不同?

1 个答案:

答案 0 :(得分:4)

看起来我想通了。

在“CryptoJS v3.0.2.zip”(当前下载)CryptoJS.enc.Base64中汇总的PBKDF2.js脚本中undefined;这可能是有意的,但不是我注意到的。

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

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

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