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

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

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.lryc.cn/news/461674.html

相关文章:

  • 简述微服务高可用之Sentinel、Seate
  • 将爱传递 将“服务好”延伸
  • 基于MinIO配置bucket,用于文件下载和浏览
  • Ubuntu 配置 ssh 免密连接、安装Docker、docker-compose
  • C++ -string -常见用法2
  • 为您的 WordPress 网站打造完美广告布局 A5广告单元格插件
  • 前端的AI工具:ChatGPT Canvas与Claude Artifacts对比 -仅仅是OpenAI一个迟来的追赶吗?- 贺星舰五飞试验成功
  • GNU链接器(LD):输出分区类型(NOLOAD、READONLY、DSECT、COPY、INFO、OVERLAY)介绍
  • 【MySQL】表的查询操作——SELECT
  • 天地伟业NVR管理工具EasyNVR平台多个NVR同时管理运行后日志一直在打印error
  • HAL+M4学习记录_7
  • mysql 慢查询日志slowlog
  • 基于AES的遥感图像加密算法matlab仿真
  • MySQL insert 记录后查询是乱码问题分析
  • 字符串算法之AC 自动机(Aho-Corasick Algorithm, 多模式匹配)详细解读
  • YoloV10改进:Block改进|使用ContextAggregation模块改善C2f模块|即插即用
  • 学习之高阶编程str方法
  • FreeRTOS:事件标志组
  • 【高分论文密码】AI赋能大尺度空间模拟与不确定性分析及数字制图
  • 智能摆件(墨水屏)
  • ansible————playbook
  • linux日志分割工具logorate快速验证配置是否有效
  • Unity3D URP画面品质的上限如何详解
  • 风管阻力计算
  • 【redis】redis的多线程和IO多路复用
  • webstorm 编辑器配置及配置迁移
  • Oracle19.25发布,如何打补丁到19.25
  • vue3中,拦截双击事件的第一次点击,写一些逻辑
  • 落地 ZeroETL 轻量化架构,ByteHouse 推出“四个一体化”策略
  • 如何提高LabVIEW编程效率