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 学习笔记二 字符串拼接
Mar 28 Javascript
解析js中获得父窗口链接getParent方法以及各种打开窗口的方法
Jun 19 Javascript
基于jquery编写的横向自适应幻灯片切换特效的实例代码
Aug 06 Javascript
在JavaScript中用getMinutes()方法返回指定的分时刻
Jun 10 Javascript
JavaScript中的getTime()方法使用详解
Jun 10 Javascript
微信小程序调用摄像头隐藏式拍照功能
Aug 22 Javascript
webpack打包多页面的方法
Nov 30 Javascript
微信小程序 JS动态修改样式的实现方法
Dec 16 Javascript
详解Element 指令clickoutside源码分析
Feb 15 Javascript
怎么使用javascript深度拷贝一个数组
Jun 06 Javascript
jquery检测上传文件大小示例
Apr 26 jQuery
微信小程序 根据不同用户切换不同TabBar
Apr 21 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实现仿Google分页效果的分页函数
2015/07/29 PHP
PHP实现上传多文件示例代码
2017/02/20 PHP
不错的asp中显示新闻的功能
2006/10/13 Javascript
JSON 入门指南 想了解json的朋友可以看下
2009/08/26 Javascript
JavaScript高级程序设计阅读笔记(六) ECMAScript中的运算符(二)
2012/02/27 Javascript
jquery Mobile入门—外部链接切换示例代码
2013/01/08 Javascript
一个仿糯米弹框效果demo
2014/07/22 Javascript
jquery获得当前html页面源码的方法
2015/07/14 Javascript
谈谈我对JavaScript原型和闭包系列理解(随手笔记6)
2015/12/20 Javascript
JS模拟按钮点击功能的方法
2015/12/22 Javascript
JavaScript开发Chrome浏览器扩展程序UI的教程
2016/05/16 Javascript
总结Javascript中数组各种去重的方法
2016/10/04 Javascript
AngularJS入门示例之Hello World详解
2017/01/04 Javascript
浅谈Node 调试工具入门教程
2018/03/20 Javascript
Vue实现拖放排序功能的实例代码
2019/07/08 Javascript
基于layPage插件实现两种分页方式浅析
2019/07/27 Javascript
JS中的算法与数据结构之字典(Dictionary)实例详解
2019/08/20 Javascript
关于layui 实现点击按钮添加一行(方法渲染创建的table)
2019/09/29 Javascript
Vue+scss白天和夜间模式切换功能的实现方法
2021/01/05 Vue.js
为Python的web框架编写前端模版的教程
2015/04/30 Python
python中self原理实例分析
2015/04/30 Python
基于wxpython开发的简单gui计算器实例
2015/05/30 Python
简介Django中内置的一些中间件
2015/07/24 Python
Python中functools模块的常用函数解析
2016/06/30 Python
python判断字符串编码的简单实现方法(使用chardet)
2016/07/01 Python
Python网络编程基于多线程实现多用户全双工聊天功能示例
2018/04/10 Python
使用python将时间转换为指定的格式方法
2018/11/12 Python
Python常用模块logging——日志输出功能(示例代码)
2019/11/20 Python
基于Pytorch SSD模型分析
2020/02/18 Python
viagogo意大利票务平台:演唱会、体育比赛、戏剧门票
2018/01/26 全球购物
高中班级口号
2014/06/09 职场文书
中秋晚会活动方案
2014/08/31 职场文书
亮剑观后感500字
2015/06/05 职场文书
雷锋的观后感
2015/06/10 职场文书
mysq启动失败问题及场景分析
2021/07/15 MySQL
Node.js实现爬取网站图片的示例代码
2022/04/04 NodeJs