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); }
这使得两个代码更加相似,这是很好的。
- Rfc2898DeriveBytes在javascript中的等价物?
- .NET和nodejs之间的AESalgorithm值差异,CryptoJS
- 如何解密CryptoJS中的AES 128(nodejs / web浏览器)
- 在NodeJS,Crypto令牌authentication环境中生成独特的令牌
- 由于crypto.DEFAULT_ENCODING ='binary',节点6升级导致aws-sdk的SignatureDoesNotMatch错误。
- Javascriptencryption库不能encryption和解密一个简单的例子程序中的string
- Crypto JS:TripleDES不能正确encryption
- PassportJS – 在将有效载荷数据传递给passport.authenticate作为请求参数之前获取
- Nodejs crypto.pbkdf2结果不同于CryptoJS.PBKDF2