加密传递的rehash使用Node.js中的crypto返回不同的结果

时间:2014-09-28 08:53:36

标签: javascript node.js security encryption hash

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

我是第一次实施加密,到目前为止,所有这些都已成功完成,我使用加密库和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=

你们有谁能告诉我这里可能出错的地方吗?

提前致谢 彼得

1 个答案:

答案 0 :(得分:1)

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

如果您代替:

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

你应该使用:

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

祝你好运