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 相关文章推荐
一段实时更新的时间代码
Jul 07 Javascript
JS判断字符串长度的5个方法(区分中文和英文)
Mar 18 Javascript
JavaScript中伪协议 javascript:使用探讨
Jul 18 Javascript
JS运动基础框架实例分析
Mar 03 Javascript
jfreechart插件将数据展示成饼状图、柱状图和折线图
Apr 13 Javascript
jQuery事件绑定与解除绑定实现方法
Apr 15 Javascript
JavaScript实现简单获取当前网页网址的方法
Nov 09 Javascript
解析Javascript单例模式概念与实例
Dec 05 Javascript
jquery无法为动态生成的元素添加点击事件的解决方法(推荐)
Dec 26 Javascript
vue中阻止click事件冒泡,防止触发另一个事件的方法
Feb 08 Javascript
js获取form表单中name属性的值
Feb 27 Javascript
JavaScript异步操作的几种常见处理方法实例总结
May 11 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
玩转虚拟域名◎+ .
2006/10/09 PHP
PHP新手上路(十二)
2006/10/09 PHP
用php或asp创建网页桌面快捷方式的代码
2010/03/23 PHP
PHP SPL标准库之数据结构堆(SplHeap)简单使用实例
2015/05/12 PHP
php上传大文件设置方法
2016/04/14 PHP
基于PHP生成简单的验证码
2016/06/01 PHP
PHP微信发送推送消息乱码的解决方法
2019/02/28 PHP
js模拟弹出效果代码修正版
2008/08/07 Javascript
js对象的比较
2011/02/26 Javascript
基于jQuery.Validate验证库知识点的详解
2013/04/26 Javascript
javascript图片延迟加载实现方法及思路
2015/12/31 Javascript
浅谈Node异步编程的机制
2017/10/18 Javascript
解决vue router组件状态刷新消失的问题
2018/08/01 Javascript
JS加密插件CryptoJS实现的Base64加密示例
2020/08/16 Javascript
react build 后打包发布总结
2018/08/24 Javascript
Vue-router的使用和出现空白页,路由对象属性详解
2018/09/03 Javascript
浅谈Vue组件单元测试究竟测试什么
2020/02/05 Javascript
jQuery实现视频展示效果
2020/05/30 jQuery
基于JQuery和DWR实现异步数据传递
2020/10/16 jQuery
Python获取DLL和EXE文件版本号的方法
2015/03/10 Python
Python中列表和元组的使用方法和区别详解
2020/12/30 Python
Python3使用SMTP发送带附件邮件
2020/06/16 Python
Python之csv文件从MySQL数据库导入导出的方法
2018/06/21 Python
用python实现刷点击率的示例代码
2019/02/21 Python
树莓派采用socket方式文件传输(python)
2019/06/22 Python
Python属性和内建属性实例解析
2020/01/14 Python
使用Python实现微信拍一拍功能的思路代码
2020/07/09 Python
CSS3中currentColor关键字的妙用
2016/02/27 HTML / CSS
HTML5实现经典坦克大战坦克乱走还能发出一个子弹
2013/09/02 HTML / CSS
莫斯科制造商的廉价皮大衣:Fursk
2020/06/09 全球购物
软件测试工程师面试问题精选
2016/10/28 面试题
领班岗位职责范文
2014/02/06 职场文书
读群众路线心得体会
2014/03/07 职场文书
缅怀革命先烈演讲稿
2014/05/14 职场文书
2015年污水处理厂工作总结
2015/05/26 职场文书
如何将JavaScript将数组转为树形结构
2021/06/02 Javascript