如何使用散列 bcrypt 版本更新数据库中的每个密码?

Posted

技术标签:

【中文标题】如何使用散列 bcrypt 版本更新数据库中的每个密码?【英文标题】:How Can I update each password in my database with hashed bcrypt version? 【发布时间】:2020-06-28 17:23:34 【问题描述】:

如您所见。我正在尝试获取列中的先前密码并使用散列版本对其进行更新。由于某种原因,文档上的保存不会立即触发。所以我尝试使用异步等待,甚至创建自定义异步等待 foreach 来等待回调和保存。然而,Mongoose 似乎在等待所有的保存都进入后才应用保存。

这是我得到的错误。

UnhandledPromiseRejectionWarning:未处理的承诺拒绝。此错误源于在没有 catch 块的情况下抛出异步函数内部,或拒绝未使用 .catch() 处理的承诺。 (拒绝编号:505) (节点:2440)

const User = require("./models/User");
const bcrypt = require("bcryptjs");
const db = require("./config/keys").mongoURI;


async function hashIt(user) 
    console.log(user);
    bcrypt.genSalt(10, (err, salt) => 
        if (err) console.log(err);
        bcrypt.hash(user.Password, salt, async (err, hash) => 
            if (err) throw err;
            user.Password = hash;
            const id = await user.save();
            console.log(id);
        )
    );


async function asyncForEach(array, callback) 
    for (let index = 0; index < array.length; index++) 
        await callback(array[index], index, array);
    


async function mySeed() 
    try 
        User.find(, async (err, users) => 
            if (err) console.log(err);
            asyncForEach(users, async (user) => 
                await hashIt(user);
            )
        );
     catch (e) 
        console.log(e);
    


async function fullThing()
    mongoose.connect(db,  useNewUrlParser: true )
    .then(async () => 
        await mySeed();
        console.log("finished successfully");
    )


fullThing();```     

【问题讨论】:

我已经测试了我的解决方案,它有效! 【参考方案1】:

感谢您的回复。解决方案原来是 w=majority 出于某种原因需要从数据库连接中删除。删除之后。一切都开始正常工作。用 catch 包裹连接确实有助于找到错误。

【讨论】:

【参考方案2】:

我在当前的后端系统上运行了一个类似的例程,以下是我如何调整您的代码以适应我的;我的工作正常,因此我希望你的工作也一样。我相信问题在于你没有发现潜在的错误,一开始我经常发生这种情况,有时当我累了时仍然会发生。

bcrypt.genSalt(10, (err, salt) => 
  if (err) console.log(err);
  bcrypt.hash(user.Password, salt, (err, hash) => 
    if (err) throw err;
    user.Password = hash;
    const id = user
      .save()
      .then(() => 
        console.log("okay");
      )
      .catch(err => console.log(err));

  );
);

如果它不起作用,请告诉我出现的错误。

附录

我在下面测试了我的解决方案:

const bcrypt = require("bcryptjs");
require("./connection");

//creating user schema
var mongoose = require("mongoose");
var Schema = mongoose.Schema;

UserSchema = new Schema( name: String, password: String );
var User = mongoose.model("User", UserSchema);

const user = new User( name: "Jorge Pires", password: "Corona Virus" );

console.log(` Before hashing $user.password`);

//---------------------------------------------------------------
//Uncomment here to save the user before hashing, it will change anyway, therefore no need!
// user.save();
// User.create( name: "Jorge Pires", password: "Corona Virus" );
//--------------------------------------------------------------
bcrypt.genSalt(10, (err, salt) => 
  //generates the salta
  if (err) console.log(err);
  bcrypt.hash(user.password, salt, (err, hash) => 
    //creates the hash
    if (err) throw err;
    user.password = hash; //saves the hash
    const id = user
      .save()
      .then(() => 
        console.log(` after hashing $user.password`);
        console.log(` Here goes the user id  $user.id`);
      )
      .catch(err => console.log(err));
  );
);

输出样本:

Before hashing Corona Virus
we are connected mongoose-tutorial
 after hashing $2a$10$84MqPsiiMGA/KTHKFbytVOD5/su6rXiE7baA2TmsLzPMe.Y45aL9i
 Here goes the user id  5e710a0bd4385c05b0cd827f

【讨论】:

以上是关于如何使用散列 bcrypt 版本更新数据库中的每个密码?的主要内容,如果未能解决你的问题,请参考以下文章

Golang 中的 Bcrypt 密码散列(与 Node.js 兼容)?

如何在没有注册页面的情况下在 mongodb 中使用 bcrypt 散列密码?

我应该使用啥列类型/长度将 Bcrypt 散列密码存储在数据库中?

使用 bcrypt 散列密码迁移系统

尝试更新散列密码c#

如何迁移密码哈希?