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 相关文章推荐
16个最流行的JavaScript框架[推荐]
May 29 Javascript
javascript权威指南 学习笔记之变量作用域分享
Sep 28 Javascript
JQuery实现倒计时按钮的实现代码
Mar 23 Javascript
基于JavaScript实现仿京东图片轮播效果
Nov 06 Javascript
javascript for-in有序遍历json数据并探讨各个浏览器差异
Nov 30 Javascript
微信开发 使用picker封装省市区三级联动模板
Oct 28 Javascript
Bootstrap 填充Json数据的实例代码
Jan 11 Javascript
详解node HTTP请求客户端 - Request
May 05 Javascript
Javascript实现异步编程的过程
Jun 18 Javascript
浅谈Vue.js中如何实现自定义下拉菜单指令
Jan 06 Javascript
node.js文件操作系统实例详解
Nov 05 Javascript
Vue项目如何引入bootstrap、elementUI、echarts
Nov 26 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
自制短波长线天线频率预选器 - 成功消除B2K之流的镜像
2021/03/02 无线电
文件上传的实现
2006/10/09 PHP
PHP+ajax分页实例简析
2015/12/07 PHP
yii框架数据库关联查询操作示例
2019/10/14 PHP
javascript自定义的addClass()方法
2014/05/28 Javascript
angularJS与bootstrap结合实现动态加载弹出提示内容
2015/10/16 Javascript
Bootstrap Table服务器分页与在线编辑应用总结
2016/08/08 Javascript
利用Js的console对象,在控制台打印调式信息测试Js的实现
2016/11/26 Javascript
利用Chrome DevTools直接调试Node.js和JavaScript的方法详解(并行)
2017/02/16 Javascript
JavaScript实现两个select下拉框选项左移右移
2017/03/09 Javascript
基于jQuery实现手风琴菜单、层级菜单、置顶菜单、无缝滚动效果
2017/07/20 jQuery
使用node.js对音视频文件加密的实例代码
2017/08/30 Javascript
JS图片延迟加载插件LazyImgv1.0用法分析【附demo源码下载】
2017/09/04 Javascript
elementui的默认样式修改方法
2018/02/23 Javascript
JavaScript设计模式之建造者模式实例教程
2018/07/02 Javascript
vue.js 打包时出现空白页和路径错误问题及解决方法
2019/06/26 Javascript
微信小程序自定义单项选择器样式
2019/07/25 Javascript
nodejs语言实现验证码生成功能的示例代码
2019/10/13 NodeJs
JQuery常用简单动画操作方法回顾与总结
2019/12/07 jQuery
JS常用正则表达式超全集(密码强度校验,金额校验,IE版本,IPv4,IPv6校验)
2020/02/03 Javascript
Vue微信公众号网页分享的示例代码
2020/05/28 Javascript
[05:11]TI9战队采访——VIRTUSPRO
2019/08/22 DOTA
python基础教程之popen函数操作其它程序的输入和输出示例
2014/02/10 Python
django中send_mail功能实现详解
2018/02/06 Python
python实现将读入的多维list转为一维list的方法
2018/06/28 Python
解决python3捕获cx_oracle抛出的异常错误问题
2018/10/18 Python
python把转列表为集合的方法
2019/06/28 Python
Python3爬虫里关于代理的设置总结
2020/07/30 Python
requests在python中发送请求的实例讲解
2021/02/17 Python
Html5 APP中监听返回事件处理的方法示例
2018/03/15 HTML / CSS
Desigual英国官网:在线购买原创服装
2018/03/09 全球购物
Oasis服装官网:时尚女装在线
2020/07/09 全球购物
某公司面试题
2012/03/05 面试题
中国文明网2015年“向国旗敬礼”活动网上签名寄语
2015/09/24 职场文书
保险公司2016开门红口号集锦
2015/12/24 职场文书
Golang中异常处理机制详解
2021/06/08 Golang