当前位置: 首页 > 知识库问答 >
问题:

无法将存储在MySQL数据库中的密码与使用bcrypt从前端输入的密码进行比较

陶朝明
2023-03-14

我正在从MySQL中的前端为注册用户输入密码。现在,当im登录时,我希望使用bcrypt-nodejs将输入的密码与数据库中原始存储的密码进行比较。但不能这样做。我是Node.js的初学者,请帮忙!!

这段代码在我的server.js文件中,它是主节点服务器文件。

app.post('/signin', (req,res)=>{

     const {email} = req.body; 
      let post= {email: email};

      let sql= 'SELECT password FROM users WHERE email= ?';
      let query= db.query(sql, post,(error,result)=>{

    if(error) 
    {
        throw error;

    }

    else if(!error)
     {  

     bcrypt.hash(result, null,null, function(err,res){


      });


     bcrypt.compare(req.body.password, hash, (err,res)=>{

        if(err)
        {
            throw error;
        }
         else if(res)
          {
            res.send('signin successful');
          }
     }

      else {
        res.status(400).json('error logging in');
      }
       //res.json('signin');  

      });

      })


  })

正如您所看到的,Im试图对来自数据库的口令结果进行散列,并将其与用户从前端输入的req.body.password进行比较,但在控制台中出现错误

共有1个答案

丘华翰
2023-03-14

让我们用async/await稍微重写一下,使其更易读

app.post('/signin', async (req, res) => {
  const { email } = req.body;
  let post = { email: email };

  let sql = 'SELECT password FROM users WHERE email= ?';
  const queryResult = await new Promise(resolve => db.query(sql, post, (error, result) => resolve(result)));
  // I assume you should access here your hash with something like this queryResult.password`
  const hashStoredInDb = queryResult.password;
  const compareResult = await new Promise(resolve => bcrypt.compare(req.body.password, hashStoredInDb, (err, res) => resolve(res)));

  // Your other verification logic based on compare result.
})

因此,主要的逻辑是将已存储在db中的散列密码与用户提供的散列密码进行比较。
此外,您还可以在提供的代码中添加一些验证,为了简单和可读性,我错过了一些try/catch

 类似资料:
  • 问题内容: 我有一个脚本化的管道,可以使用该功能请求用户的密码,并将其与用户保存的凭据密码短语进行比较。如果用户输入是一种类型,则可以使用。但是,当我将输入类型更改为(因此用户输入时在屏幕上看不到该输入类型)时,它将失败并显示断言错误。 我确保输入与凭证文件中的密码匹配的密码。 我正在将Jenkins 2.83与最新的Credentials插件和Credentials绑定插件一起使用。 脚本: 我

  • 问题内容: 我想用散列密码,以后再验证提供的密码是否正确。 散列密码很容易: 如何将纯文本密码与存储的哈希值进行比较? 问题答案: 使用py-bcrypt,您不需要单独存储盐:将盐存储在哈希中。 您可以简单地将哈希用作盐,盐将存储在哈希的开头。

  • 我有一个网页,使用bcrypt加密用户名密码,这些密码然后存储在数据库中。我有一个运行在QT上的C++程序,它需要对用户进行身份验证,为了做到这一点,我必须加密用户输入的密码,并将其与数据库中的密码进行比较。这是正确的做法吗?如果是的话,我该如何做到这一点?用户输入的密码的加密必须与bcrypt的加密相同,我如何做到这一点?提前道谢。

  • 我的应用程序中有一个用例,它应该防止用户在重置密码时选择最后3个密码中的一个。我使用Angular作为前端,spring boot作为后端。在我的场景中,用户密码存储为bcrypt哈希。 如何将用户输入的密码与最近3个存储的bcrypt密码进行比较? 当我运行下面的代码片段示例时, 它生成以下bcrypt哈希。每个散列都是不同的,这是合理的,因为当我检查时,我可以看到生成的salt是随机值。 sp

  • 鉴于: $salt—一个伪随机生成的字符串,长度足够长 $Pepper-一个足够强的私钥,只有存储口令的数据库管理员知道 你会看到吗 ########################################################################################################### 有意义地优于 $hash=bcrypt($user

  • 在对UserDetailsService的自定义实现使用Bcrypt之前,我首先想看看是否可以在内存数据库中使用它。 创建/公开PasswordEncoder bean时,会弹出此警告,最终阻止我访问登录路径: 添加不推荐使用的NoOpPasswordEncoder将暂时解决此问题,但显然不会对密码进行编码: 添加Bcrypt的正确方法是什么?