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的面向对象的特性实现限制试用期
Aug 04 Javascript
js函数调用常用方法详解
Dec 03 Javascript
使用jquery中height()方法获取各种高度大全
Apr 02 Javascript
jQuery异步上传文件插件ajaxFileUpload详细介绍
May 19 Javascript
关于RequireJS的简单介绍即使用方法
Oct 20 Javascript
seajs模块之间依赖的加载以及模块的执行
Oct 21 Javascript
详解Node中导入模块require和import的区别
Aug 11 Javascript
vue获取时间戳转换为日期格式代码实例
Apr 17 Javascript
10种JavaScript最常见的错误(小结)
Jun 21 Javascript
在Vue项目中使用Typescript的实现
Dec 19 Javascript
JavaScript 正则应用详解【模式、欲查、反向引用等】
May 13 Javascript
JS实现移动端可折叠导航菜单(现代都市风)
Jul 07 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 zip文件解压类代码
2009/12/02 PHP
PHP APC的安装与使用详解
2013/06/13 PHP
在Mac OS上搭建Nginx+PHP+MySQL开发环境的教程
2015/12/21 PHP
Zend Framework动作助手(Zend_Controller_Action_Helper)用法详解
2016/03/05 PHP
浅析Yii2缓存的使用
2016/05/10 PHP
php根据年月获取当月天数及日期数组的方法
2016/11/30 PHP
使用PHP下载CSS文件中的所有图片【几行代码即可实现】
2016/12/14 PHP
jquery之Document元素选择器篇
2008/08/14 Javascript
Jquery实现的一种常用高亮效果示例代码
2014/01/28 Javascript
EasyUI实现二级页面的内容勾选的方法
2015/03/01 Javascript
jquery获取节点名称
2015/04/26 Javascript
JQuery boxy插件在IE中边角图片不显示问题的解决
2015/05/20 Javascript
Javascript 高阶函数使用介绍
2015/06/15 Javascript
js+ajax实现获取文件大小的方法
2015/12/08 Javascript
FullCalendar日历插件应用之数据展现(一)
2015/12/23 Javascript
浅谈JavaScript变量的自动转换和语句
2016/06/12 Javascript
Js删除数组中某一项或几项的几种方法(推荐)
2016/07/27 Javascript
Vue-cli proxyTable 解决开发环境的跨域问题详解
2017/05/18 Javascript
Angularjs过滤器实现动态搜索与排序功能示例
2017/12/13 Javascript
详解vue使用vue-layer-mobile组件实现toast,loading效果
2018/08/31 Javascript
swiper.js插件实现pc端文本上下滑动功能示例
2018/12/03 Javascript
三步搞定:Vue.js调用Android原生操作
2020/09/07 Javascript
python client使用http post 到server端的代码
2013/02/10 Python
浅谈Python的Django框架中的缓存控制
2015/07/24 Python
python实现根据指定字符截取对应的行的内容方法
2018/10/23 Python
Django MEDIA的配置及用法详解
2019/07/25 Python
澳大利亚女性快速时尚零售商:Ally Fashion
2018/04/25 全球购物
类和结构的区别
2012/08/15 面试题
服装机修工岗位职责
2013/12/26 职场文书
法警的竞聘演讲稿
2014/01/02 职场文书
请假条范文大全
2014/04/10 职场文书
优秀实习生主要事迹
2014/05/29 职场文书
课前一分钟演讲稿
2014/08/26 职场文书
总经理助理岗位职责
2015/01/31 职场文书
幼儿园教师求职信
2015/03/20 职场文书
2015年班长个人工作总结
2015/04/03 职场文书