我现在已经在这几个小时了,似乎无法在这里或其他任何地方找到类似的问题。在拼命寻找小错字或其他错误后,我转向你。
我是第一次实施加密,到目前为止,所有这些都已成功完成,我使用加密库和Node.js来对密码进行哈希和加密。到目前为止一直运行良好,但是当我尝试进行迭代重复时,我没有得到相同的密钥。
让我告诉你我的代码:
来自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
});
正如您在上面所看到的,我为新用户生成一个随机盐,将密码附加到它并散列它。之后我尝试拉伸它,然后将其保存在数据库中
以下是身份验证方法的代码:
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'
});
}
});
记录&#34; hashedKey&#34;的两个console.log;显示的结果与6lYiSRufti1MBxyMKQKTb5RBM3Ff9qZqzXasXSHPv0E=
记录两个重新生成的密码的较长控制台日志会产生以下结果:
ts1b7SpI9Wsemk05Sx/SEYs6mbQa9dbU0qbOxP5Z5oC27yeaBi5syaQDTRDuzWkqtGeUBSNhaoCfAyXN4O9eX8ar5IBEGoGx5T4nb8PFu89XuR3/ZfvF+mbwezzfReUW7BYzqOCugB8v+7hFCmpAvG5OZ9uoDGiKh/Uh0mRXOmI=
和这个
l/2Rq3s3caek2NNQBJ9mRXBcztX0PTGy0bXksriqLX128NkPJ7j6UeeoKyRSh/Bxdfavb0V/C3LUzDSOLruQSA+Y29mEXIbhVjloVtJJGpN+ACckSlf447xlcVF29IlwJn1sN6GvRlYJuuxB8b9Q3Yz7DWaM1PcmN9+oRyeAD0E=
你们有谁能告诉我这里可能出错的地方吗?
提前致谢 彼得
答案 0 :(得分:1)
结果不匹配的原因是由于盐的Base64不一致。
如果您代替:
var stretchedKey = crypto.pbkdf2Sync(hashedKey, salt, 1000, 128);
你应该使用:
var stretchedKey = crypto.pbkdf2Sync(hashedKey, salt.toString('base64'), 1000, 128);
祝你好运