当前位置: 首页 > article >正文

node项目前后端密码加密传输及存储方案

前端:使用crypto-js库的SHA256算法,包含用户注册时使用的邮箱加上自定义的secret key生成盐值,接着使用PBKDF2算法进行加密。

import CryptoJS from "crypto-js";

export const encryptPassword = (email: string, password: string): string => {
  // 生成盐值
  const SALT = CryptoJS.SHA256(
    email,
    import.meta.env.SECRET_KEY
  ).toString();

  // 使用 PBKDF2 进行密码加密
  const key = CryptoJS.PBKDF2(password, SALT, {
    keySize: 256 / 32,
    iterations: 1000,
  });
  return key.toString(CryptoJS.enc.Base64);
};

后端:创建用户时,使用bcryptjs的hashSync对密码进行哈希加密,并存入数据库。用户登录时,再用compareSync对密码进行解密。

import * as bcrypt from 'bcryptjs';

export class UsersService {
  async create(createUserDto) {
    // 创建新用户 - 进行哈希加密
    const hashedPassword = bcrypt.hashSync(createUserDto.password, 10);
    return //略
  }

  async validatePassword(user, password) {
    try {
      // 使用 bcrypt 比较原始密码和存储的哈希密码
      return bcrypt.compareSync(password, user.passwordHash);
    } catch (error) {
      console.error('Password validation error:', error);
      return false;
    }
  } 
}

方案理由:

由于前端使用HTTPS进行数据传输,密码数据很难被窃取,即使被窃取,也只能获得加密后的密码。

而后端依然拥有最后一道防线,即使能够窃取数据库数据,破解bcrypt.hashSync生成的哈希值也是几乎无法完成的任务。


http://www.kler.cn/a/569118.html

相关文章:

  • 【终篇】基于C++的通讯录管理系统(完整源码)
  • 7-1JVMCG垃圾回收
  • 【西瓜书《机器学习》前三章内容通俗理解】
  • Golang语言特性
  • 【零基础C语言】第四节 数组
  • 网页制作09-html,css,javascript初认识のhtml如何使用表单
  • STM32 微控制器库RCC_ClkInitTypeDef结构参数介绍
  • (十一)基于vue3+mapbox-GL实现模拟高德实时导航轨迹播放
  • C# 类库打包dll文件
  • 数据库原理与使用基础教程
  • 安全测试之五:SQL Server注入漏洞几个实例
  • Linux学习笔记1
  • 差分矩阵问题
  • 什么是预训练语言模型下游任务?
  • 创建一个MCP服务器,并在Cline中使用,增强自定义功能。
  • 通俗解释机器学习中的召回率、精确率、准确率
  • 学习C++常用词汇词组及缩写汇总
  • 腿足机器人之十四-强化学习SAC算法
  • 突破Ajax跨域困境,解锁前端通信新姿势
  • CMake高级特性:构建复杂项目的核心技巧