免费国产精品自在自线-91精品国产色综合久久久浪潮-99热久久免费频精品-国产精品国模在线观看-久久亚洲国产精品成人?V秋霞-久久国产一级A片免费播放-亚洲国产欧洲综合97久久-久久国产白嫩美女呻吟高潮

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運營的一線實戰(zhàn)洞察。

Vue2項目實戰(zhàn):WebUploader結(jié)合AES+RSA實現(xiàn)文件加密上傳

Vue2項目實戰(zhàn):WebUploader結(jié)合AES+RSA實現(xiàn)文件加密上傳 1. 項目概述與技術(shù)選型思考1.1 為什么還在vue2里選百度WebUploader先說結(jié)論在2024年還在維護(hù)vue2項目說明這是個存量系統(tǒng)大概率是企業(yè)后臺、政務(wù)平臺或者金融類管理系統(tǒng)。這類系統(tǒng)最大的特點就是不能隨便動底層架構(gòu)但安全要求又逐年升級所以“老框架老插件新加密要求”的組合特別典型。百度WebUploader這個插件很多人一聽就覺得過時了。但坦白講它在企業(yè)級場景里依然有不可替代的價值分片上傳、斷點續(xù)傳、并發(fā)限制、MD5秒傳這些能力現(xiàn)在很多前端上傳組件要折騰半天才能實現(xiàn)WebUploader開箱即用。尤其在內(nèi)網(wǎng)環(huán)境部署的系統(tǒng)里性能穩(wěn)定、兼容性好還不需要額外依賴這幾點到現(xiàn)在依然是硬需求。我這次接手的項目就是個典型場景vue2.6 element-ui WebUploader的存量后臺需要把附件上傳模塊從裸HTTP明文傳輸升級為加密存儲。需求拆開看其實有兩層前端在文件上傳前先做加密不能明文走網(wǎng)絡(luò)后端存儲時保留密文防止拖庫后文件內(nèi)容直接泄露1.2 加密方案選型的核心矛盾最初產(chǎn)品提需求時人員想的是“上傳前用密碼加密一下就行”但真正落地要考慮的事情就多了。核心矛盾在于文件體積不同加密策略必須分層一套方案打天下是不現(xiàn)實的。我測試過幾種路線單純用JSEncryptRSA加全部文件內(nèi)容幾百KB的小文件還行上MB就卡死。RSA是非對稱加密密鑰長、運算重不適合大量數(shù)據(jù)。單純用CryptoJS的AES加速度沒問題但密鑰寫死在前端等于脫褲子放屁抓包拿到密鑰就能解密。AES RSA混合AES負(fù)責(zé)加密文件內(nèi)容RSA負(fù)責(zé)把AES的密鑰加密后傳給后端。既解決性能問題也解決密鑰分發(fā)問題。這是主流方案。最后定的是AES-256 RSA-2048的混合加密。AES用CBC模式PKCS7填充密鑰隨機生成RSA公鑰來自后端接口私鑰永遠(yuǎn)不出后端。這樣前端就算被完全逆向也拿不到解密能力。接下來我先說封裝細(xì)節(jié)然后給完整代碼再講全鏈路聯(lián)調(diào)和坑。這個順序能幫你先建立整體認(rèn)知再抄作業(yè)的時候就不容易抄歪。2. 整體設(shè)計與技術(shù)鏈路拆解2.1 前端加密的完整鏈路整個加密上傳的流程我畫了個流程圖在腦子里文字描述是這樣的用戶選擇文件WebUploader接管文件隊列上傳前觸發(fā)before-send-file鉤子這里做加密每個文件隨機生成一個AES密鑰32字節(jié)用CryptoJS的AES-CBC加密文件二進(jìn)制內(nèi)容得到密文用后端下發(fā)的RSA公鑰加密AES密鑰得到密鑰密文把密文文件和密鑰密文一起post到后端后端收到后用RSA私鑰解出AES密鑰再用AES密鑰解文件內(nèi)容按業(yè)務(wù)需要存儲這個鏈路里有個很容易被忽略的關(guān)鍵點不是所有場景都需要后端解出明文再存儲。如果需求是“后端只存密文永不讀明文”那后端不需要解密只需要把密文和密鑰分開存查詢時把密文交給有權(quán)限的前端自行解密。但這個項目的要求是“存儲時加密使用時可控”所以我讓后端解密后以密文形式入庫只有業(yè)務(wù)層通過接口訪問時才在內(nèi)存中臨時解密。這樣數(shù)據(jù)庫被拖了也只是密文。2.2 為什么要AES和RSA配合用生活類比來說AES像一把房間鑰匙加密解密都快適合處理大件行李但房間鑰匙不能直接交給別人萬一被復(fù)制就完了。RSA像個保險箱慢但安全適合送“房間鑰匙”這份小物件。具體到我們的鏈路AES密鑰是隨機生成的每次上傳都不同即使這次被破解也影響不了歷史文件RSA公鑰加密AES密鑰保證只有持RSA私鑰的后端才能取出AES密鑰網(wǎng)絡(luò)抓包只能看到一堆無意義的base64字符文件內(nèi)容加密后再進(jìn)行Base64編碼傳輸這個過程繞開了WebUploader默認(rèn)的FormData裸傳行為可以在過程中插入自定義校驗邏輯2.3 WebUploader與vue2生命周期的綁定方式百度WebUploader原生是基于jQuery的但vue2項目里引入它要處理兩個問題WebUploader實例的創(chuàng)建和銷毀要和組件生命周期保持一致WebUploader內(nèi)部操作的是真實DOMpicker按鈕需要避開vue的虛擬DOM管理我的做法是把上傳封裝成一個獨立的Uploader.vue組件在使用它的父組件里傳入上傳參數(shù)WebUploader實例在mounted中創(chuàng)建在beforeDestroy中手動銷毀。這樣既隔離了生命周期又能讓W(xué)ebUploader和vue2的數(shù)據(jù)流通過props和$emit對接。具體來說封裝的好處有三點如果項目里有多個頁面需要上傳文件不用重復(fù)初始化WebUploader傳不同的配置就行WebUploader實例的清理邏輯destroy、解綁事件集中在組件內(nèi)部不會因為頁面切換導(dǎo)致內(nèi)存泄漏加密邏輯CryptoJS相關(guān)只在這個組件里被引用一旦出問題可以快速定位3. 核心細(xì)節(jié)解析與工具選型3.1 依賴引入的細(xì)節(jié)控制項目用的依賴版本很關(guān)鍵直接貼出來vue2.6.14webuploader0.1.9直接npm安裝或者用官方dist文件也可以crypto-js4.1.1jsencrypt3.3.2這里提個坑WebUploader在npm上的包名叫webuploader但安裝之后不能直接import它需要掛window。在vue2 CLI項目里我是在index.html里通過script標(biāo)簽引的CDN或本地文件這樣能直接訪問window.WebUploader避免webpack打包CommonJS時出現(xiàn)“WebUploader is not defined”的錯誤。CryptoJS的引入方式import CryptoJS from crypto-js這個庫是純JavaScript實現(xiàn)的不管在瀏覽器還是webpack環(huán)境都穩(wěn)。JSEncrypt也一樣import JSEncrypt from jsencrypt需要額外注意一點CryptoJS處理中文文件名時直接encrypt會報錯或亂碼。這是因為CryptoJS默認(rèn)把字符串按UTF-8編碼處理而文件名有時候編碼方式不同。我是在加密前統(tǒng)一將文件名encodeURIComponent轉(zhuǎn)了一下加密后拿到字節(jié)數(shù)組再拼接然后在FileName字段中單獨加密傳輸避免文件名亂碼的問題。3.2 加密參數(shù)配置的“為什么”先看核心加密參數(shù)配置const AESKey CryptoJS.lib.WordArray.random(32) // 32字節(jié) 256位 const AESIV CryptoJS.lib.WordArray.random(16) // 16字節(jié) 128位為什么要隨機生成AESIV因為CBC模式下相同的明文和相同的密鑰如果IV相同產(chǎn)生的密文也是相同的。攻擊者可以從“相同密文”推斷出“相同明文”的信息這叫做確定性加密漏洞。每次隨機IV即使同一個文件上傳了兩次密文也完全不一樣這就增加了破解難度。CBC模式和PBKDF2相關(guān)的參數(shù)我也給一下推薦值密鑰長度256位32字節(jié)IV長度128位16字節(jié)填充PKCS7CryptoJS默認(rèn)模式CBC編碼Base64CryptoJS在代碼里通過這種方式設(shè)置const encrypted CryptoJS.AES.encrypt( CryptoJS.enc.Utf8.parse(plainText), AESKey, { iv: AESIV, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 } )3.3 文件內(nèi)容加密的兩種姿勢WebUploader在before-send-file鉤子里能拿到file對象但拿到的file是WebUploader包裝后的對象。加密時有兩種處理方式第一種通過FileReader把file讀取為ArrayBuffer然后轉(zhuǎn)成WordArray交給CryptoJS處理const reader new FileReader() reader.onload function(e) { const arrayBuffer e.target.result const wordArray CryptoJS.lib.WordArray.create(arrayBuffer) const encrypted CryptoJS.AES.encrypt(wordArray, AESKey, { iv: AESIV, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 }) // 后續(xù)將 encrypted.toString() 作為上傳內(nèi)容 } reader.readAsArrayBuffer(file)這種方式適合小文件和中等文件因為它是把整個文件讀進(jìn)內(nèi)存再加密文件太大的話前端會有內(nèi)存壓力。第二種如果文件超大比如視頻、壓縮包WebUploader本身支持分片上傳但分片加密會引入“每個分片需要獨立IV和密鑰”的復(fù)雜度。這個項目里我暫時沒做分片級加密因為實際業(yè)務(wù)上傳的文件平均都在1MB以內(nèi)ArrayBuffer方式完全能扛住。如果你接手的是要傳大片視頻的項目我給個建議每個分片用相同的密鑰但每個分片隨機生成IV傳輸時把IV和分片密文一起發(fā)給后端后端按分片索引依次解密后拼接。這樣能把“加密”和“斷點續(xù)傳”兩個需求同時滿足分片加密的代碼量其實只多幾十行。3.4 非對稱加密保護(hù)和字段封裝生成了AES密鑰之后用JSEncrypt做RSA加密const encryptor new JSEncrypt() encryptor.setPublicKey(publicKey) // 后端下發(fā)的RSA公鑰 const encryptedKey encryptor.encrypt(AESKey.toString(CryptoJS.enc.Base64))注意這里加密的對象是Base64編碼后的AESKey字符串。AESKey是WordArray對象直接傳給JSEncrypt會出問題先轉(zhuǎn)成Base64字符串是穩(wěn)妥的。上傳時把下面幾個字段封裝成一個JSON對象fileNameencodeURIComponent后的原始文件名encryptedKeyRSA加密后的AES密鑰Base64encryptedIVAES的IV這個我直接拼接在密文頭部或者單獨字段看后端解析習(xí)慣contentAES加密后的文件內(nèi)容Base64timestamp時間戳可以防止重放攻擊后端可選校驗這段JSON用一個自定義header傳給后端或者作為FormData的一個字段。我在實際項目里用的是FormData方式因為后端已經(jīng)有一套MultipartFile接收邏輯直接多加了幾個字段改動量小。這里有個實戰(zhàn)技巧如果content特別大比如10MB不要直接把整個JSON塞進(jìn)FormData的普通字段里而是把content作為單獨的文件字段其他信息放在普通字段。這樣后端拿到MultipartFile的時候就是已經(jīng)加密的密文文件存儲邏輯不需要改動太多。我項目里就是這么處理的把“加密后的內(nèi)容”重新包裝成一個Blob文件讓W(xué)ebUploader上傳這個Blob文件。4. 實操過程與完整實現(xiàn)4.1 后端下發(fā)RSA公鑰的接口約定第一步需要后端提供一個公鑰接口。這個接口不涉及敏感操作可以設(shè)計為公開接口返回格式如下{ code: 0, data: { publicKey: -----BEGIN PUBLIC KEY-----\nMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC... } }在vue2項目的api模塊里加一個方法// api/upload.js import request from /utils/request export function getRsaPublicKey() { return request({ url: /api/system/public-key, method: get }) }這里的request就是axios封裝實例不用改底層邏輯正常調(diào)用就行。4.2 完整Uploader.vue組件代碼下面是這個項目的核心組件我按實際代碼精簡后給出。先看完整結(jié)構(gòu)再逐段解釋。template div classuploader-container div iduploader-picker classuploader-picker選擇文件/div div iduploader-list classuploader-list/div /div /template script import CryptoJS from crypto-js import JSEncrypt from jsencrypt import { getRsaPublicKey } from /api/upload export default { name: EncryptUploader, props: { accept: { type: String, default: */* }, maxSize: { type: Number, default: 20 * 1024 * 1024 }, uploadUrl: { type: String, default: /api/upload } }, data() { return { uploader: null, rsaPublicKey: } }, async mounted() { const res await getRsaPublicKey() this.rsaPublicKey res.data.publicKey this.initUploader() }, methods: { initUploader() { const _this this this.uploader window.WebUploader.create({ pick: { id: #uploader-picker, multiple: false }, accept: { title: Files, extensions: this.accept }, server: this.uploadUrl, fileVal: file, auto: false, chunked: false, duplicate: true, resize: false, compress: false, formData: { // 這里不寫死業(yè)務(wù)字段因為要動態(tài)放入加密數(shù)據(jù) } }) this.uploader.on(before-send-file, function(file) { return _this.handleBeforeSendFile(file) }) this.uploader.on(uploadSuccess, function(file, response) { _this.$emit(upload-success, file, response) }) this.uploader.on(uploadError, function(file, reason) { _this.$emit(upload-error, file, reason) }) this.uploader.on(error, function(type) { if (type Q_EXCEED_SIZE_LIMIT) { _this.$message.error(文件大小超出限制) } _this.$emit(upload-type-error, type) }) this.uploader.on(uploadComplete, function(file) { _this.$emit(upload-complete, file) }) }, handleBeforeSendFile(file) { // 返回一個PromiseWebUploader會等待它resolve后再繼續(xù) return new Promise((resolve, reject) { const reader new FileReader() reader.onload (event) { try { const arrayBuffer event.target.result const result this.encryptFile(arrayBuffer, file.name) // WebUploader通過file對象的一個擴(kuò)展屬性把加密后的內(nèi)容傳出去 file.encryptedBlob new Blob([result.content], { type: application/octet-stream }) file.encryptedFileName result.encryptedFileName file.encryptedKey result.encryptedKey file.encryptedIv result.encryptedIv file.timestamp result.timestamp this.uploader.options.server this.uploadUrl // 關(guān)鍵替換WebUploader內(nèi)部的上傳文件數(shù)據(jù) this.overrideUploadMethod(file, result) resolve() } catch (e) { reject(e) } } reader.onerror () { reject(new Error(讀取文件失敗)) } reader.readAsArrayBuffer(file.source) }) }, encryptFile(arrayBuffer, fileName) { // 1. 生成AES密鑰和IV const aesKey CryptoJS.lib.WordArray.random(32) const aesIv CryptoJS.lib.WordArray.random(16) // 2. 用AES加密文件內(nèi)容 const wordArray CryptoJS.lib.WordArray.create(arrayBuffer) const encryptedContent CryptoJS.AES.encrypt(wordArray, aesKey, { iv: aesIv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 }).toString() // 3. 用RSA公鑰加密AES密鑰 const encryptor new JSEncrypt() encryptor.setPublicKey(this.rsaPublicKey) const encryptedKey encryptor.encrypt(aesKey.toString(CryptoJS.enc.Base64)) const encryptedIv encryptor.encrypt(aesIv.toString(CryptoJS.enc.Base64)) // 4. 文件名也加密 const encryptedFileName encryptor.encrypt(encodeURIComponent(fileName)) return { content: encryptedContent, encryptedKey, encryptedIv, encryptedFileName, timestamp: Date.now() } }, overrideUploadMethod(file, encryptResult) { // 這里用比較“偏門”但穩(wěn)定有效的方式 // 直接操作WebUploader內(nèi)部Hooks替換上傳時的FormData const me this.uploader const oldSend me.uploader.options.server // 在before-send-file的Promise resolve之后修改file的上傳數(shù)據(jù) file.formData { encryptedKey: encryptResult.encryptedKey, encryptedIv: encryptResult.encryptedIv, encryptedFileName: encryptResult.encryptedFileName, timestamp: encryptResult.timestamp } // WebUploader把file.formData合并進(jìn)上傳請求 // 同時我們把file.source修改成加密后的Blob file.source file.encryptedBlob }, submit() { if (this.uploader) { this.uploader.upload() } } }, beforeDestroy() { if (this.uploader) { this.uploader.destroy() this.uploader null } } } /script4.3 代碼里幾個隱蔽但關(guān)鍵的點這份代碼看起來邏輯不復(fù)雜但真正運行起來會踩一些隱蔽的坑我逐一說。第一個坑WebUploader默認(rèn)會把file.source作為上傳文件但上傳時FormData里的文件名、文件內(nèi)容都來自file.source。我直接把file.source file.encryptedBlob替換掉同時把file.name改成file.encryptedFileName對應(yīng)的值。這樣上傳請求發(fā)出去時后端收到的就是密文內(nèi)容和密文文件名。但WebUploader在before-send-file鉤子執(zhí)行完后內(nèi)部會重新讀取file.source的size等屬性。如果你把Blob文件替換了但沒更新file.size后續(xù)校驗可能會報錯。我在實際項目里加了一行file.size file.encryptedBlob.size這行不加的話WebUploader會出現(xiàn)“上傳文件為空”或者進(jìn)度條不動的問題。很多人在這里卡了很久其實就這么簡單。第二個坑Promise.resolve后WebUploader會繼續(xù)流程但沒有一個官方API讓你“再改一遍上傳參數(shù)”。用file.formData把extra字段帶過去是我嘗試出來的方式。WebUploader官方文檔里提到“如果要附加參數(shù)可以在uploader.option(formData)里配置”但那是對所有文件統(tǒng)一的。要針對單個文件動態(tài)附加就得在file對象上掛formData屬性內(nèi)部request方法會合并。我后來翻源碼確認(rèn)了這一點在webuploader.js的Request方法里確實有合并file.formData的邏輯。所以這個方法不是hack是官方預(yù)留的口子。第三個坑加密后的Base64內(nèi)容會比原始文件大不少Base64編碼膨脹約33%如果你在業(yè)務(wù)里對上傳文件大小做了限制加解密后校驗的是“加密后大小”要在組件里相應(yīng)地調(diào)整校驗上限。我在props里專門加了一個enableEncryptSizeLimit的配置默認(rèn)不限制如果后端限制的話用加密前原始大小去判斷。第四個坑CryptoJS處理ArrayBuffer時有個字節(jié)序問題。CryptoJS.lib.WordArray.create(arrayBuffer)時如果是ArrayBuffer它會按大端序讀取。但ArrayBuffer本身沒有字節(jié)序概念FileReader讀出來就是原始字節(jié)。所以這里沒問題。但如果你在某些場景下先用了DataView或TypedArray做轉(zhuǎn)換就可能出現(xiàn)字節(jié)序翻轉(zhuǎn)的問題。我的建議是不要在中途用Uint8Array轉(zhuǎn)換直接用WordArray.create最穩(wěn)。4.4 父組件里的使用方式封裝好后父組件里這樣用template div encrypt-uploader refuploaderRef acceptpdf,doc,docx,xls,xlsx,jpg,jpeg,png :max-size10 * 1024 * 1024 :upload-urluploadUrl upload-successhandleSuccess upload-errorhandleError / el-button typeprimary clicksubmitUpload上傳/el-button /div /templatesubmitUpload方法methods: { submitUpload() { this.$refs.uploaderRef.submit() }, handleSuccess(file, response) { // 處理業(yè)務(wù)邏輯比如回顯、保存記錄 this.$message.success(上傳成功) }, handleError(file, reason) { this.$message.error(上傳失敗) } }我在實際項目里把uploader組件的submit方法暴露給了父組件因為“選完文件后由用戶點擊統(tǒng)一上傳”是后臺系統(tǒng)的常見交互。如果你希望選完即傳就在after-file-added鉤子或選擇文件的回調(diào)里直接調(diào)this.uploader.upload()。5. 與vue2生態(tài)的兼容性細(xì)節(jié)5.1 在vue2里處理WebUploader全局依賴WebUploader不是ESM模塊npm安裝后還需要在main.js里或者index.html里引入。我試驗過兩種方式方式一在index.html里直接加scriptscript src/static/js/webuploader.min.js/scriptpublic目錄是靜態(tài)資源根路徑這樣可以避免webpack打包時對WebUploader代碼的處理問題。缺點是把全局變量掛到了window上但WebUploader本來就依賴全局這不算什么問題。方式二在組件內(nèi)importimport WebUploader from webuploader這種方式在打包時會報“window is not defined”之類的錯或者打出的包體積很大因為WebUploader壓縮前有200KB。我建議直接用script標(biāo)簽方式簡單粗暴穩(wěn)。5.2 vue2響應(yīng)式特性對WebUploader實例的影響這個點很多文章不提但我踩過很深的坑不要把WebUploader實例直接放進(jìn)vue的data里。因為vue2的響應(yīng)式系統(tǒng)會遞歸遍歷data對象的每個屬性用Object.defineProperty重寫。WebUploader實例內(nèi)部有大量DOM引用、事件隊列和內(nèi)部方法被vue代理后會導(dǎo)致兩個問題性能下降每次屬性讀取都走getter攔截上傳隊列操作頻繁時卡頓明顯穩(wěn)定性問題內(nèi)部某些屬性被攔截后可能會改變this指向?qū)е率录卣{(diào)觸發(fā)異常我一開始把uploader: null放在了data里結(jié)果在上傳文件列表更新時瀏覽器直接卡死。后來把這個變量移出data用普通對象created() { this._uploader null // 不走響應(yīng)式 }之后完全沒有這個性能問題了。這個細(xì)節(jié)如果你在用vue2做上傳組件一定會遇到。5.3 大文件上傳時vue2頁面的內(nèi)存管理WebUploader上傳大文件時瀏覽器內(nèi)存會明顯上漲。配合CryptoJS的加密處理內(nèi)存上漲幅度會更大。我這個項目用的文件不大但如果你要處理500MB以上的視頻或壓縮包必須注意幾點加密時不要再用FileReader.readAsDataURL轉(zhuǎn)Base64直接用readAsArrayBuffer更省內(nèi)存加密完成后把reader和中間變量置空讓瀏覽器能GCWebUploader的隊列里不要積壓太多文件盡量傳完一個清理一個組件銷毀時要調(diào)用uploader.destroy()并且把file.source等引用清掉否則一些瀏覽器會持續(xù)卡頓下面這段是我在項目里加的清理邏輯this.uploader.on(uploadComplete, function(file) { file.source null file.formData null file.encryptedBlob null // 注意不要直接刪除file對象它在隊列里可能還有引用 })這樣每個文件傳完就釋放內(nèi)存實測連續(xù)上傳幾十個文件瀏覽器內(nèi)存基本穩(wěn)定。6. 全鏈路聯(lián)調(diào)與后端配合要點6.1 前端上傳請求的實際格式前端配置完成并運行上傳后F12看到的請求體大致是這樣的POST https://api.example.com/api/upload HTTP/1.1 Host: api.example.com Content-Type: multipart/form-data; boundary----WebKitFormBoundary7MA4YWxkTrZu0gW ------WebKitFormBoundary7MA4YWxkTrZu0gW Content-Disposition: form-data; namefile; filenameencrypted_blob.bin Content-Type: application/octet-stream 二進(jìn)制密文內(nèi)容 ------WebKitFormBoundary7MA4YWxkTrZu0gW Content-Disposition: form-data; nameencryptedKey MIGfMA0GCSqGSIb3...Base64 ------WebKitFormBoundary7MA4YWxkTrZu0gW Content-Disposition: form-data; nameencryptedIv MIGfMA0GCSqGSIb3...Base64 ------WebKitFormBoundary7MA4YWxkTrZu0gW Content-Disposition: form-data; nameencryptedFileName MIGfMA0GCSqGSIb3...Base64 ------WebKitFormBoundary7MA4YWxkTrZu0gW Content-Disposition: form-data; nametimestamp 1702960585000 ------WebKitFormBoundary7MA4YWxkTrZu0gW--可以看到原始文件名不會出現(xiàn)在任何地方后端只看到一堆base64字符串和一個“encrypted_blob.bin”的占位文件名。這已經(jīng)完全滿足“防止抓包看到明文”的需求。6.2 后端接包與解密的示例邏輯如果后端是Java SpringBootController大致這么寫PostMapping(/api/upload) public Result upload( RequestParam(file) MultipartFile file, RequestParam(encryptedKey) String encryptedKey, RequestParam(encryptedIv) String encryptedIv, RequestParam(encryptedFileName) String encryptedFileName, RequestParam(value timestamp, required false) Long timestamp ) throws Exception { // 1. RSA私鑰解出AES密鑰 // 2. AES密鑰IV解出文件名 // 3. AES密鑰IV解出文件內(nèi)容 // 4. 按業(yè)務(wù)場景存儲或返回 }Java后端解密AES密鑰時用Cipher.getInstance(RSA/ECB/PKCS1Padding)對應(yīng)JSEncrypt默認(rèn)的RSA Padding。解密文件名時注意前端使用encodeURIComponent編碼Java端需要URLDecoder.decode(decryptedFileName, UTF-8)。如果是PHP或Python后端原理類似關(guān)鍵是確認(rèn)三件事RSA Padding模式是PKCS1AES模式是CBC、Padding是PKCS7Base64編碼和解碼兩邊一致6.3 加解密一致性驗證方法聯(lián)調(diào)的時候最容易出問題的是“前端加密沒問題后端解出來是亂碼”。我建議在正式聯(lián)調(diào)前先做一次本地閉環(huán)驗證用Node.js跑一次加密再用后端代碼解密比對原始文件哈希。前端加密后把密文和密鑰這些參數(shù)保存一份到本地或console然后在后端寫個測試單元解一遍。解出來對比原始文件的MD5值如果一致鏈路就通了。這個驗證特別重要否則你會發(fā)現(xiàn)一切看著正常實際解密后文件根本打不開。我整理了一張驗證維度表供參考驗證項前端操作后端操作結(jié)果判斷AES密鑰加密JSEncrypt加密后得到encryptedKeyRSA私鑰解密解出的AESKey與前端一致文件內(nèi)容AES-CBC加密Base64輸出AES-CBC解密解出的文件MD5與原文件一致文件名encodeURIComponent加密解密URLDecoder.decode中文文件名無亂碼重放攻擊防護(hù)增加timestamp字段判斷是否在規(guī)定窗口期過期請求拒絕6.4 部署和測試環(huán)境里的額外注意事項項目在測試環(huán)境聯(lián)調(diào)時我由于公鑰更新不及時吃過虧。后端的RSA密鑰對是打包時生成的每次部署生成一次前端的公鑰在啟動時獲取。如果中間件或網(wǎng)關(guān)緩存了接口響應(yīng)前端可能拿到舊公鑰后端用新私鑰解不開。解決辦法是每次發(fā)布時后端清一下接口緩存前端在啟動時強制性拉取公鑰接口加時間戳參數(shù)繞過緩存export function getRsaPublicKey() { return request({ url: /api/system/public-key?ts${Date.now()}, method: get, headers: { cache-control: no-cache } }) }另外如果使用了Nginx反代要確保這個接口沒有被緩存否則上線后會出現(xiàn)“昨天還能傳今天全報解密失敗”的詭異問題。7. 常見問題與排查技巧實錄7.1 WebUploader在vue2項目里選完文件沒反應(yīng)這個現(xiàn)象通常不是加密邏輯的問題而是WebUploader的picker沒正確綁定。檢查三點組件掛載后DOM是否真的存在mounted里init沒問題但如果你在created里init就會出這個問題pick的id選擇器是否指向了一個已存在且可見的元素WebUploader是基于Flash和HTML5雙實現(xiàn)的現(xiàn)代環(huán)境優(yōu)先走HTML5所以不需要Flash插件我在項目里碰到過一次原因是組件在彈窗里彈窗還沒渲染完時就初始化了WebUploaderpicker綁不到DOM。解決辦法是在彈窗的open回調(diào)或nextTick里再初始化。7.2 加密后文件打不開或解出亂碼這類問題十有八九出在CryptoJS和C#或Java的AES模式參數(shù)不一致上。我見到最多的錯誤是前端用了CBCPkcs7后端用了ECBBase64字符串里帶了換行符或多余空格切割或傳遞時被破壞加密后的密文經(jīng)過URL傳輸被解析成空格這里給一個排查清單確認(rèn)AES mode、padding、key、iv都一致確認(rèn)RSA padding與后端一致確認(rèn)Base64字符在傳輸過程中沒有被URL編碼破壞確認(rèn)Blob替換后上傳時的流內(nèi)容就是加密后的二進(jìn)制最后一句話前端加密的密文傳到后端時multipart/form-data是二進(jìn)制流不會做URL解碼所以理論上不會出Base64被轉(zhuǎn)空格的問題。但如果你走的是JSON請求體那就要注意把Base64里所有“”替換成“%2B”或者用URL-safe Base64。7.3 WebUploader在vue2下打包后報錯“WebUploader is not defined”這是老生常談的問題重新梳理一下用script標(biāo)簽方式引入不使用import在組件mounted里再訪問window.WebUploader不要在模塊頂層直接訪問因為此時Script可能還沒加載完如果用CDN確認(rèn)引入順序在業(yè)務(wù)代碼之前我給組件里加了一個安全性檢查if (!window.WebUploader) { this.$message.error(文件上傳組件加載失敗請刷新頁面重試) return }7.4 keep-alive頁面里上傳組件內(nèi)存泄漏vue2項目里常有用keep-alive緩存頁面的場景。Uploader組件在activated和deactivated時不會銷毀所以beforeDestroy可能不觸發(fā)WebUploader實例會殘留在內(nèi)存里。我的處理方式是在deactivated鉤子里主動暫停上傳并釋放實例deactivated() { if (this.uploader) { this.uploader.stop(true) this.uploader.destroy() this.uploader null } }, activated() { // 重新初始化 }如果你發(fā)現(xiàn)緩存頁面反復(fù)進(jìn)出后瀏覽器內(nèi)存持續(xù)暴漲大概率就是這個問題。不用全組銷毀只要在離開時destroy就行。7.5 加密后文件上傳到OSS但無法在線上預(yù)覽加密存儲的代價就是所有依賴完整文件的預(yù)覽能力都沒了因為OSS里存的是密文。這個在需求階段就要和產(chǎn)品確認(rèn)清楚。如果需要預(yù)覽有兩種常見解法后端解密后通過一個臨時簽名的接口輸出到瀏覽器預(yù)覽預(yù)覽完即失效把縮略圖或視頻轉(zhuǎn)碼流放行成明文原始文件保持密文我在項目里是先把圖片壓縮生成一個縮略圖明文只對原始文件加密。這樣列表頁展示縮略圖不受影響下載原文件時才走解密接口。這個方案兼顧了體驗和安全推薦給你參考。8. 安全加固與擴(kuò)展實踐8.1 加解密過程的時間性能實測加密耗時這個數(shù)據(jù)我實測過幾次給你一個參考文件大小AES-256加密耗時Base64編碼耗時總耗時100KB約20ms約5ms約25ms1MB約150ms約40ms約190ms5MB約800ms約200ms約1s20MB約3.2s約800ms約4s在普通辦公網(wǎng)絡(luò)環(huán)境下多出這幾秒通常是可以接受的。但如果你要上傳超大文件建議在UI上做一個“加密中”的loading提示避免用戶以為卡死了。8.2 再加一層自定義Header校驗除了加密本身我還在項目里加了自定義Header校驗前端在請求頭里帶一個由時間戳和AESKey摘要計算出來的簽名后端做同源校驗防止有人直接拿著加密后的請求重放。這個簽名邏輯也很簡單const sign CryptoJS.HmacSHA256(timestamp encryptedKey, aesKey.toString()).toString()后端解密后用自己的邏輯校驗sign是否一致。相當(dāng)于給加密鏈路再加了一道鎖。雖然對普通業(yè)務(wù)來說RSAAES已經(jīng)夠用但如果你對接的是政務(wù)系統(tǒng)或網(wǎng)絡(luò)安全等級保護(hù)要求高的場景這層簽名是很有必要的。8.3 后續(xù)擴(kuò)展方向這個方案后續(xù)還可以做幾個擴(kuò)展把加密從“上傳加密”擴(kuò)展到“下載解密”后端存密文用戶下載時前端解密展示全程不在服務(wù)器落明文引入文件指紋MD5、SHA-256在上傳前先做秒傳判斷同時保證加密后的文件指紋一致可以用來去重結(jié)合消息隊列做異步解密任務(wù)避免大文件解密時阻塞主線程影響其他接口響應(yīng)在我做過的系統(tǒng)里擴(kuò)展方向往往取決于業(yè)務(wù)對文件安全重視到什么程度。加密是一個不能只做一半的事情前端加密了后端存儲還暴露明文就白做了后端解密后又會把明文暴露在接口層也要加權(quán)限控制。所以全鏈路都要考慮到才能算完成了一次加密存儲改造。最后說一點個人體會前端加密從來都不是萬能的密鑰、算法、傳輸、存儲、權(quán)限每個環(huán)節(jié)都可能成為短板。但在現(xiàn)實項目里RSAAES混合加密已經(jīng)是性價比最高的方案了——性能開銷可接受、破解難度足夠、實現(xiàn)成本也不算高。如果你和我一樣在維護(hù)老項目這套東西真的可以直接復(fù)制過去用比從零搭一套安全體系省太多事了。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
影音先锋AV男人站| 色色色地址| 一区二区三区四区无码| 久久激情五月| 久热这里只有精品6| 粉嫩AV久久一区二区三区| 丁香色情五月综合激情| 成人综合视频在线| 欧美日韩国产成人在线| 久久这里只有精品热在99| 日本va欧美va欧美va| 丁香九月激情| 婷五月天| 国产精产国品一二三在观看| 欧美日韩一区二区三区四区| 九九精品免费| 天天做天天爱综合| 天天综合图片| 天天五月香欧美| 天天日天天久久青青| 丁香五月成人社区| 99色免费视频| 草婷婷在线| 丁香五月天黄色片| AV中文字幕夜夜操b天天摸bb| 激情图片五月天| 白天AV月月| 91ncm视频| 三级av在线| 能看的AV| 囯产精品久久欠久久久久久九大| 99日本在线| 五月婷婷丁香在线视频| 九九久久综合网站| 天天成人综合视频| 亚洲综合婷婷五月天| 在线不卡视频| 色色日韩| 色色色在线免费视频| 婷婷午夜综合| 久草网大香视频| 超pen个人视频97| 色婷婷小说| 天天操天天干天天日| 狠婷婷五月| 五月婷婷丁香五月亚洲色| 性天堂久久| 日本黄色精品| 综合久久久| 狠狠操狠狠操AV| 狠狠操狠狠狠| 桃色激情婷婷伊人网| 九九久久五月天| 欧美人人超级碰| 婷婷丁香激情五月天色色色| 啪啪视频99| 色色色色色色网| 超碰免费人妻| 五月丁香六月婷综合成人综合| 991国产精选视频在线播放下载| 99久久玖玖| 色五月天激情| 婷婷亚洲五月| 激情小说视频图片网| 婷婷伊人久久综合| 久热免费| se99视频| 久久九九热视频| 综合五月天亚洲婷婷| 免费人人操| 色色欧美色色| 在线超碰91| 六月激情网| 操逼巨乳91| 色婷婷亚洲在线观看| 成人网页在线观看| 色婷五月婷婷| 五月婷婷深爱六月| 丁香五月天婷婷激情| 亚洲成人网站在线观看| 2020夜夜操天天爽| 久久亚洲天堂| 久久综合九九| 丁香青青五月天| 欧美经典片免费观看大全| 婷婷综合色图| 婷婷欠久少妇| 五月婷精品| 久久婷婷丁香五月一二三| 青娱乐美女福利视频美臀| 丁香五月激情婷婷| 天天爽综合网| 五月丁香六月激情在线| 丁香花五月天社区| 久久婷婷丁香五月一二三| 丁香婷婷丁香五月欧美人| 五月婷丁香在线视频在线| 色色日韩| 99激情| 狠狠人妻色综合| 九九综合精品| 久久精品日| 超碰九九热| 五月激激网w'w'w| 天天五月情| 丁香5月婷婷| 天天日天天插| 欧类av怡春院| 亚洲丁香花色| 日韩按摩二区| www.久久| 色婷婷99| 成人色图情色成人网 www.5b5b5bcom 五月天| 91ncm视频| 国产精品一区在线观看你懂的| 99视频啪啪| 中文字幕,综合,91| 中文乱子伦视频| 国产免费AV在线| 国产免费一区二区在线A片视频| 超碰人人摸AV| 久久婷婷五月天激情新地址| 五月花婷婷| 中文字幕欧美日韩VA免费视频| 色色色色色色五月婷婷| 五月婷婷综合潮喷| 激情五月婷婷| 99热久只有| 99九九视频精彩在线| 婷婷五月综合久久中文字幕| 五月综合视频| 色婷婷成人网| 丁香婷婷性久久| 九九视频在线观看视频6| 国产精品美女| 狠狠色五月| 99综合免费视频| 99热综合在线| 99九九热在线观看| 人人操人人干AV| 丁香五月开心七月| 日韩色情亚洲五月天婷婷| 亚洲免费看片| 激情视频婷婷五月花| 免费视频99| 天天爱天天爽| 婷婷五月天成人在线视频| 91人妻人人做人碰人人爽九色| 婷婷五月丁香五月| www.五月天| 婷婷色色综合| 婷婷十月丁香| 伊人丁香五月婷婷潮吹| 婷婷六月天激情| 亚洲乱码日产精品BD| 综合色播| 精品久久9| 99人人看| 99视频精品全部免费看| 大地9中文在线观看免费高清| 天天色综| 996er热| 99热精品免费在线观看| 婷婷5月久久综合网站| 99久久99九九99九九九| 99日韩| 丁香六月啪啪| 电影91久久久| 思思热精品在线| 内射 无码 伊人| 久久这里只有精品1| 亚洲操人| 五月丁香好婷婷姑娘综合网| 综合色、色综合| 性色播| 99色网站| 996热re视频精品视频这里| 色综合久久888| 99精品自拍| 欧美色色色色色色| 一本色道久久综合狠狠躁小说| 99热色婷婷| 婷婷五月大| 婷婷色五月天在线| 天天日夜夜爽。| 超碰国产在线| 色丁香久久久| PORNY九色9l自拍视频成人| 五月天综合在线观看| BlACKEDRAW视频一区二区| 99这里只有免费的精品| 婷婷五月天免费99| enecarbon-materials.com污K127封锁请涟系@wip1688 | 禁欲电影完整版在线播放| 99热久| 五月天色色色| se色99| 狠狠爱深色婷婷综合| 开心五月色婷婷综合开心网| 五月丁香琪琪| www...com黄在线观看| www,26uuu,c0m,色情| 亚洲综合成人网站| 九九在线视频| 丁香久久综合| 99熟女| 99综合视频一体| 欧洲一区二区| 超碰国产在线| 激情婷婷色五月| 51成人| 激情又色又爽又黄的A片| 综合色五月天| 国产免费av在线| 国产色网站| 天天做天天双| 色999亚洲人成色| 99久久婷婷国产综合精品| 涩婷婷五月天在线精品视频| 99热精品中文字幕| 99在线精品免费视频| 丁香婷婷五月色成人网站| 人妻少妇色综合| 免费在线观看欧美激情xx小视频| 久草久青福利| 色婷视频| 日本三级黄色大片| av在线资源| 超碰自拍天堂| 日韩熟女啪啪视频| 久婷狼色诱惑在线| 一点色成人网| 久久伊人9| 丁香五月激情六月综合| 婷婷五月天免费小说| 九月婷婷激情久久| 伊人爱爱日本| 久操婷婷| 婷婷深爱五月| 色综合激情| 97色五月天| 超碰在线人人| 激情综合五月天| 婷婷六月久久| 91九色PORNY中文啦| 777精品久无码人妻蜜桃| 91狠狠色丁香| 天天操夜夜操| 精品色色| 亚洲熟妇无码乱子AV电影| 26uu| 婷婷 亚洲图片 丁香| 日良久久| 亚洲av网站在线观看| 日日影院 | 91九色精品女同系列| 欧美在线骚货| Www.se.久久| 色五月婷婷影院| 国产AV一区二区三区最新精品| 这里只有精品久久| 99成人精品视频| 怡红院99| 九九精品这里只有| 婷婷色五月综合丁香| 欧美三级黄色片久久| 五月丁香婷婷激情爱爱| 99干日日干| 婷婷成人五月天成人文学| 亚洲 视频 导航 一区| 久久婷婷五月综合伊人| 婷婷深爱五月丁香网| 性爱AV天堂| 亚洲AV成人一区二区在线观看| 久久草大香蕉| 欧美三级韩国三级日本三斤| 9久久久| 五月丁香人妻| 丁香5月激情网| 色99亚洲| 青青草成人网| 99日韩| 婷婷五月天社区| 亚洲乱码日产精品BD| 丁香五月天堂婷婷| 综合性爱网| 九久9精品| 五月婷高清视频| 99在线国| 婷婷五月激情综合| 天天综合区| 大香蕉九九热| 日在线V视频在线播放| 亚洲色色色| 亚洲AV在线免费看| www色五月| 狠狠色噜噜狠狠色噜噜噜999| 337p午夜影院| 天天操加勒比| 99se丁香| 天天开心婷婷丁香五月| 婷婷国产成人| 91.www综合| 大香蕉丁香| 天天久久人人| 婷婷五月免费视频| 国产精产国品一二三在观看| 欧美色色色色色色色色色色| 五月丁香六月欧美| 99精品免费视频| 色色综合网。| 深爱激情小说五月婷婷| 97人人做| 亚洲成人AV在线| 五月婷婷色综图片| 欧美日韩成人| 非洲一级AV| 三十路磁力链接| 五月丁香综合啪啪| 五月丁香色婷基地综合久久| 五月婷婷狠狠干| 久久激情五月婷婷| 色婷婷狠| 日韩淑女人妻luan伦激情精品一区二| 色婷青青| 激情五月天之六月婷婷| 久久久五月天| 人人爽人人射-美女久久久久久久久久-成人AV | 婷婷丁香久久| 日韩操逼大片| 婷婷色片| 色播五月网| 国产AV一区二区三区最新精品| 99亚洲精美视频在线观看| 热久久视频99| 国产成人AV不卡| 第四色激情网| 色五月激情综合网| 超碰激情网| 噜噜色com| 色无婷婷| 五月婷六月丁香| 亚洲激情在线| 婷婷免费成人视频| 欧美顶级少妇做爰HD| 草草视频91| 色天堂在线| 五月丁香婷婷啪啪综合| 天天拍天天操| 午夜亚洲国产精品av一区二区| 逼里香不卡| 亚洲婷婷性爱| 99r这里| 97干在线| 操逼福利视频| 欧美日韩成人综合9| 天天看片日日夜夜| 日本不卡一区二区三区| 丁香六月婷婷综合麻豆| 日日干夜夜干| 五月色丁香国产在线视频| 五月婷婷性爱| 日日想日日夜日日操| 思思热在线视频精品| av国产精品偷| 天天日,天天射,天天舔| 狠狠色丁香久久婷婷综合五月| 丁香五月冃欧美| 99ER热精品视频| 综合网啪啪| 丁香色六月婷婷| 九九视屏| 综合婷婷久久| 色综合久| 亚洲激情四射色| 亚州视频九九99| 国产精品一区在线观看你懂的| 亚洲精品乱码久久久久久按摩观| 9精品久久999| 日日天天干| 夜色综合网| 综合一区二区三区| 久久丁香五月婷婷激情综合网| 五月色综合| 婷婷在线观看五月天在线视频| 色婷婷五月天偷拍| 亚洲色模骚货| 丁香五月婷婷AV| www久久久| 婷婷激情中文综合| www。五月,com| 开心婷婷丁香五月| 操操啪| 五月激情小说| 四月婷婷丁香五月| 五月激情丁香五月| 果冻传媒A片一二三区| 精品A√| 人人人操| 大香蕉在九| 婷婷五点亚洲| 亚洲激情在线| 97日日碰碰| 色婷| 五月天激情婷婷小说| 色婷婷影视99| 国精产品一区一区三区免费视频| 人妻无码精品一区| 激情五月天黄色小说| 日本人妻伦在线中文字幕| 99惹精品视频| 99在线观看视频免费| 艹B高清无码| 亚洲色网址| 色就是色婷婷五月亚洲激情| 另类视屏| www.丁香六月婷婷久久天堂影院.con| 日本久久婷婷| 丁香五月天在线| 97干在线| 天堂亚洲 在线| 玖玖热视频| 色情一区二区播放| 草综合网| 五月丁香婷婷激情影院欧美| www五月婷婷88导航| 国产精品美女| 婷婷久久色| 丁香五月婷婷亚洲色图| 九九色色色| 亚洲精品午夜国产va久久成人| 久久久久久人妻久久久久久久久久人妻久久久| 婷婷国产综合| 伊人久久婷| 九色porny在线观看激情四射| 中文字幕 中文字幕明步| 中文字幕婷婷五月天在线观看| 欧美色婷婷| 91艹人| 超碰日韩人妻在线| 婷婷伊人网| 日本va欧美va国产激情| 天天操夜夜橾| 婷婷天天综合| 另类五月婷婷| 99操视频| 久青青久| 久久香蕉网| 狠狠色丁香久久婷婷综合五月| 久久久天堂国产精品女人| 国产激情综合五月久久| 激情五月综合网最新| 久久人妻伊人| 久久九九在线视频| 思思热久久久久思思热| 婷婷丁香五月激情中文字幕版| 欧美视频五区| 91viP在线看| se色综合网| 综合 激情 婷婷| 欧美成人精品A片免费一区99| 国产精品电影| 狼人久草| 激情五月婷婷网| 综合网色| 色色色色色网| 色色色欧美| 天天天天天日| 国产人妻人伦精品一区二区| 国产午夜成人AV在线播放| 五月婷婷啪啪| 91丁香综合| 黑人巨粗进入警花疼哭A片| www九九热| 丁香婷婷色五月| 亚洲综合婷婷| 青草视频在线播放| 91九色PORNY肉丝在线| 五月丁香婷婷五月色| 久久婷婷一级片| 五月婷婷性爱网| 色色色九九九五月婷婷| 免费人人操| 77777亚洲午夜久久| 五月天色色色色色| 五月天丁香网站| 五月丁香六月在线欧美| 色婷婷五月天激情久久| 五月精品免费XXX| 婷婷网五月| 99综合| 五月丁香六月激情综合| 激情伊人五月天| 爱草视频在线观看| 五月天丁香六月综合| 操比激情五月| 强辱丰满人妻HD中文字幕| 久久久精品AV| 亚洲日日操| 丁香 婷婷五月| 影音先锋男人资源站一区二区| 五月色情| 国产亚洲99久久精品| 中文字幕 中文字幕明步| 激情五月色综合国产精品| 99综合久久| 婷婷五月激情视频网| 九热视频免费观看| 婷婷五月天Av| 日日射天天射| 91婷婷色 | 亚洲六月婷婷| 99热人人操人人操| 欧美色色色| 丰满人妻一区三区三区| 婷婷五月天影院| 日本精品人妻无码77777| 99超级超级超级碰| 秋霞AV美国| 成人在线二区| 嫩草AV久久伊人妇女超级A| 丁香色五月天| 色婷婷成人| 91日日日| 九九综合九九| 成人AV免费观看| 色99在线| 六月丁香啪啪啪| 天天狠狠夜夜狠狠2023| 精品久久66| 丁香欧美| 亚美欧色影院| 天堂婷婷五月在线| 99在这里有精品| www.99在线| 色五月婷婷影视| 天天日夜夜B久久| 超碰人人干| 97超级碰| 日日想日日夜日日操| 婷婷激情六月综合| www.日本91| 99re这里有精品手机在线| 伊人久久婷婷| 亚洲不卡| www.色综合| 五月丁香六月激情综合| 99∨VTV| 欧美日韩欧美| 亚洲精品一二三| 亚洲免费综合一区| 欧美69色| 99干视频| 伍月婷婷免费视频| 天天日天天做天天操| 精品少妇蜜臀91| www.亚洲激情| 激情亚洲婷婷| 久操人妻| 五月婷婷丁香社区| 9国产在线视频| 色五月婷婷狠狠撸| 99热这里只有精品2| 超碰爱爱爱| 五月丁香六月婷| A1片久久久| 丁香五月久久| 婷婷激情啪啪| 亚洲五月婷婷| 婷婷五月丁香五月| 亚洲精品a成人在线播放| 精品AV无码超碰| 狠狠色大香蕉| 色墦五月丁香| 新激情五月开心五月婷婷五月丁香五月| 五月开心婷婷| 久久久久久久人妻| 可以免费观看的AV| 丝袜熟女一区二区三区| 综合色影| 久久久激情| 亚洲AV永久无码影院黑人| 五月天激情播播网| 色五月婷婷在线视频| 天天摸天天做天天爱天天爽| 大香蕉啪啪啪| 婷婷视频在线| 色综合色色| 深爱五月天天| 美女精品一级不卡视频| AV片一区在线观看| 五月丁香大相交| 五月天伊人av| 激情视频综合| 九九热青草| 中文字幕网站在线观看| 高清无码一区二区三区四区| 亚洲激情久久| 热思思九九| 99九九热在线观看| 五月激情综合深爱| 国产亚洲99久久精品| 91夫妻网站九色| 色七七九九| 99色播| 99热精品在线观看| 婷婷天堂综合网| 丁香婷婷基地| 婷婷五月天AV| 日韩人妻AV在线| 色色激情五月| 狠狠干青青草| 六月婷婷五月天| 一片AV片免费播放| 婷婷操逼| 免费AV在线| 666555。COm毛片| 大香蕉九操| 欧美25p| 做爰丰满少妇1313| 婷婷亚洲综合| 激情五月天综合网| 人妻视频一区而且二区| 色五月激情问网站| 丁香五月影院| 九九婷婷综合| 五月丁香狠狠爱婷婷综合| 久久久久亚洲A∨成人乱码电影| 激情色中文| 国产精品99久久久久久久女警| 色婷婷五月综合| 这里只有精品热| 久久嘟嘟丁香| 国产av第一专区| 亚洲免费婷婷| 六月丁香婷婷综合在线| 天天干天天干天天干天天干天天干天天干天天 | 婷婷五月综合视频免费播放| 色热久资源| 激情婷婷综合网| 欧美日韩精品人妻狠狠躁免费视频| 丁香桃色网| 无码天天操| 亚洲AV免费在线| 亚洲精品另类| 午夜成人片400| 99re8在这里只有精品| 六月合五月婷| 能看的av片| 激情综合婷婷五月| 午夜爱插插| 日韩精品呦呦va| 国产日产亚系列精品版优势| 久久全意婷婷| 日韩一66精品| 男女啪啪做爰高潮无遮挡| 欧美成人Va| 丁香五月电影| 色播五月婷婷综合| 爱射综合| 久久多色| 99熟女| 色五月丁香五月五月婷婷| WWW免费视频碰碰碰碰| 99内射视频| 丁香五月色| 日本99婷婷| www.99热这里精品| 97电影99热| 久久婷婷综| 97碰碰人人| 久久只有18视频| 噜一噜免费视频| 91精品综合久久久久久五月丁香| 色婷婷视频| 综合色图婷婷| 26uuu欧美日本| 色婷婷性爱| 在线成人网站| 激情婷婷五月女| 丁香婷婷综合激情五月色| 午夜不卡成人一区二区| 五月丁香亭亭电影久久| 婷婷五月天97干| 丁香五月婷婷色情综合| 97色啪| 成人丁香五月天| 久热这里只有精品在线观看| 国产露脸150部国语对白| 凹凸操Av| 久久99看免费| 天天操比比| 男人天堂99| 天天综合网~91| 久久伦乱| 丁香五月天天日| 日本无va视频| 天天干天天日蜜臀av| 五月丁香免费看| 激情婷婷在线中文字幕| 亚洲字幕AV一区二区三区四区| 精品无码99| enecarbon-materials.comWu染请涟系Bao护@wip1688 | 色婷婷在线电影| 99精在线| 99热 这里只有精品 国产 日韩| 福利视频在线播放| 人人草人| a69在线视频| 久久九九99.www| 伊人五月婷婷| 青草激情在线| 精品久久9| 狠狠一日| 黄色AV日韩| 久色五月婷婷综合| 97干在线视频| 熟妇国产| 五月丁香六月成人| 婷婷色五月在线视频| www.99热| 色综合激情图区| 伊人婷婷大香蕉| 日批在线看| 日本一道久久| 丁香婷婷影院| 人人摸人人干| 久久婷婷丁香| 色色色视频| 99热成人精品| 色综合久久88| 九九99九九99偷拍视频免费看| 中文字幕av在线| 精品成人在线观看| 天天做天天爽| 五月五婷婷| 思思 热 99| 国在线激情网| 97碰碰在线观看视频| 国产成人精品亚洲线观看| 五月激情婷婷丁香天堂| 久婷婷久草| 天天做天天爽| 久超超碰| 丁香五月亚洲综合| 蜜乳9188| 色五月激情网| 噼里啪啦完整版中文在线观看| 思思久热| 天天干-天天日| 新激情五月天色播| 五月丁香激情综合网| 一起草aV| 婷婷丁香五月噜噜噜| 97久久超碰| 五月婷婷啪啪啪| 天天爱夜夜爽| 五月婷婷综合成人| 丁香五月狠狠综合欧美| 大香蕉五月天婷婷丁香91| 欧美色偷偷大香| 国产一级视频a| 亚洲中文字幕在线观看| 久久婷婷五月| www.夜夜操.com| 亚洲综合五月天婷婷丁香| 久久黄色片| 欲色人妻| 日本激情ⅩXX免费视频| 五月婷婷AV| www.久久爱.com| 五月丁香激情六月| 亚洲午夜成人av电影网| 婷婷爱综合| 亚洲妇女熟BBW| 九九热在线亚洲免费视频| 久久久久亚洲AV无码网影音先锋| www.日本91| 综合色色色| 91精产一区三区免费观看| 五月婷婷激情综合视频| 五月天福利影院导航| 千人斩操逼| 91超碰九色| www.日本久久videos| 黄色AV日韩| 超碰人人干| 99视频这里只有免费精品| 色一情一乱一乱一区91Av| 99热只有精品综合| 丁香五月婷婷深五月| 免费黄色视频网址| 五月成人丁香av91| 丁香六月狠狠| 色五月婷婷在线观看第一页舔| 五月天婷婷激情干干| 久久婷狠狠色| 五月天另类激情在线| 天天干天天做| 色婷婷狠狠| 久久这里只有精品热在99| 天堂成人A片永久免费网站| 99色综合| 4399无码视频| 91精品丝袜久久久久久久久粉嫩| av线电影| 日本精品在线噜噜噜| 开心五月激情| 亚洲 无码 中文字幕 中出| 国产日韩亚洲欧美在线观看| 免费在线观看欧美激情xx小视频| 99热在线精品观看| 日日撸夜夜操| 天天射影院| 国产亚洲成人综合| 日韩AV在线免费观看| 狠狠色综合网| 国产精品久久久爽爽爽麻豆色哟哟 | 久热99热| 色情综合| 五月婷综合网| 丁香五月婷婷大香蕉| 草草操操| 久久久久99精品成人片| 五月叮香啪| 风流少妇A片一区二区蜜桃| 少妇AB又爽又紧无码网站| 少妇熟女视频一区二区三区| JlZZJlZZ8JlZZ亚洲熟女| 99碰在线视频| 久久五月天精品视频| 天插天啪天啪天啪| 国产激情在线| 色婷婷六月| 天天做天天双| www99精品在线观看| 色天堂A| 天天综合亚洲综合| 超碰二区| 香蕉久久五月| 99色婷婷| 天天色天天爱天天舔| 大香蕉大香蕉在线影院| 国产成人一区二区三区在线观看| 久久超视频| 亚洲综合丁香五月| 殴美日比视频| 日日操夜夜操不卡| 99热6色| 就爱干 在线| 丁香婷婷深情五月亚洲| 激情五月天婷婷| 青青久久大香蕉| 开心五激情网| 久热99热| www.亚洲激情.com| 丁香综合婷婷开心激情网| 婷婷六月激情丁香| 五月婷婷在线视频| 伊人激情网| 婷婷91| 午夜丁香五月天综合| 2025最新亚洲激情在线| 九九人人自拍| 亚洲精品国产熟女久久久| 影院久久久| 久久这里这里有精品免费视频| 99爱视频免费| 亚洲乱码日产精品BD| 无码人妻激情| WWW五月| 无码人妻丰满熟妇奶水区码| 五月天婷婷操逼视频| 丁香五月在线伊人| 99久久99九九九99九他书对| 久久久9久| 天天艹天天色| 狠狠色丁香| 99 re视频一区| 丁香五月婷婷手机| 男女啪啪做爰高潮无遮挡| 色99在线视频| 五月婷在线视频免费播放| 五月色综合| 色婷婷久久综合久色综| 激情五月天com| 伊人久久五月天| 深爱激情五月天| 婷婷五月激情欧美大胆视频| 欧美内射AA| 91热久久| 婷婷六月综合激情| 99色综合| 久热综合| 97操操操| 婷婷五月激情网| 日本一道久久| 91怕怕网| 99热在线这里| 91狼友视频网页更新| 99re这里有精品手机在线| 99九九精品| 国产VA播放| 狠狠操狠狠爱| 97av在线视频| 丁香九月久久| 在线超碰免费| 全部老头和老太XXXXX| 成人国产欧美大片一区| 99人妻碰碰久久久禁片| 婷婷六月久久综合导航| 俺也去色| 丁香花社区av| 伊人久久大香天蕉亚洲特级| 五月色亚洲| 五月婷婷基地| 侠女刀之记忆电影在线看免费| 米奇激情婷婷| 五月婷婷婷婷婷| 亚洲色婷婷| 色吧综合网| 国产乱子轮XXX农村| 婷婷五月天 丁香五月天 裸体| 中文字幕在线人妻| 亚洲另类婷婷五月综合| 九热网站| 思思国产99| 亚洲狠狠色丁香婷婷综合久久| 色五月色综合| 丁香五月伊人| www.五月天婷婷| 伊人九九热| 99九色视频在线观看| 五月色网| 伊人五月天| 影音先锋五月天婷婷丁香在线观看| 这里只有精品96| 五月婷视频在线观看| 三级三久久线久久99久目本WW| 五月天婷婷三级黄| 成人网站免费在线播放| 婷婷激情九月| 禁欲电影完整版在线播放| 另类图片五月天婷婷| 天天舔天天爽| 99热只有这里才是精品| 五月婷婷之综合激情在线| 亚洲精品视频电影| 我爱大香蕉| 怡红院AV亚洲一区二区三区H| 久久五月婷婷开心网| 狠狠色噜噜狠狠亚洲A∨| 亚洲综合五月天| 俺也去在线久久精品23欧美综合视频网站,丰满人妻一区二区三区在线视频53,丰满 | 九色啦蜜臀| 99精品在线播放| 熟妇人妻中文字幕无码老熟妇| 精品无码99| 丁香五月停停基地| 性天堂久久| 97碰碰碰免费公开在线视频| 99热精地址| 猫咪伊人久久| 大香蕉伊人久久| 激情五月天激情综合网| 综合色网站| 婷婷激情五月| 狠狠色噜噜色狠狠狠综合久久成人波 | 爆乳熟妇一区二区三区爆乳照片| 成人午夜天| 丁香婷婷久久老熟女综合网| 国产精品国产| 天天操天天插| www.com五月天| 丁香五月婷婷六月丁香| 亚洲人妻av伦理| 99久久玖玖| 狠狠干五月丁香综合网| 国产av天堂| 丁香六月婷婷久久综合| 99亚洲视频| 色播激情婷婷| 天天插天天很| www.久久久久| 久久作爱| 久久最新色| 青青久久五月天丁香婷婷| 亚洲综合丁香婷婷六月天| 亚洲中文字幕AV| 99狠狠| 国产精品五月天婷婷| 《亚洲操B久久免费在线观看,亚洲操B久久在线播放》在线播放 - 高清资源 - 97 | 五月丁香婷婷中文| 另类激情综合| 91久操| 婷婷丁香91| 内射爽无广熟女亚洲| 丁香五月色五月| 欧洲亚洲欧洲99久久| 久久九色| 五月丁香日逼| 国产人妻777人伦精品HD| 五月天丁香成人社| 精品A√| 激情涩涩网| 丁香五月欧美激情| 99碰碰碰| 激情五月婷婷| 色色色婷婷| 这里只有免费的精品| 丁香五月综合高清在线| 97超级碰碰碰| 天天综合网~91| 五月婷婷性爱| 大香蕉久操| 综合色播| 五月深爱网| 欧美婷婷五月激情| 亚洲婷婷视频| 五月香蕉婷婷| 91大神在线免费看视频全集男男一起操| 99久久9| 香蕉综合网| 欧美五月婷婷| 天天日夜夜拍| A A色色| 婷婷色系婷色| 婷婷丁香五月天综合AV| 另类图片色五月| WWW.桔色成人.COM| 婷婷丁香五月激情图片| 久久3级片| 激情五月婷婷开心网| 丁香六月丁香婷婷激情| 99re免费精品视频| 99热碰碰热| 狠狠操综合| 九九视频在线| se99视频| 99视频综合| 这里只有精品69| 久久一级片| 五月丁香激情综合网| 99日韩| 午夜无码熟熟妇丰满人妻| 婷婷五月AV| 五月婷久久草| 亚洲色99| 久久婷婷一级片| 99九九免费精品| 开心激情网在线| 婷婷亚洲激情在线观看视频| 91伦| 97视频久久| 91dy.av| 玖玖婷婷精品| 色偷偷综合| 亚洲色模骚货| 色色免费网站| 激情综合网激情五月婷婷| 99亚洲精品视频| 亚州激情网| H亚洲| 丁香九月激情| 综合五月天亚洲婷婷| 热久久这里只有三级视频| 亚洲热久久| 五月丁香六月婷婷在线播放| 91嫩草久久| 99视频只有精品| 天天做天天爽| www.99热国产| 激情五月天的婷婷| 婷婷丁香97| 2025年最新亚洲在线欧美| 久久综合爱| 操逼电影免费看| 九九99久久| 天天摸人人摸| 色综合香蕉| 久久久色情| 亚洲人妻Av| 思恩热国产视频右线观看| 天天色天天爱天天舔| 色综合综合网| 五月婷婷官网色| 97狠狠色| 色色色热| 91精品刘玥| 91久久综合| 这里只有精彩小视频视频网站| 亚洲婷婷丁香五月亚洲| 欧美日韩aaaa| 色婷婷操逼| av大香蕉| 婷综合六月| 丁香五月久久| 色色丁香五月婷婷| 天天天天天天操| 九九操操| 国产五月视频| 97色视频网| 婷香五月网在线| 亚洲色色香蕉| 黄色片区子| 中国操逼99| 新激情综合| 99热热九九| 婷婷五月天亚洲| 日本三级韩三级99久久| 婷婷五月欧美综合| 欧美、日韩、中文、制服、人妻| 天天 青草 制服丝袜 在线| 色色婷婷综合网| 五月婷婷丁香网| 婷婷亚州综合| 丁香五月天AV在线 | 深爱五月中文字幕| 综合色影| 午夜丁香六月婷| 99激情| 中文字幕成人| 婷婷色偷拍| 色VA| 丁香五月AV| 操逼在线视频| xxxx久| 丁香婷婷五月色综合| 丁香五月婷婷av| 夜夜撸天天日| 久久精品人妻| 久久182| 综合久久丁香婷婷,五月婷婷六月丁香,开心激情综合网,六月丁香在线观看,婷婷丁 | 99热精品在线在线| 亚洲成Av人片乱码色第1集| 精品乱码视频| 激情婷婷网| 亚洲激情综合| 国产高清av黄色看片| 综合激情五月天| 野战毛片三一3| 婷婷99狠狠躁天天躁| 综合狠狠干| 2050人人操免费工开爱| 欧美啪啪9| 91伦| 99re这里只有精品国产99| 婷婷激情人妻| 狠狠噪| 热久久77777| 99热青青草| 热无码A∨| 日日操,夜夜撸| 99热这里只有精品最新| 久久精品亚洲一级牲爱综合| 精品草原久久视频| 亚洲久久激情| 激情六月丁香| 99热综合网| 久久婷婷五月天蜜桃| 婷婷五月天综合小说网| 国产精品成人AV在线观看春天| www狠狠| 日韩AAAAAAAAAAA片| 影音先锋男人AV资源站| 青青操avbb| 另类激情综合| 成人 在线 日韩| 狠狠狠狠狠| 丁香五月WWW| 天天爽天天爽夜夜爽| 日日干夜夜干| www.xtbsty.cn.com蜜乳AV| 99热99美国在线观看| 五月丁香婷婷综合网色欲| 青草性爱视频| 在线日韩视频| 婷五月丁香俺| 日本超碰在线| 亚洲成人高清在线| 色婷婷五月综合在线| 艹色18p| 成人五月天视频播放| 免费黄色视频网址| 六月婷婷天天操夜夜爽视频| 五月丁香婷婷久久| 婷婷五月丁香超碰| 色色色综合网| 狠狠久久婷婷| 天天插,天天射| 91N 一起草| 性天天中文网| 亚洲成人精品三区| 天天日夜夜帕| 九九激情| www.婷婷五月| 人人插9| 丁香六月综合| 99噜噜| 超碰91在线| 九九综合伊人| 天天天天天日| 六月婷婷俺也去| 九月丁香婷婷| 丁香婷婷人妻综合网| 伊人综合网站| 人妻久久久久久久久妻久久久久| 亚洲精| 精品五月天| 午夜69成人做爰视频| 亚洲综合视频在线| 欧美成人精品老美女噜噜噜| 欧美久热| 色婷婷影| 色色色国产| 天天干天天干天天操| 亚韩在线视频| 99热这里只有精品55| 天天成人综合| 国产成人AV不卡| 天天色天天爱天天爱天天爱y| 激情五月天激情小说| 久久这里只有国产视频| 五月天激情小说| 色综合九九| 青草五月天| 狠狠狠狠狠狠草| 五月丁香直播| 五月天啪啪| 香蕉婷婷色五月| 五月婷婷之综合激情| 国产又黄又爽又色的免费| 国产韩日亚洲美州欧亚综合在线| 狠狠操狠狠插| 色色色宗合网| 五月天婷爱综合| 国产精自产拍久久久久久蜜| 丁香五月网址| 日本久久人| 国产肏屄大片| 丁香婷婷色| 五月天天综合网色婷婷| 甈你aaaaa| 天天日夜夜| 99r久久这里只有精品| 亚洲操B| 淫视馆AV在线| A片一曲| 中美日韩成人在线| 五月天激情视频| 五月亭大香蕉| 天天干天天插| 久久一伦| www,天天干| 操人精品| 亚州色色色| 婷婷爱五月| 另类图片激情五月| 九九九九九九毛片| 极品另类| 久热一本| 另类A片| 九九热在线观看6| 99久久这里只有精品| 亚洲色婷婷色| 激情色播|