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 相关文章推荐
关于使用 jBox 对话框的提交不能弹出问题解决方法
Nov 07 Javascript
hover的用法及live的用法介绍(鼠标悬停效果)
Mar 29 Javascript
JS倒计时代码汇总
Nov 25 Javascript
JavaScript判断前缀、后缀是否是空格的方法
Apr 15 Javascript
jquery实现select选择框内容左右移动代码分享
Nov 21 Javascript
原生js获取元素样式的简单方法
Aug 06 Javascript
Vue.js每天必学之数据双向绑定
Sep 05 Javascript
jquery实现下拉菜单的手风琴效果
Jul 23 jQuery
express中static中间件的具体使用方法
Oct 17 Javascript
微信小程序获取当前时间及星期几的实例代码
Sep 20 Javascript
微信小程序实现底部弹出框
Nov 18 Javascript
原生js实现点击按钮复制内容到剪切板
Nov 19 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+javascript液晶时钟
2006/10/09 PHP
修改php.ini不生效问题解决方法(上传大于8M的文件)
2013/06/14 PHP
PHP中替换键名的简易方法示例详解
2014/01/07 PHP
php实现使用正则将文本中的网址转换成链接标签
2014/12/03 PHP
php文件上传类的分享
2017/07/06 PHP
利用PHP扩展Xhprof分析项目性能实践教程
2018/09/05 PHP
js 图片随机不定向浮动的实现代码
2013/07/02 Javascript
jQuery标签编辑插件Tagit使用指南
2015/04/21 Javascript
window.onload使用指南
2015/09/13 Javascript
JavaScript+CSS无限极分类效果完整实现方法
2015/12/22 Javascript
url传递的参数值中包含&时,url自动截断问题的解决方法
2016/08/02 Javascript
AngularJS使用ng-repeat和ng-if实现数据的删选显示效果示例【适用于表单数据的显示】
2016/12/13 Javascript
jQuery is not defined 错误原因与解决方法小结
2017/03/19 Javascript
ES6深入理解之“let”能替代”var“吗?
2017/06/28 Javascript
解决vue-router进行build无法正常显示路由页面的问题
2018/03/06 Javascript
layui radio性别单选框赋值方法
2018/08/15 Javascript
利用Angular2的Observables实现交互控制的方法
2018/12/27 Javascript
微信小程序如何利用getCurrentPages进行页面传值
2019/07/01 Javascript
Django集成百度富文本编辑器uEditor攻略
2014/07/04 Python
web.py获取上传文件名的正确方法
2014/08/26 Python
python实现mysql的单引号字符串过滤方法
2015/11/14 Python
基于Python 装饰器装饰类中的方法实例
2018/04/21 Python
python和shell监控linux服务器的详细代码
2018/06/22 Python
Python中的单下划线和双下划线使用场景详解
2019/09/09 Python
TensorFlow梯度求解tf.gradients实例
2020/02/04 Python
python神经网络编程实现手写数字识别
2020/05/27 Python
python基于win32api实现键盘输入
2020/12/09 Python
python 基于selenium实现鼠标拖拽功能
2020/12/24 Python
CSS3实现全景图特效示例代码
2018/03/26 HTML / CSS
应届生幼儿园求职信
2013/11/12 职场文书
《每逢佳节倍思亲》教后反思
2014/04/19 职场文书
幼儿园小班工作总结2015
2015/04/25 职场文书
歌舞青春观后感
2015/06/10 职场文书
致三级跳运动员加油稿
2015/07/21 职场文书
小学班主任培训心得体会
2016/01/07 职场文书
浅谈Python数学建模之数据导入
2021/06/23 Python