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与图片美化checkbox和radio控件的代码(打包下载)
Nov 11 Javascript
jquery获取css中的选择器(实例讲解)
Dec 02 Javascript
Javascript window对象详解
Nov 12 Javascript
jQuery操作cookie方法实例教程
Nov 25 Javascript
bootstrap警告框使用方法解析
Jan 13 Javascript
jQuery实现frame之间互通的方法
Jun 26 jQuery
webpack组织模块打包Library的原理及实现
Mar 10 Javascript
全面了解JavaScript的作用域链
Apr 03 Javascript
JavaScript如何获取一个元素的样式信息
Jul 29 Javascript
ES6中异步对象Promise用法详解
Jul 31 Javascript
微信小程序仿淘宝热搜词在搜索框中轮播功能
Jan 21 Javascript
基于vue中的scoped坑点解说
Sep 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
把从SQL中取出的数据转化成XMl格式
2006/10/09 PHP
使用apache模块rewrite_module (转)
2007/02/14 PHP
php木马webshell扫描器代码
2012/01/25 PHP
PHP微框架Dispatch简介
2014/06/12 PHP
PHP无限极分类函数的实现方法详解
2017/04/15 PHP
js onpropertychange输入框 事件获取属性
2009/03/26 Javascript
纯Javascript实现Windows 8 Metro风格实现
2013/10/15 Javascript
js全选实现和判断是否有复选框选中的方法
2015/02/17 Javascript
jquery限定文本框只能输入数字(整数和小数)
2016/01/08 Javascript
Node.js静态文件服务器改进版
2016/01/10 Javascript
Easyui Datagrid自定义按钮列(最后面的操作列)
2017/07/13 Javascript
JS实现的加减乘除四则运算计算器示例
2017/08/09 Javascript
ES6 javascript的异步操作实例详解
2017/10/30 Javascript
基于Vuejs的搜索匹配功能实现方法
2018/03/03 Javascript
node打造微信个人号机器人的方法示例
2018/04/26 Javascript
vue工程全局设置ajax的等待动效的方法
2019/02/22 Javascript
antd-mobile ListView长列表的数据更新遇到的坑
2020/04/08 Javascript
聊聊vue 中的v-on参数问题
2021/01/29 Vue.js
python 文件与目录操作
2008/12/24 Python
Python常用知识点汇总
2016/05/08 Python
[原创]使用豆瓣提供的国内pypi源
2017/07/02 Python
python利用正则表达式排除集合中字符的功能示例
2017/10/10 Python
Python代码块批量添加Tab缩进的方法
2018/06/25 Python
对python 中re.sub,replace(),strip()的区别详解
2019/07/22 Python
基于python 取余问题(%)详解
2020/06/03 Python
Python Matplotlib简易教程(小白教程)
2020/07/28 Python
基于css3实现漂亮便签样式
2013/03/18 HTML / CSS
Html5中localStorage存储JSON数据并读取JSON数据的实现方法
2017/02/13 HTML / CSS
美国体育用品在线:Modell’s Sporting Goods
2018/06/07 全球购物
META-INF文件夹中的MANIFEST.MF的作用
2016/06/21 面试题
一套中级Java程序员笔试题
2015/01/14 面试题
大学毕业生通用求职信
2013/09/28 职场文书
中药专业毕业自荐书范文
2014/02/08 职场文书
教师岗位说明书
2015/09/30 职场文书
CSS预处理框架——Stylus
2021/04/21 HTML / CSS
python批量创建变量并赋值操作
2021/06/03 Python