encryption通道的重新encryption会在Node.js中返回不同的encryption结果

我现在已经有好几个小时了,似乎在这里或其他地方找不到类似的问题。 在拼命寻找小的错别字或其他错误后,我转向你。

我第一次实现encryption,到目前为止,所有工作都已经成功完成,我使用encryption库和Node.js一起对密码进行哈希和encryption。 到目前为止,这工作得很好,但是当我尝试做迭代rehashing时,我得不到相同的密钥。

让我告诉你我的代码:

从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 }); 

正如你可以在上面看到的,我为新用户生成一个随机salt,将密码附加到它并散列它。 之后,我尝试拉伸它,然后将其保存在数据库中

以下是来自authentication方法的代码:

  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' }); } }); 

logging“hashedKey”的两个console.log显示的结果相同: 6lYiSRufti1MBxyMKQKTb5RBM3Ff9qZqzXasXSHPv0E=

它logging在两个重新散列的口令产生这种较长的控制台日志: ts1b7SpI9Wsemk05Sx/SEYs6mbQa9dbU0qbOxP5Z5oC27yeaBi5syaQDTRDuzWkqtGeUBSNhaoCfAyXN4O9eX8ar5IBEGoGx5T4nb8PFu89XuR3/ZfvF+mbwezzfReUW7BYzqOCugB8v+7hFCmpAvG5OZ9uoDGiKh/Uh0mRXOmI=

和这个

l/2Rq3s3caek2NNQBJ9mRXBcztX0PTGy0bXksriqLX128NkPJ7j6UeeoKyRSh/Bxdfavb0V/C3LUzDSOLruQSA+Y29mEXIbhVjloVtJJGpN+ACckSlf447xlcVF29IlwJn1sN6GvRlYJuuxB8b9Q3Yz7DWaM1PcmN9+oRyeAD0E=

你能告诉我哪里可能会出错吗?

在此先感谢彼得

结果不匹配的原因是由于盐的碱基不一致。

如果你不是:

 var stretchedKey = crypto.pbkdf2Sync(hashedKey, salt, 1000, 128); 

你应该使用:

 var stretchedKey = crypto.pbkdf2Sync(hashedKey, salt.toString('base64'), 1000, 128); 

最好的祝福