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 相关文章推荐
JS获取后台Cookies值的小例子
Mar 04 Javascript
JS对HTML标签select的获取、添加、删除操作
Oct 17 Javascript
jquery取消选择select下拉框示例代码
Feb 22 Javascript
ExtJs纵坐标值重复问题的解决方法
Feb 27 Javascript
原生javascript实现图片弹窗交互效果
Jan 12 Javascript
基于jQuery+PHP+Mysql实现在线拍照和在线浏览照片
Sep 06 Javascript
js实现的简单图片浮动效果完整实例
May 10 Javascript
js实现上传图片预览方法
Oct 25 Javascript
Node.js通过身份证号验证年龄、出生日期与性别方法示例
Mar 09 Javascript
JS开发中百度地图+城市联动实现实时触发查询地址功能
Apr 13 Javascript
vue跳转同一个组件,参数不同,页面接收值只接收一次的解决方法
Nov 05 Javascript
Nuxt的动态路由和参数校验操作
Nov 09 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
phpmyadmin配置文件现在需要绝密的短密码(blowfish_secret)的2种解决方法
2014/05/07 PHP
php 伪静态之IIS篇
2014/06/02 PHP
使用PHPMailer发送邮件实例
2017/02/15 PHP
PHP使用xpath解析XML的方法详解
2017/05/20 PHP
JavaScript中令你抓狂的魔术变量
2006/11/30 Javascript
关于javascript DOM事件模型的两件事
2010/07/22 Javascript
date.parse在IE和FF中的区别
2010/07/29 Javascript
Android中资源文件(非代码部分)的使用概览
2012/12/18 Javascript
JavaScript 动态加载脚本和样式的方法
2015/04/13 Javascript
一道JS前端闭包面试题解析
2015/12/25 Javascript
基于Bootstrap使用jQuery实现输入框组input-group的添加与删除
2016/05/03 Javascript
JavaScript中利用构造器函数模拟类的方法
2017/02/16 Javascript
Map.vue基于百度地图组件重构笔记分享
2017/04/17 Javascript
js浏览器滚动条卷去的高度scrolltop(实例讲解)
2017/07/07 Javascript
node实现简单的反向代理服务器
2017/07/26 Javascript
apicloud拉起小程序并传递参数的方法示例
2018/11/21 Javascript
详解vue开发中调用微信jssdk的问题
2019/04/16 Javascript
vue.js 2.0实现简单分页效果
2019/07/29 Javascript
vue2.x 对象劫持的原理实现
2020/04/19 Javascript
vue移动端弹起蒙层滑动禁止底部滑动操作
2020/07/22 Javascript
Node使用koa2实现一个简单JWT鉴权的方法
2021/01/26 Javascript
Python输出9*9乘法表的方法
2015/05/25 Python
在python中按照特定顺序访问字典的方法详解
2018/12/14 Python
pip安装py_zipkin时提示的SSL问题对应
2018/12/29 Python
python 计算积分图和haar特征的实例代码
2019/11/20 Python
简单了解python filter、map、reduce的区别
2020/01/14 Python
python3 sleep 延时秒 毫秒实例
2020/05/04 Python
python字符串的index和find的区别详解
2020/06/20 Python
孤独星球出版物:Lonely Planet Publications
2018/03/17 全球购物
致长跑运动员加油稿
2014/02/20 职场文书
医院领导班子查摆问题对照检查材料思想汇报
2014/10/08 职场文书
合同纠纷调解书
2015/05/20 职场文书
社区安全温馨提示语
2015/07/14 职场文书
大学学生会主席竞选稿
2015/11/19 职场文书
学校团代会开幕词
2016/03/04 职场文书
Python opencv缺陷检测的实现及问题解决
2021/04/24 Python