我对NodeJ很新,并试图弄清楚如何使用“加密”模块。在玩它时,我注意到NodeJs中的“加密”模块和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
使用“加密”模块,我写道:
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会生成类似的密钥。我的问题是如何调整“加密”模块,使其生成与CryptoJS和Jasypt相同的密钥。
答案 0 :(得分:2)
显然我无法为怪异的答案添加评论,所以我会在这里写下来:
reset()工作正常。重要的区别是你在迭代循环中将散列输出转换为十六进制字符串。
答案 1 :(得分:1)
在cryptojs示例中,finalize()返回原始二进制数据。在加密模块示例中,digest()返回一个十六进制字符串。输出的差异意味着迭代重新散列时输入的差异。
答案 2 :(得分:1)
为什么不使用PBKDF2中的内置node-crypto:
var hashedpw = crypto.pbkdf2Sync(password, salt, iterations, keysize);
var hashedpw = CryptoJS.PBKDF2(
password,
salt,
{ keySize: keysize/32, iterations: iterations }
);
通过比重复散列更昂贵的计算,它不仅比您尝试做的更安全,而且实施起来也更容易。
答案 3 :(得分:0)
我做了一些测试,显然这个reset
函数(在crypto-js中)搞砸了。我不确定它的作用,我没有足够的耐心去寻找问题。 :)但是,这是工作解决方案:
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);
}
这使得两个代码更加相似,这很好。