【问题标题】:Password hashing with bcrypt使用 bcrypt 进行密码散列
【发布时间】:2021-06-04 17:24:19
【问题描述】:

伙计们,我正在尝试使用 BCRYPT 制作密码哈希,但用户真实密码已发送到 PostgresSQL 我能做些什么来解决它?我写错了吗?

import { Model, Sequelize } from 'sequelize';

const bcrypt = require('bcrypt');

class User extends Model {
  static init(sequelize) {
    super.init(
      {
        name: Sequelize.STRING,
        email: Sequelize.STRING,
        password: Sequelize.VIRTUAL,
        password_hash: Sequelize.STRING,
        provider: Sequelize.BOOLEAN,
      },
      {
        sequelize,
      }
    );

    this.addHook('beforeSave', async (user) => {
      if (user.password) {
        user.password_hash = await bcrypt.hash(user.password, 8);
      }
      return this;
    });
  }
}

export default User;

【问题讨论】:

  • 为什么您的用户表中有 2 个密码字段?删除“password”然后你将只有“password_hash”。
  • “密码”我将由用户创建,“password_hash”我将基于用户“密码”创建,这就是我使用bcrypt的原因。

标签: javascript node.js postgresql hash sequelize.js


【解决方案1】:

根据您的评论,

我想你不明白 bcrypt 是如何工作的。

注册用户

await bcrypt.hash(user.password, 8)

这将为您生成用户密码的散列版本。

现在将它保存在数据库中(随便叫什么,password/hashed_pa​​ssword)

您只需要数据库中的散列版本。 bcrypt 知道如何验证原始字符串是否等于散列字符串。

因此,当您执行登录代码时,您需要调用

await bcrypt.compare(req.body.password, db.password, (err, same) => {
 if(err) res.sendStatus(500)

 if(same){
  res.send("LOGIN SUCCSESSFULL!")
 }else{
  res.send("WRONG USERNAME/PASSWORD!")
 }
})

我只是从头顶写了这个,但它应该可以工作。

【讨论】:

  • 这就是问题所在,散列版本没有保存在数据库中,但我的错误是创建用户时他已经创建了散列版本,而不是您自己的密码,例如“password_hash”: "000" 而不是 "password": "000 阅读你的回答我意识到我的错误。
猜你喜欢
  • 2015-10-08
  • 1970-01-01
  • 1970-01-01
  • 2019-07-17
  • 2016-12-11
  • 2021-01-09
  • 2013-04-24
  • 1970-01-01
  • 2019-07-11
相关资源
最近更新 更多