nodejsencryption模块与crypto-js

我对NodeJ很陌生,试图弄清楚如何使用“encryption”模块。 在使用它时,我注意到了NodeJs中的“encryption”模块和crypto-js之间的区别:

用crypto-js,我有:

function SHA256Hash(password, salt, iteration) { var saltedpassword = salt + password; var sha256 = CryptoJS.algo.SHA256.create(); for(var i = 0; i < iteration; i++) { alert("saltedpassword = " + saltedpassword); sha256.update(saltedpassword); var saltedpassword = sha256.finalize(); sha256.reset(); } return saltedpassword.toString(CryptoJS.enc.Base64); } 

然后打电话:

 var hashedPassword = SHA256Hash("123456789", "ASIN", 3) 

并接收:

 saltedpassword = ASIN123456789 saltedpassword = 3362d80b757d14bfe18c01f6a003ed38a3a4a3dcab0417efb457b71740e21411 saltedpassword = 6020c992a9b7cd3ca9e95b9a3e21b64911edb7983b3dd77bdcecda19f2756987 

用“encryption”模块,我写道:

 function SHA256Hash(password, salt, iteration) { var saltedpassword = salt + password; for(var i = 0; i < iteration-1; i++) { console.log("saltedpassword = "+saltedpassword) var sha256 = crypto.createHash('sha256'); sha256.update(saltedpassword); var saltedpassword = sha256.digest('hex'); } console.log("saltedpassword = "+saltedpassword) var sha256 = crypto.createHash('sha256'); sha256.update(saltedpassword); return sha256.digest('base64'); } 

然后打电话:

 var hashedPassword = SHA256Hash("123456789", "ASIN", 3); 

并接收:

 saltedpassword = ASIN123456789 saltedpassword = 3362d80b757d14bfe18c01f6a003ed38a3a4a3dcab0417efb457b71740e21411 saltedpassword = 4795d40ae8ae797f0ce51dfe4b496bca68f6d1f4a264f4ca52348ddd65a2988d 

前两项是相同的,但第三项是不同的。 我错过了什么吗?

编辑 :当我比较Jasypt,CryptoJs生成相似的密钥。 我的问题是如何调整“encryption”模块,使其生成与CryptoJS和Jasypt相同的密钥。

显然我不能添加评论怪异的答案,所以我会写在这里,而不是:

重置()工作正常。 重要的区别是你在迭代循环内将散列输出转换为hexstring。

在cryptojs示例中,finalize()返回原始二进制数据。 在encryption模块的例子中,digest()返回一个hexstring。 输出的差异意味着在迭代重新散列时input的差异。

改用PKDF2!

为什么不使用node-crypto中的内置PBKDF2 :

 var hashedpw = crypto.pbkdf2Sync(password, salt, iterations, keysize); 

和crypto-js :

 var hashedpw = CryptoJS.PBKDF2( password, salt, { keySize: keysize/32, iterations: iterations } ); 

通过计算比重复哈希计算更昂贵,它不仅比你想要做的更安全,而且实现也更容易。

我做了一些testing,显然这个reset函数(在crypto-js中)混乱了。 我不确定它是什么,我没有足够的耐心来寻找问题。 :)但是,这里的工作解决scheme:

 function SHA256Encrypt(password, salt, iteration) { var saltedpassword = salt + password; for(var i = 0; i < iteration-1; i++) { alert("saltedpassword = " + saltedpassword); saltedpassword = CryptoJS.SHA256( saltedpassword ).toString( CryptoJS.enc.Hex ); } saltedpassword = CryptoJS.SHA256( saltedpassword ); return saltedpassword.toString(CryptoJS.enc.Base64); } 

这使得两个代码更加相似,这是很好的。