我已经花了几个小时来解决这个问题,但似乎无法在这里或其他任何地方找到类似的问题。在拼命寻找小拼写错误或其他错误后,我求助于您。
我是第一次实现加密,到目前为止一切顺利,我正在使用加密库和 Node.js 对密码进行哈希处理和加盐。到目前为止一切正常,但是当我尝试进行迭代重新散列时,我没有得到相同的 key 。
让我给你看我的代码:
来自 app.get 方法:
var salt = crypto.randomBytes(128);
var hash = crypto.createHash('sha256');
hash.update(salt.toString('base64') + request.query.password);
var hashedKey = hash.digest('base64');
console.log("original pass is: " + hashedKey)
var stretchedKey = crypto.pbkdf2Sync(hashedKey, salt, 1000, 128);
var promise = db.User.create({
username: request.query.username.toLowerCase(),
email: request.query.email.toLowerCase(),
encryptedPassword: stretchedKey.toString('base64'),
randomSalt: salt.toString('base64'),
premium: true
});
正如您在上面看到的,我为新用户生成了一个随机盐,将密码附加到它并对其进行哈希处理。之后我尝试拉伸(stretch)它然后将它保存在数据库中
这是验证方法的代码:
var hash = crypto.createHash('sha256');
hash.update(user.randomSalt.toString('base64') + request.query.password);
var hashedKey = hash.digest('base64');
console.log("redone pass is: " + hashedKey)
var stretchedKey = crypto.pbkdf2Sync(hashedKey, user.randomSalt, 1000, 128);
console.log("!! " + stretchedKey.toString('base64') + "\n!! " + user.encryptedPassword)
//protect against timing attacks
var check = 0;
for (var i = 0; i < stretchedKey.toString('base64').length; i++)
{
if (stretchedKey.toString('base64').charAt(i) !== user.encryptedPassword.charAt(i) )
{
check++;
}
}
if (check === 0)
{
response.json({
status: 'correct pass'
});
}
else
{
response.json({
status: 'wrong pass'
});
}
});
记录“hashedKey”的两个 console.log 显示相同的结果,即:6lYiSRufti1MBxyMKQKTb5RBM3Ff9qZqzXasXSHPv0E=
记录两个重新散列的密码的较长控制台日志产生以下内容:
ts1b7SpI9Wsemk05Sx/SEYs6mbQa9dbU0qbOxP5Z5oC27yeaBi5syaQDTRDuzWkqtGeUBSNhaoCfAyXN4O9eX8ar5IBEGoGx5T4nb8PFu89XuR3/ZfvF+mbwezzfReUW7BYzqOCugB8v+ 7hFCmpAvG5OZ9uoDGiKh/Uh0mRXOmI=
还有这个
l/2Rq3s3caek2NNQBJ9mRXBcztX0PTGy0bXksriqLX128NkPJ7j6UeeoKyRSh/Bxdfavb0V/C3LUzDSOLruQSA+Y29mEXIbhVjloVtJJGpN+ACckSlf447xlcVF29IlwJn1sN6Gv RlYJuuxB8b9Q3Yz7DWaM1PcmN9+oRyeAD0E=
你们谁能告诉我这里可能哪里出错了?
提前致谢 彼得
最佳答案
结果不匹配的原因是盐的 Base64 不一致。
如果您不是:
var stretchedKey = crypto.pbkdf2Sync(hashedKey, salt, 1000, 128);
你应该使用:
var stretchedKey = crypto.pbkdf2Sync(hashedKey, salt.toString('base64'), 1000, 128);
最好的问候
关于javascript - 加密通行证的重新散列在 Node.js 中使用加密返回不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26083231/