我正在将我的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 * 6
(192
),则该密钥最终也会变为{{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
,以字节为单位(或者它是位?我不确定)。