视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001 知道1 知道21 知道41 知道61 知道81 知道101 知道121 知道141 知道161 知道181 知道201 知道221 知道241 知道261 知道281
问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501
Express下采用bcryptjs进行密码加密的方法
2020-11-27 22:19:57 责编:小采
文档

前几天利用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);
 }
})

下载本文
显示全文
专题