首页 > 语言 > JavaScript > 正文

Express下采用bcryptjs进行密码加密的方法

2024-05-06 15:22:02
字体:
来源:转载
供稿:网友

前几天利用Express开发了个小项目,开发登录注册模块时,采用bcryptjs进行密码加密,总结了一下内容:

bcrypt,是一个跨平台的文件加密工具。由它加密的文件可在所有支持的操作系统和处理器上进行转移。它的口令必须是8至56个字符,并将在内部被转化为448位的密钥。

除了对您的数据进行加密,默认情况下,bcrypt 在删除数据之前将使用随机数据三次覆盖原始输入文件,以阻挠可能会获得您的计算机数据的人恢复数据的尝试。如果您不想使用此功能,可设定禁用此功能。

bcrypt 使用的是布鲁斯·施内尔在1993年发布的 Blowfish 加密算法。具体来说,bcrypt 使用保罗·柯切尔的算法实现。随 bcrypt 一起发布的源代码对原始版本作了略微改动。

Express下bcryptjs的使用步骤:

1.安装bcryptjs模块

npm install bcryptjs --save

2.在需要加密的模块中引入bcryptjs库

var bcrypt = require('bcryptjs');

3.设置加密强度

var salt = bcrypt.genSaltSync(10);

4.注册时生成HASH值,并插入数据库

router.post('/register', function(req, res, next){  // 从连接池获取连接  pool.getConnection(function(err, connection) {    // 获取前台页面传过来的参数    var param = req.query || req.params;    /*生成HASH值*/    var hash = bcrypt.hashSync(param.pwd,salt);    // 建立连接 新增用户    connection.query(userSQL.insert, ["",hash,param.phone,"","","",0], function(err, result) {      res.send(result);      // 释放连接      connection.release();    });  });});

5.登录时验证HASH值,并插入数据库

router.post('/login', function(req, res, next){  // 从连接池获取连接  pool.getConnection(function(err, connection) {    // 获取前台页面传过来的参数    var param = req.query || req.params;    // 建立连接 根据手机号查找密码    connection.query(userSQL.getPwdByPhoneNumber, [param.phone], function(err, result) {      if(bcrypt.compareSync(param.pwd,result[0].password)){        res.send("1");        connection.query(userSQL.updateLoginStatusById, [1,result[0].id], function(err, result) {        });      }else{        res.send("0");      }      // 释放连接      connection.release();    });  });});

以上采用的是bcryptjs的同步用法,下面介绍异步用法:

生成hash密码:

bcrypt.genSalt(10, function(err, salt) {  bcrypt.hash("B4c0///", salt, function(err, hash) {    // Store hash in your password DB.  });});

密码验证:

bcrypt.compare("B4c0///", hash).then((res) => {  // res === true});

下面是使用Bcrypt对数据加密的一个简单的栗子:

var mongoose = require('mongoose');// 引入bcrypt模块var bcrypt = require('bcrypt');// 定义加密密码计算强度var SALT_WORK_FACTOR = 10;// 连接数据库mongoose.connect('mongodb://localhost:27017/test')// 定义用户模式var UserSchema = new mongoose.Schema({  name: {    unique: true,    type: String  },  password: {    unique: true,    type: String  }},{ collection: "user"});// 使用pre中间件在用户信息存储前进行密码加密UserSchema.pre('save', function(next){  var user = this;  // 进行加密(加盐)  bcrypt.genSalt(SALT_WORK_FACTOR, function(err, salt){    if(err){      return next(err);    }    bcrypt.hash(user.password, salt, function(err, hash){      if(err){        return next(err);      }      user.password = hash;      next();    })  });});// 编译模型var UserBox = mongoose.model('UserBox', UserSchema);// 创建文档对象实例var user = new UserBox ({  name : "Jack" ,  password : "123456"});// 保存用户信息user.save(function(err, user){  if(err){    console.log(err);  }else{    // 如果保存成功,打印用户密码    console.log("password: " + user.password);  }})            
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选