crypto前后端密码加密加盐,vue3 + nodejs koa+mysql2

本文介绍了如何在前后端项目中使用Crypto库进行安全的密码处理,包括前端使用哈希函数处理密码,后端生成salt并加盐生成数据库存储的加密密码,以及登录时的密码验证流程。
摘要由CSDN通过智能技术生成

前后端install完crypto后,前置:1.salt后端生成。2.前后端使用同一套加密。

先从注册开始:

注册

整体思路:

1.前端密码哈希处理后发给后端

2.后端生成salt,后端将前端发来的代码和salt结合(加盐)生成最终密码存数据库

3.注意这个生成的密码和salt都需要存数据库。

代码:

前端vue

1.创建一个utils/password-handle.js进行前端密码处理

// 哈希处理密码
export async function hashPassword(password) {
  const encoder = new TextEncoder()
  const data = encoder.encode(password)
  const hashBuffer = await crypto.subtle.digest('SHA-256', data)
  const hashArray = Array.from(new Uint8Array(hashBuffer))
  const hashedPassword = hashArray.map(byte => byte.toString(16).padStart(2, '0')).join('')
  return hashedPassword
}

2.发请求前用上面的hashPassword哈希处理原password再发给后端。

import { hashPassword } from '@/utils/password-handle'
import { register } from '@/api/sys'// 引入接口

// 注册函数
    async  register(context, userInfo) {
      const { name, password } = userInfo
      const hashedPassword = await hashPassword(password)
      return new Promise((resolve, reject) => {
        register({//发请求
          name,
          password: hashedPassword
        })
          .then(data => {
            resolve()
          })
          .catch(err => {
            reject(err)
          })
      })
    }
后端nodejs(koa)

1.也是建一个工具

const crypto = require('crypto');

// 生成随机盐值
function generateSalt() {
  return crypto.randomBytes(16).toString('hex');
}

// 使用盐值和密码生成哈希密码
function generateHash(password, salt) {
  const hashedPassword = crypto
    .pbkdf2Sync(password, salt, 10000, 64, 'sha512')
    .toString('hex');
  return hashedPassword;
}

module.exports = {
  generateSalt,
  generateHash,
};

2.处理密码中间件

const handlePassword = async (ctx, next) => {
  const { password } = ctx.request.body;
  const salt = generateSalt(); // 生成随机盐值
  const hashedPassword = generateHash(password, salt); // 盐值+密码生成哈希密码
  ctx.request.body.salt =salt;
  ctx.request.body.hashedPassword = hashedPassword;
  await next();
};

3.controller

service省略

async create(ctx, next) {
        //获取用户请求传递的参数
        const user = ctx.request.body;
        //储存(查询)数据
        const result = await service.create(user);
        //返回数据
        ctx.body = result[0];
    }

登录

整体思路:

前端还是哈希处理后发给后端,然后根据请求参数去数据库取已经存的salt和password,之后前端的hash+取出的salt重新生成一次密码generateHash(password, salt),看是否与数据库里存的密码匹配。

验证登录中间件:

service省略

const verifyLogin = async (ctx, next) => {
  const { name, password ,id} = ctx.request.body;
  //判断姓名密码邮箱不为空
 ...
  //判断用户在没在数据库
  const result = await service.getUserById(id);
  const user = result[0];
  if (!user) {
    const error = new Error(errorType.USER_DOES_NOT_EXISTS);
    return ctx.app.emit("error", error, ctx);
  }
  //判断密码是不是一致
  // 对前端传来的哈希后的密码进行处理,生成哈希密码
  const hashedPassword = generateHash(password, user.salt);
  // 对比新生成的password和已经存的password
  if (hashedPassword === user.password) {
    // 登录成功
    ctx.user = user;
    await next();
  } else {
    // 登录失败
    const error = new Error(errorType.PASSWORD_IS_INCORRENT);
    return ctx.app.emit("error", error, ctx);
  }
};

如有问题恳请指正

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值