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


Posted in Javascript onFebruary 07, 2018

前几天利用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);
  }
})

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript 二分法(数组array)
Apr 24 Javascript
javascript获得服务器端控件的ID的实现代码
Dec 28 Javascript
js操作IE浏览器弹出浏览文件夹可以返回目录路径
Jul 14 Javascript
javascript函数式编程实例分析
Apr 25 Javascript
JavaScript正则表达式之multiline属性的应用
Jun 16 Javascript
深入理解JQuery中的事件与动画
May 18 Javascript
解读Bootstrap v4 sass设计
May 29 Javascript
jquery 中toggle的2种用法详解(推荐)
Sep 02 Javascript
Webpack实战加载SVG的方法
Dec 26 Javascript
微信小程序 Animation实现图片旋转动画示例
Aug 22 Javascript
JavaScript类的继承操作实例总结
Dec 20 Javascript
深入浅析golang zap 日志库使用(含文件切割、分级别存储和全局使用等)
Feb 19 Javascript
Vue Element使用icon图标教程详解(第三方)
Feb 07 #Javascript
Vue.set()实现数据动态响应的方法
Feb 07 #Javascript
vue中如何动态绑定图片,vue中通过data返回图片路径的方法
Feb 07 #Javascript
vue 动态改变静态图片以及请求网络图片的实现方法
Feb 07 #Javascript
vue进行图片的预加载watch用法实例讲解
Feb 07 #Javascript
Angular浏览器插件Batarang介绍及使用
Feb 07 #Javascript
详解JS数值Number类型
Feb 07 #Javascript
You might like
php IP及IP段进行访问限制的代码
2008/12/17 PHP
php下用cookie统计用户访问网页次数的代码
2010/05/09 PHP
php后门URL的防范
2013/11/12 PHP
Drupal简体中文语言包安装教程
2014/09/27 PHP
Yii2基于Ajax自动获取表单数据的方法
2016/08/10 PHP
总结的一些PHP开发中的tips(必看篇)
2017/03/24 PHP
js取消单选按钮选中示例代码
2013/11/14 Javascript
JavaScript sup方法入门实例(把字符串显示为上标)
2014/10/20 Javascript
node.js开发中使用Node Supervisor实现监测文件修改并自动重启应用
2014/11/04 Javascript
jquery实现先淡出再折叠收起的动画效果
2015/08/07 Javascript
jQuery1.9+中删除了live以后的替代方法
2016/06/17 Javascript
react native与webview通信的示例代码
2017/09/25 Javascript
分享5个顶级的JavaScript Ajax组件库
2018/09/16 Javascript
微信小程序自定义多列选择器使用详解
2019/06/21 Javascript
微信小程序通过一个json实现分享朋友圈图片
2019/09/03 Javascript
vue路由传参的基本实现方式小结【三种方式】
2020/02/05 Javascript
JS正则表达式常见函数与用法小结
2020/04/13 Javascript
js实现无刷新监听URL的变化示例代码详解
2020/06/03 Javascript
Python中的XML库4Suite Server的介绍
2015/04/14 Python
Tornado协程在python2.7如何返回值(实现方法)
2017/06/22 Python
Python正则表达式分组概念与用法详解
2017/06/24 Python
matplotlib绘图实例演示标记路径
2018/01/23 Python
python flask框架实现重定向功能示例
2019/07/02 Python
利用Python实现Shp格式向GeoJSON的转换方法
2019/07/09 Python
Keras使用ImageNet上预训练的模型方式
2020/05/23 Python
Keras 快速解决OOM超内存的问题
2020/06/11 Python
Python urllib3软件包的使用说明
2020/11/18 Python
Python字节单位转换(将字节转换为K M G T)
2021/03/02 Python
日本高岛屋百货购物网站:TAKASHIMAYA
2019/03/24 全球购物
俄罗斯EPL钻石珠宝店:ЭПЛ
2019/10/22 全球购物
护士实习生自我鉴定范文
2013/12/10 职场文书
益达广告词
2014/03/14 职场文书
质量承诺书范文
2014/03/27 职场文书
2014年秋季开学典礼主持词
2014/08/02 职场文书
如何用PHP websocket实现网页实时聊天
2021/05/26 PHP
python中对列表的删除和添加方法详解
2022/02/24 Python