vue3.2实现AES加密解密,秘钥通过API获取,并混淆秘钥,后端thinkphp

devtools/2025/2/21 4:39:05/

aes.ts文件

import CryptoJS from "crypto-js";
import axios from "axios";export const encrypt = async(data: any) => {let storeKey = sessionStorage.getItem('a')let storeIv:any = sessionStorage.getItem('i')// 如果秘钥或 IV 不存在,尝试获取秘钥if (!storeKey || !storeIv) {await fetchSecretKey(); // 确保秘钥已被获取storeKey = sessionStorage.getItem('a'); // 再次获取秘钥storeIv = sessionStorage.getItem('i'); // 再次获取 IV}if (!storeKey || !storeIv) {throw new Error("秘钥或 IV 不存在.");}let secretKey = storeKey.replace('FiedGSe5fg6', '').replace('F//Eset5fGDet', '')let key = CryptoJS.enc.Base64.parse(secretKey);let replaceIv = storeIv.replace('DGers', '').replace('HrdReK', '')let iv = CryptoJS.enc.Utf8.parse(replaceIv)let srcs = CryptoJS.enc.Utf8.parse(JSON.stringify(data));let encrypted = CryptoJS.AES.encrypt(srcs, key, {iv: iv,mode: CryptoJS.mode.CBC,padding: CryptoJS.pad.Pkcs7,});return encrypted.toString();
};export const decrypt = async(cipherText: any) => {let storeKey = sessionStorage.getItem('a')let storeIv:any = sessionStorage.getItem('i')// 如果秘钥或 IV 不存在,尝试获取秘钥if (!storeKey || !storeIv) {await fetchSecretKey(); // 确保秘钥已被获取storeKey = sessionStorage.getItem('a'); // 再次获取秘钥storeIv = sessionStorage.getItem('i'); // 再次获取 IV}if (!storeKey || !storeIv) {throw new Error("秘钥或 IV 不存在.");}let secretKey = storeKey.replace('FiedGSe5fg6', '').replace('F//Eset5fGDet', '')let key = CryptoJS.enc.Base64.parse(secretKey);let replaceIv = storeIv.replace('DGers', '').replace('HrdReK', '')let iv = CryptoJS.enc.Utf8.parse(replaceIv)const decrypted = CryptoJS.AES.decrypt(cipherText, key, {iv: iv,mode: CryptoJS.mode.CBC,padding: CryptoJS.pad.Pkcs7,});return decrypted.toString(CryptoJS.enc.Utf8);
};// 获取秘钥并存储在会话缓存中
export const fetchSecretKey = async () => {// 检查会话缓存中是否已经有秘钥const cachedKey = sessionStorage.getItem('a');if (cachedKey) {return;}try {// 获取当前时间戳const timestamp = Date.now();const nonce = generateNonce(); // 生成随机 nonce// 临时使用一个默认的签名密钥,可以替换为你后端使用的密钥const tempSecret = 'defaultSecretKey';const signature = generateSignature(tempSecret, timestamp, nonce); // 生成签名// 发送请求获取秘钥,带上签名const response = await axios.post('/api_getKey', {timestamp,nonce,signature,});const rawKey = response.data.aesKey;// 存储到会话缓存中sessionStorage.setItem('a', rawKey);sessionStorage.setItem('i', response.data.iv);} catch (error) {console.error('Error fetching secret key:', error);}
};// 初始化函数,只有第一次项目打开时才执行获取秘钥的逻辑
export const initializeSecretKey = async () => {const secretKey = sessionStorage.getItem('a')if (!secretKey) {await fetchSecretKey(); // 调用获取秘钥的函数}
};// 生成随机字符串作为 nonce
const generateNonce = (): string => {return Math.random().toString(36).substr(2, 15);
};// 生成签名
const generateSignature = (secretKey: string, timestamp: number, nonce: string): string => {const message = `${secretKey}${timestamp}${nonce}`;return CryptoJS.SHA256(message).toString();
};

后端

// 获取加密密钥的 API 接口public function getKey(){// 获取请求参数$timestamp = Request::post('timestamp');$nonce = Request::post('nonce');$signature = Request::post('signature');// 验证签名if (!$this->verifySignature($timestamp, $nonce, $signature)) {return json(['error' => '无效签名或请求已过期'], 403);}// 签名验证通过后,返回密钥(或其他敏感信息)// AES密钥 $secretKey = '秘钥';// 1Ww;w(czeHDyFN@T   DGers  HrdReK$iv = '向量'; return json(['aesKey' => $secretKey,'iv' => $iv]);}// 签名验证private function verifySignature($timestamp, $nonce, $signature){// 检查时间戳是否在合理范围内(例如5分钟内)$now = time() * 1000; // 转换为毫秒if (abs($now - $timestamp) > 5 * 60 * 1000) {return false; // 请求超时}// 重新生成签名$dataToSign = 'defaultSecretKey' . $timestamp . $nonce;$serverSignature = hash('sha256', $dataToSign);// 比较客户端的签名与服务器生成的签名是否一致if ($serverSignature !== $signature) {return false; // 签名不匹配}// 如果签名正确,返回 truereturn true;}

http://www.ppmy.cn/devtools/125226.html

相关文章

Java->排序

目录 一、排序 1.概念 2.常见的排序算法 二、常见排序算法的实现 1.插入排序 1.1直接插入排序 1.2希尔排序(缩小增量法) 1.3直接插入排序和希尔排序的耗时比较 2.选择排序 2.1直接选择排序 2.2堆排序 2.3直接选择排序与堆排序的耗时比较 3.交换排序 3.1冒泡排序…

从零开始搭建一个node.js后端服务项目

目录 一、下载node.js及配置环境 二、搭建node.js项目及安装express框架 三、集成nodemon,实现代码热部署 四、Express 应用程序生成器 一、下载node.js及配置环境 网上很多安装教程,此处就不再赘述了 版本信息 C:\Users\XXX>node -v v20.15.0…

Cesium实时渲染原理浅析

文章目录 背景Cesium.CallbackProperty(callback, isConstant)原理 背景 在地图的几何编辑场景中,我们通常需要快速渲染拖拽后的几何体,如果通过移除要素再添加要素的逻辑去更新,往往会有较低的效率。Cesium Entity是否提供了更高效的更新接…

PHP2-CTFWeb进阶wp-攻防世界13

CTFWeb进阶wp-攻防世界-PHP2 用了御剑和dirsearch扫描了一下发现什么也没扫描到,其它人好像有扫描到的,看了大佬的wp说有index.phps,去查了下。 phps 文件就是 php 的源代码文件,可以当作一个知识点记住,直接访问/index.phps,得…

python-读写Excel:openpyxl-(2)图片、图表、批注、超链接、公式

目录 插入公式 插入时间 添加批注 设置超链接 插入图片 图表 插入公式 sht1.cell(2, 10).value SUM(L1:L39) 插入时间 sht1.cell(4, 4).value datetime.datetime(2020, 2, 23, 10, 20, 00) print(sht1.cell(4, 4).value) 添加批注 from openpyxl.comments import …

【前端知识点】前端笔记

css 引入css文件的文件路径 <!-- 引入外部 CSS 文件 --> <!-- 当前文件所在文件夹目录 --> <link rel"stylesheet" href"./"> <!-- 当前文件所在父文件夹目录 --> <link rel"stylesheet" href"../">j…

iOS swift5 苹果app审核被拒 1.4.1

文章目录 1.被拒2. 官网1.4.1的规定3.如何解决参考博客 1.被拒 准则1.4.1-安全-人身伤害 该应用程序连接到外部医疗硬件&#xff0c;以提供医疗服务。然而&#xff0c;为了遵守准则1.4.1&#xff0c;您必须&#xff1a; -提供来自适当监管机构的文件&#xff0c;证明应用程序…

2014年国赛高教杯数学建模B题创意平板折叠桌解题全过程文档及程序

2014年国赛高教杯数学建模 B题 创意平板折叠桌 某公司生产一种可折叠的桌子&#xff0c;桌面呈圆形&#xff0c;桌腿随着铰链的活动可以平摊成一张平板&#xff08;如图1-2所示&#xff09;。桌腿由若干根木条组成&#xff0c;分成两组&#xff0c;每组各用一根钢筋将木条连接…