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 相关文章推荐
ASP.NET jQuery 实例12 通过使用jQuery validation插件简单实现用户注册页面验证功能
Feb 03 Javascript
Jquery动态更改一张位图的src与Attr的使用
Jul 31 Javascript
form表单action提交的js部分与html部分
Jan 07 Javascript
js实现不重复导入的方法
Mar 02 Javascript
Vue.js 父子组件通讯开发实例
Sep 06 Javascript
详解JavaScript的内置对象
Dec 07 Javascript
Vue中如何实现proxy代理
Apr 20 Javascript
jQuery实现table表格信息的展开和缩小功能示例
Jul 21 jQuery
vue新vue-cli3环境配置和模拟json数据的实例
Sep 19 Javascript
Vue常见面试题整理【值得收藏】
Sep 20 Javascript
vue与bootstrap实现简单用户信息添加删除功能
Feb 15 Javascript
vue进入页面时滚动条始终在底部代码实例
Mar 26 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
轻松入门: 煮好咖啡的七个诀窍
2021/03/03 冲泡冲煮
PHP中将ip地址转成十进制数的两种实用方法
2013/08/15 PHP
PHP模拟QQ登录的方法
2015/07/29 PHP
PHP session 会话处理函数
2016/06/06 PHP
PHP实现redis限制单ip、单用户的访问次数功能示例
2018/06/16 PHP
Codeigniter里的无刷新上传的实现代码
2019/04/14 PHP
Laravel配置全局公共函数的方法步骤
2019/05/09 PHP
jquery获取input表单值的代码
2010/04/19 Javascript
遍历DOM对象内的元素属性示例代码
2014/02/08 Javascript
Node.js node-schedule定时任务隔多少分钟执行一次的方法
2015/02/10 Javascript
jQuery实现仿新浪微博浮动的消息提示框(可智能定位)
2015/10/10 Javascript
jQuery多条件筛选如何实现
2015/11/04 Javascript
Javascript必知必会(四)js类型转换
2016/06/08 Javascript
微信小程序 获取设备信息 API实例详解
2016/10/02 Javascript
JavaScript中boolean类型之三种情景实例代码
2016/11/21 Javascript
浅析JavaScript的几种Math函数,random(),ceil(),round(),floor()
2016/12/22 Javascript
基于Vue的移动端图片裁剪组件功能
2017/11/28 Javascript
详解基于mpvue的小程序markdown适配解决方案
2018/05/08 Javascript
node使用Mongoose类库实现简单的增删改查
2018/11/08 Javascript
vue 导航内容设置选中状态样式的例子
2019/11/01 Javascript
讲解python参数和作用域的使用
2013/11/01 Python
Python读取指定目录下指定后缀文件并保存为docx
2017/04/23 Python
python实现随机梯度下降(SGD)
2020/03/24 Python
Python基于csv模块实现读取与写入csv数据的方法
2018/01/18 Python
Django使用Mysql数据库已经存在的数据表方法
2018/05/27 Python
Python Pillow Image Invert
2019/01/22 Python
Python中低维数组填充高维数组的实现
2019/12/02 Python
jupyter notebook的安装与使用详解
2020/05/18 Python
Visual Studio Code搭建django项目的方法步骤
2020/09/17 Python
python 视频下载神器(you-get)的具体使用
2021/01/06 Python
C/C++ 笔试、面试题目大汇总
2015/11/21 面试题
C#怎么让一个窗口居中显示?
2015/10/20 面试题
总结表彰大会主持词
2014/03/26 职场文书
学生自我评语
2015/01/04 职场文书
2015年农村党员干部主题教育活动总结
2015/03/25 职场文书
数据库的高级查询六:表连接查询:外连接(左外连接,右外连接,UNION关键字,连接中ON与WHERE的不同)
2021/04/05 MySQL