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 相关文章推荐
List Information About the Binary Files Used by an Application
Jun 18 Javascript
JavaScript中的Window窗口对象
Jan 16 Javascript
js 方法实现返回多个数据的代码
Apr 30 Javascript
jquery 添加节点的几种方法介绍
Sep 04 Javascript
js 操作符汇总
Nov 08 Javascript
如何减少浏览器的reflow和repaint
Feb 26 Javascript
详解JS异步加载的三种方式
Mar 07 Javascript
原生JavaScript实现remove()和recover()功能示例
Jul 24 Javascript
layui获取选中行数据的实例讲解
Aug 19 Javascript
vue.js 2.0实现简单分页效果
Jul 29 Javascript
解决vue scoped scss 无效的问题
Sep 04 Javascript
vue.js实现点击图标放大离开时缩小的代码
Jan 27 Vue.js
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
德生PL450的电路分析和低放电路的改进办法
2021/03/02 无线电
php上传文件的增强函数
2010/07/21 PHP
PHP+shell实现多线程的方法
2015/07/01 PHP
在Mac OS上搭建PHP的Yii框架及相关测试环境
2016/02/14 PHP
PHP 裁剪图片
2021/03/09 PHP
js 父窗口控制子窗口的行为-打开,关闭,重定位,回复
2010/04/20 Javascript
JavaScript高级程序设计(第3版)学习笔记6 初识js对象
2012/10/11 Javascript
JavaScript简单实现鼠标移动切换图片的方法
2016/02/23 Javascript
详解Immutable及 React 中实践
2018/03/01 Javascript
vue组件的写法汇总
2018/04/12 Javascript
用vue快速开发app的脚手架工具
2018/06/11 Javascript
element UI upload组件上传附件格式限制方法
2018/09/04 Javascript
layui按条件隐藏表格列的实例
2019/09/19 Javascript
Vue实现剪切板图片压缩功能
2020/02/04 Javascript
Vue SSR 即时编译技术的实现
2020/05/06 Javascript
vue+elementUI动态增加表单项并添加验证的代码详解
2020/12/17 Vue.js
typescript编写微信小程序创建项目的方法
2021/01/29 Javascript
[01:14:05]《加油DOTA》第四期
2014/08/25 DOTA
[46:40]VGJ.T vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
Python数据结构之图的应用示例
2018/05/11 Python
Python实现分段线性插值
2018/12/17 Python
Python利用WMI实现ping命令的例子
2019/08/14 Python
python 实现让字典的value 成为列表
2019/12/16 Python
keras 特征图可视化实例(中间层)
2020/01/24 Python
Python使用cn2an实现中文数字与阿拉伯数字的相互转换
2021/03/02 Python
CLR与IL分别是什么含义
2016/08/23 面试题
机电专业个人自荐信格式模板
2013/09/23 职场文书
销售顾问的岗位职责
2013/11/13 职场文书
初中语文教学反思
2014/02/02 职场文书
关于热爱祖国的演讲稿
2014/05/04 职场文书
廉洁自律演讲稿
2014/05/22 职场文书
献爱心大型公益活动策划方案
2014/09/15 职场文书
付款委托书范本
2014/10/05 职场文书
乡镇三严三实学习心得体会
2014/10/13 职场文书
2016年“抗战胜利纪念日”71周年校园广播稿
2015/12/18 职场文书
秀!学妹看见都惊呆的Python小招数!【详细语言特性使用技巧】
2021/04/27 Python