文章目录
Vue3+Nest.js+AES数据传输安全加固方案设计与实现
🌐 我的个人网站:乐乐主题创作室
引言
在当今Web应用开发中,前后端分离架构已成为主流。Vue3作为前端框架的佼佼者,与Nest.js这一强大的Node.js后端框架结合,能够构建高效的企业级应用。然而,数据在前后端传输过程中的安全性问题不容忽视。本文将详细介绍如何利用AES加密算法在Vue3和Nest.js之间构建安全的数据传输通道。
一、数据传输安全背景与挑战
1.1 常见Web安全威胁
- 中间人攻击(MITM):攻击者在通信双方之间拦截数据
- 数据窃听:未加密的数据容易被网络嗅探工具捕获
- 数据篡改:传输中的数据可能被恶意修改
1.2 HTTPS的局限性
虽然HTTPS提供了传输层安全,但仍存在以下问题:
- 服务器端可以查看明文数据
- 某些场景下可能配置不当导致降级攻击
- 不保护数据在应用层的安全
1.3 应用层加密的必要性
在HTTPS基础上增加应用层AES加密可以:
- 实现端到端加密
- 防止服务器管理员直接查看敏感数据
- 满足更高级别的安全合规要求
二、技术选型与方案设计
2.1 AES算法选择
采用AES-256-CBC模式,原因如下:
- 256位密钥提供更强的安全性
- CBC模式需要IV(初始化向量),增加安全性
- 兼容性好,前后端实现一致
2.2 密钥管理方案
采用分层密钥管理策略:
- 主密钥:存储在环境变量中,不直接用于加密
- 会话密钥:每次会话动态生成,用主密钥加密后传输
- 数据密钥:用于实际数据加密,定期轮换
2.3 整体架构设计
[Vue3前端] <-HTTPS-> [Nest.js后端]
| |
[AES加密模块] [AES解密模块]
| |
[业务数据] [业务数据]
三、前端Vue3实现
3.1 加密工具类封装
// src/utils/crypto.js
import CryptoJS from 'crypto-js';
const AES_KEY = process.env.VUE_APP_AES_KEY; // 从环境变量获取密钥
const IV_LENGTH = 16; // AES块大小
/**
* AES加密函数
* @param {string} data 待加密数据
* @param {string} key 加密密钥
* @returns {string} 加密后的Base64字符串
*/
export function encrypt(data, key = AES_KEY) {
try {
const iv = CryptoJS.lib.WordArray.random(IV_LENGTH);
const encrypted = CryptoJS.AES.encrypt(
JSON.stringify(data),
CryptoJS.enc.Utf8.parse(key),
{
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
}
);
// 将IV和密文拼接后返回
return iv.concat(encrypted.ciphertext).toString(CryptoJS.enc.Base64);
} catch (error) {
console.error('Encryption error:', error);
throw new Error('Encryption failed');
}
}
/**
* AES解密函数
* @param {string} encryptedData 加密数据
* @param {string} key 解密密钥
* @returns {object} 解密后的对象
*/
export function decrypt(encryptedData, key = AES_KEY) {
try {
const encryptedDataBytes = CryptoJS.enc.Base64.parse(encryptedData);
const iv = encryptedDataBytes.clone();
iv.sigBytes = IV_LENGTH;
iv.clamp();
const ciphertext = encryptedDataBytes.clone();
ciphertext.words.splice(0, IV_LENGTH / 4);
ciphertext.sigBytes -= IV_LENGTH;
const decrypted = CryptoJS.AES.decrypt(
{
ciphertext: ciphertext },
CryptoJS.enc.Utf8.parse(key),
{
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
}
);
return JSON.parse(decrypted.toString(CryptoJS.enc.Utf8));
} catch (error) {
console.error('Decryption error:', error);
throw new Error('Decryption failed');
}
}
3.2 Axios请求拦截器配置
// src/utils/request.js
import axios from 'axios';
import {
encrypt } from './crypto';
const service = axios.create({
baseURL: process.env.VUE_APP_BASE_API,
timeout: 10000
});
// 请求拦截器 - 加密请求数据
service