javascript - 加密通行证的重新散列在 Node.js 中使用加密返回不同的结果

标签 javascript node.js security encryption hash

我已经花了几个小时来解决这个问题,但似乎无法在这里或其他任何地方找到类似的问题。在拼命寻找小拼写错误或其他错误后,我求助于您。

我是第一次实现加密,到目前为止一切顺利,我正在使用加密库和 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/

相关文章:

node.js - Nginx、Node、Angular - 子文件夹 API/URL 配置

javascript - 具有后台同步模块的 Workbox Service Worker

node.js - 为什么 Mongoose 打开两个连接?

javascript - 无法在服务器 NodeJS 上的 Mongo 中创建用户(或基于自定义的角色)

php - 我正在访问日期为 : how to assign a value when a particular date is not present? 的记录

javascript - 使用 vue js 的依赖下拉菜单(不使用ajax)

基于PHP/AJAX的整体网站安全

javascript - 自动生成html代码

PHP Yii2密码加密

java - 用于安全计算欧几里德距离平方的 Paillier 密码系统和协议(protocol)