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 相关文章推荐
基于jQuery的试卷自动排版系统实现代码
Jan 06 Javascript
jQuery实现异步获取json数据的2种方式
Aug 29 Javascript
textarea不能通过maxlength属性来限制字数的解决方法
Sep 01 Javascript
jQuery实现的鼠标滑过弹出放大图片特效
Jan 08 Javascript
js和jQuery设置Opacity半透明 兼容IE6
May 24 Javascript
Bootstrap基本布局实现方法详解
Nov 25 Javascript
浅谈Vue父子组件和非父子组件传值问题
Aug 22 Javascript
Node使用Sequlize连接Mysql报错:Access denied for user ‘xxx’@‘localhost’
Jan 03 Javascript
详解微信小程序中组件通讯
Oct 30 Javascript
js使用文件流下载csv文件的实现方法
Jul 15 Javascript
小程序自定义模板实现吸顶功能
Jan 08 Javascript
基于vue实现微博三方登录流程解析
Nov 04 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+html5使用FormData对象提交表单及上传图片的方法
2015/02/11 PHP
PHP使用strtotime计算两个给定日期之间天数的方法
2015/03/18 PHP
thinkphp 验证码 的使用小结
2017/05/07 PHP
Codeigniter里的无刷新上传的实现代码
2019/04/14 PHP
php实现登录页面的简单实例
2019/09/29 PHP
js压缩工具 yuicompressor 使用教程
2010/03/31 Javascript
jQuery1.6 类型判断实现代码
2011/09/01 Javascript
JavaScript中定义函数的三种方法
2015/03/12 Javascript
AngularJS 遇到的小坑与技巧小结
2016/06/07 Javascript
JavaScript 实现的checkbox经典实例分享
2016/10/16 Javascript
js addDqmForPP给标签内属性值加上双引号的函数
2016/12/24 Javascript
JavaScript的事件机制详解
2017/01/17 Javascript
loading动画特效小结
2017/01/22 Javascript
ES6新特性之类(Class)和继承(Extends)相关概念与用法分析
2017/05/24 Javascript
基于vue2.0实现的级联选择器
2017/06/09 Javascript
JS图片轮播与索引变色功能实例详解
2017/07/06 Javascript
JavaScript hasOwnProperty() 函数实例详解
2017/08/04 Javascript
详解如何在项目中使用jest测试react native组件
2018/02/09 Javascript
深入学习TypeScript 、React、 Redux和Ant-Design的最佳实践
2019/06/17 Javascript
node.js文件操作系统实例详解
2019/11/05 Javascript
JS代码触发事件代码实例
2020/01/02 Javascript
[08:07]DOTA2每周TOP10 精彩击杀集锦vol.8
2014/06/25 DOTA
python实时分析日志的一个小脚本分享
2017/05/07 Python
tensorflow实现简单的卷积神经网络
2018/05/24 Python
详解python配置虚拟环境
2019/04/08 Python
Python基于Dlib的人脸识别系统的实现
2020/02/26 Python
使用CSS3的font-face字体嵌入样式的方法讲解
2016/05/13 HTML / CSS
美国生鲜及杂货电商:FreshDirect
2018/01/29 全球购物
电子信息毕业生自荐信
2013/11/16 职场文书
企业群众路线教育实践活动心得体会
2014/11/03 职场文书
业务员岗位职责
2015/02/03 职场文书
党员志愿者服务倡议书
2015/04/29 职场文书
背起爸爸上学观后感
2015/06/08 职场文书
2016元旦晚会主持词
2015/07/01 职场文书
驻村工作简报
2015/07/20 职场文书
2015年幼儿教育工作总结
2015/07/24 职场文书