使用bcrypt模块对用户密码进行散列加密(node教程)

为啥选择Bcrypt

Bcrypt 有两个特点

  1. 每一次 HASH 出来的值不一样

  2. 计算非常缓慢

    因此使用 Bcrypt 进行加密后,攻击者想要使用算出 M2 成本变得不可接受。但代价是应用自身也会性能受到影响,不过登录行为并不是随时在发生,因此能够忍受。对于攻击者来说,需要不断计算,让攻击变得不太可能。

1.安装

npm i bcrypt

2.使用,初始化一个node服务器,开启mongodb,项目文件为server

1.创建models/AdminUser.js文件,使用bcrypt模块

	const mongoose = require('mongoose')
	const schema = new mongoose.Schema({
	  name: {
	    type: String
	  },
	  password: {
	    type: String,
	    //set函数是对保存该字段时对值进行修改,传入参数为字段内容
	    set (val) {
	      //hashSync()第一个参数为需要加密的内容,第二个参数是加密后的字段
	      return require('bcrypt').hashSync(val, 10)
	    }
	  }
	})
	module.exports = mongoose.model('AdminUser', schema)

2.需要保存的地址,创建plugins/db.js文件

	module.exports= app => {
	  const mongoose = require('mongoose')
	  //localhost:27017是本地数据库地址,node-vue-moba是总名字
	  const database_name = 'mongodb://localhost:27017/node-vue-moba'
	  mongoose.connect(database_name, {
	    userNewUrlParser: true
	  })
	}

3.修改index.js文件

//引入express模块
const express = require('express')
// 实例化
const app = express()
app.use(require('cors')())
app.use(express.json())
// 引入db.js,并使用app函数
require('./plugins/db')(app)
//导入admin,并使用里面的app的函数
require('./routes/admin')(app)
// 接口
app.listen(3000, () => {
  console.log('http://localhost:3000')
})

4.创建routes/admin/index.js文件

// 后台管理系统路由
module.exports = app => {
  const express = require('express')
  // 挂载路由
  const router = express.Router({
    mergeParams: true
  })
  //写post接口
  router.post('/', async (req, res) => {
    console.log(req.body + '增')
    const model = await req.Model.create(req.body)
    console.log(model)
    res.send(model)
  })
  //查询分类列表
  router.get('/', async (req, res) => {
    //每页条数
    const limit = parseInt(req.query.limit)
    //跳过的条数
    const skip = (req.query.page - 1) * limit
    if (limit) {
      //查询内容,//分页搜索
      const model = await req.Model.find().skip(skip).limit(limit)
      //查询总数
      const total = await req.Model.find().count()
      res.send({
        data: model,
        total: total
      })
    }
  })
  //根据分类id查找
  router.get('/:id', async (req, res) => {
    const model = await req.Model.findById(req.params.id)
    res.send(model)
  })
  //根据分类id修改
  router.put('/:id', async (req, res) => {
    await req.Model.findByIdAndUpdate(req.params.id, req.body)
    res.send({
      success: true
    })
  })
  //删除分类
  router.delete('/:id', async (req, res) => {
    const model = await req.Model.findByIdAndDelete(req.params.id,req.body)
    res.send(model)
  })
  app.use('/admin/api/rest/:resource', async(req, res, next) => {
    //统一设置 inflection是安装包,进行类名大小写转换,req.params.resource是客户端api接口rest/后面的参数
    //这样可以进行多个模板的套用
    const modelName = require('inflection').classify(req.params.resource)
    console.log(modelName)
    req.Model = require(`../../models/${modelName}`)
    next()
  }, router)
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值