vue對文件進行加密,后臺解密后保存

為什么要做加密解密?主要是避免第三方檢測系統(WAF)檢測出文件有問題,但是文件是用戶上傳的,我們控制不了這些文件,所以主要是通過對用戶上傳文件進行加密,后臺解密后存儲。

前端:

1: 安裝crypto-js

npm install crypto-js -save

2: 編寫工具:

import CryptoJS from 'crypto-js'
export function encryptFile(file) {// console.log("32---->: ",CryptoJS.lib.WordArray.random(32).toString(CryptoJS.enc.Hex).substring(0, 32))// console.log("16---->: ", CryptoJS.lib.WordArray.random(16).toString(CryptoJS.enc.Hex).substring(0, 16))const key = CryptoJS.enc.Utf8.parse("16ByteFixedKey12");  // 密鑰需與后端一致?:ml-citation{ref="8" data="citationList"}// console.log("key->: ",key)// const iv = CryptoJS.enc.Utf8.parse("f468c06be3fea831");     // IV需與后端一致?:ml-citation{ref="8" data="citationList"}const iv = CryptoJS.enc.Utf8.parse('Fixed16ByteIV456');     // IV需與后端一致?:ml-citation{ref="8" data="citationList"}// console.log("iv---->: ", iv)return new Promise((resolve, reject) => {const reader = new FileReader();reader.onload = (e) => {// const fileData = CryptoJS.lib.WordArray.create(e.target.result);const fileData = new Uint8Array(e.target.result);const wordArray = CryptoJS.lib.WordArray.create(fileData);const encrypted = CryptoJS.AES.encrypt(wordArray, key, {iv: iv,mode: CryptoJS.mode.CBC,padding: CryptoJS.pad.Pkcs7});// 轉換為二進制Blob并上傳?:ml-citation{ref="4,5" data="citationList"}const encryptedBlob = new Blob([encrypted.toString()], { type: "application/octet-stream" });const encryptedFile = new File([encryptedBlob],file.name,{ type: "application/octet-stream" });encryptedFile.uid = file.uidresolve(encryptedFile); // 返回 Base64 格式密文};reader.readAsArrayBuffer(file.raw);});
}

3: 使用工具

// 收集所有加密的 Promiseconst promises = [];this.$refs.upload.$refs['upload-inner'].fileList.forEach(v => {if (v.status === 'ready') {const encryptPromise = encryptFile(v).then(res => {v.raw = resreturn v; // 返回 Promise 的結果});promises.push(encryptPromise); // 將 Promise 添加到數組}});// 等待所有加密操作完成后再提交Promise.all(promises).then(() => {// console.log("加密后")this.$refs.upload.submit(); // 所有加密完成后提交}).catch(error => {console.error('加密失敗:', error);this.loading = false;});

后臺(grails)

1: 增加包

implementation 'org.bouncycastle:bcprov-jdk15on:1.70'

2: 編寫解密方法:

def decryptFile(def file) {def encryptedFile = file.inputStreamprintln file.originalFilenamebyte[] encryptedData = IOUtils.toByteArray(encryptedFile)// 將 Base64 字符串解碼為原始密文字節數組String encryptedString = new String(encryptedData, "UTF-8")byte[] decodedData = java.util.Base64.getDecoder().decode(encryptedString)// 初始化解密器?:ml-citation{ref="8" data="citationList"}SecretKeySpec secretKey = new SecretKeySpec("16ByteFixedKey12".getBytes("UTF-8"), "AES")IvParameterSpec ivSpec = new IvParameterSpec("Fixed16ByteIV456".getBytes("UTF-8"))Security.addProvider(new BouncyCastleProvider())Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding", "BC")cipher.init(Cipher.DECRYPT_MODE, secretKey, ivSpec)// 執行解密?:ml-citation{ref="8" data="citationList"}return cipher.doFinal(decodedData);
//        byte[] decryptedBytes = cipher.doFinal(decodedData)
//
//        // 保存解密文件?:ml-citation{ref="5" data="citationList"}
//        new File("/Users/zhangjiayu/Desktop/project/files/test.pdf").withOutputStream { it.write(decryptedBytes) }}

注意:

?前后臺使用的key【16ByteFixedKey12】和IV【Fixed16ByteIV456】需要保持一致

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/73550.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/73550.shtml
英文地址,請注明出處:http://en.pswp.cn/web/73550.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

AI 在測試中的應用:從自動化到智能化的未來

閱讀原文 在上一篇中,我們探討了測試左移與右移如何構建質量保障的全流程閉環。現在,我們將目光投向更前沿的領域——AI在測試中的應用。這不僅是技術的演進,更是測試理念的革命:從"自動化執行"到"智能決策"…

Python:計算機二級:簡單應用

文章目錄 簡單應用第一題第二題第三題第四題題型共同特點核心知識點講解解題通用方法步驟 操作的難點1.數據的統計2.數據的篩選1. **條件判斷篩選**2. **結合文件操作篩選**3. **多條件組合篩選** 類似題目其它一題 簡單應用 第一題 題目 在考生文件夾下的PY202.py文件中&…

SQL Server 2022常見問題解答

以下是SQL Server 2022的常見問題解答,按主題分類整理: 一、安裝與升級 SQL Server 2022的系統要求是什么? 支持的操作系統:Windows Server 2016及以上、Linux(Ubuntu 20.04/22.04, RHEL 8/9等)。內存:至少4GB(建議8GB+)。磁盤空間:6GB以上,具體取決于安裝組件。如何…

力扣hot100_二分查找

二分查找 hot100_34.在排序數組中查找元素的第一個和最后一個位置 給你一個按照非遞減順序排列的整數數組 nums,和一個目標值 target。請你找出給定目標值在數組中的開始位置和結束位置。 如果數組中不存在目標值 target,返回 [-1, -1]。 你必須設計…

PostgreSQL詳解

第一章:環境部署與基礎操作 1.1 多平臺安裝詳解 Windows環境 圖形化安裝 下載EnterpriseDB安裝包(含pgAdmin) 關鍵配置項說明: # postgresql.conf優化項 max_connections 200 shared_buffers 4GB work_mem 32MB 服務管理命…

conda install 慢

針對 Solving environment: failed with initial frozen solve. Retrying with flexible solve 錯誤,以下是綜合解決方案: 一、核心解決方法? ?更新 Conda 至最新版本? 舊版本 Conda 的依賴解析算法可能存在缺陷,執行以下命令升級&#…

# 使用自定義Shell腳本hello快速配置Linux用戶賬戶

使用自定義Shell腳本快速配置Linux用戶賬戶 在學校實驗室管理Linux服務器,或者公司小團隊管理服務器時,大家需要一個能隔離自己服務,但是自己又需要對服務器的完整權限的情形。創建和配置用戶賬戶是一項常見但繁瑣的任務。特別是當你需要頻繁…

Unity Animation的其中一種運用方式

Animation是Unity的舊的動畫系統,先說目的,其使用是為了在UI中播放動效,并且在動效播放結束后接自定義事件而設計的 設計的關鍵點在于,這個腳本不是通過Animation直接播放動畫片段,而是通過修改AnimationState的nor…

matplotlib——南丁格爾玫瑰

南丁格爾玫瑰圖(Nightingale Rose Chart),是一種特殊形式的柱狀圖,它以南丁格爾(Florence Nightingale)命名,她在1858年首次使用這種圖表來展示戰爭期間士兵死亡原因的數據。 它將數據繪制在極坐…

TensorFlow面試題及參考答案

目錄 什么是 TensorFlow 的計算圖?詳細描述 TensorFlow 計算圖的組成結構(節點、邊、會話) 它與動態圖(Eager Execution)的區別是什么?TensorFlow 靜態計算圖與動態圖(Eager Execution)的區別及適用場景是什么? 解釋張量(Tensor)的概念及其在 TensorFlow 中的作用…

6.go語言函數

Go語言中的函數是組織代碼的最小單元,用于封裝一段代碼,完成特定的功能。函數的使用可以減少代碼冗余,提高代碼的可讀性和可維護性。 函數的基本定義和語法 在Go語言中,定義一個函數的基本語法如下: func functionN…

SpringCould微服務架構之Docker(4)

Docker ce是社區版。 安裝docker之前,先安裝yum-util 。 安裝docker之前,一定要先關閉防火墻。

Keepalived 實現高可用方案

Keepalived簡介 ?Keepalived? 是一個基于 ?VRRP(Virtual Router Redundancy Protocol)協議?的高可用性解決方案,主要用于實現?服務故障自動切換(Failover)和負載均衡?。通過管理虛擬 IP(VIP&#xf…

WPS JS宏編程教程(從基礎到進階)--第二部分:WPS對象模型與核心操作

第二部分:WPS對象模型與核心操作 WPS對象的屬性、方法、集合 工作簿對象常用表達方式工作表對象常用表達方式單元格對象常用表達方式 單元格操作實戰 單元格復制與重定位單元格偏移與尺寸調整 顏色設置專題 索引顏色與RGB顏色按條件動態設置單元格顏色 第二部分&…

基于DrissionPage的TB商品信息采集與可視化分析

一、項目背景 隨著電子商務的快速發展,淘寶作為中國最大的電商平臺之一,擁有海量的商品信息。這些數據對于市場分析、用戶行為研究以及競爭情報收集具有重要意義。然而,由于淘寶的反爬蟲機制和復雜的頁面結構,直接獲取商品信息并不容易。尤其是在電商行業高速發展的今天,商…

【003安卓開發方案調研】之ReactNative技術開發安卓

基于2025年最新行業動態和搜索資料,以下是針對國內使用React Native(RN)開發安卓應用的深度分析: 一、技術成熟度評估 1. 核心架構升級 新架構全面普及:2024年起,React Native的 新架構(Fabri…

JS數組方法

數組方法 一、數組 JavaScript 數組的大小是可調整的,并且可以包含不同 數據類型。(當不需要這些特性時,請使用 類型數組。) 注:JavaScript 類型數組是類似數組的對象,它提供了一種在內存緩沖區中讀取和寫…

【一起學Rust | Tauri2.0框架】深入淺出 Tauri 2.0 應用調試:從新手到專家的蛻變

前言 Tauri 是一款備受矚目的跨平臺桌面應用開發框架,它允許開發者使用 Web 技術棧(HTML、CSS、JavaScript)構建高性能、安全的原生應用。Tauri 2.0 的發布帶來了諸多令人興奮的新特性和改進,進一步提升了開發體驗和應用性能。然…

Python項目-基于Python的網絡爬蟲與數據可視化系統

1. 項目簡介 在當今數據驅動的時代,網絡爬蟲和數據可視化已成為獲取、分析和展示信息的重要工具。本文將詳細介紹如何使用Python構建一個完整的網絡爬蟲與數據可視化系統,該系統能夠自動從互聯網收集數據,進行處理分析,并通過直觀…

TCP/IP三次握手的過程,為什么要3次?

一:過程 第一次(SYN): 客戶端發送一個帶有SYN標志的TCP報文段給服務器,設置SYN1,并攜帶初始序列號Seqx(隨機值),進入SYN_SENT狀態。等待服務器相應。 第二次&#xff08…