日韩精品一区二区三区在线视频放-无码中文字幕V?一区二区-成年片免费观看视频-国内少妇人妻丰满av-国产精品中文字幕免费观看-亚洲成人久久一区二区三区-国内少妇偷人精品视频无缓冲-一区二区国产精品日本一区二区三区在线网

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年還在維護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加密文件二進制內(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)容加密后再進行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)這種方式適合小文件和中等文件因為它是把整個文件讀進內(nèi)存再加密文件太大的話前端會有內(nèi)存壓力。第二種如果文件超大比如視頻、壓縮包WebUploader本身支持分片上傳但分片加密會引入“每個分片需要獨立IV和密鑰”的復(fù)雜度。這個項目里我暫時沒做分片級加密因為實際業(yè)務(wù)上傳的文件平均都在1MB以內(nèi)ArrayBuffer方式完全能扛住。如果你接手的是要傳大片視頻的項目我給個建議每個分片用相同的密鑰但每個分片隨機生成IV傳輸時把IV和分片密文一起發(fā)給后端后端按分片索引依次解密后拼接。這樣能把“加密”和“斷點續(xù)傳”兩個需求同時滿足分片加密的代碼量其實只多幾十行。3.4 非對稱加密保護和字段封裝生成了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塞進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對象的一個擴展屬性把加密后的內(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合并進上傳請求 // 同時我們把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)“上傳文件為空”或者進度條不動的問題。很多人在這里卡了很久其實就這么簡單。第二個坑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實例直接放進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 二進制密文內(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中文文件名無亂碼重放攻擊防護增加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)容就是加密后的二進制最后一句話前端加密的密文傳到后端時multipart/form-data是二進制流不會做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ù)進出后瀏覽器內(nèi)存持續(xù)暴漲大概率就是這個問題。不用全組銷毀只要在離開時destroy就行。7.5 加密后文件上傳到OSS但無法在線上預(yù)覽加密存儲的代價就是所有依賴完整文件的預(yù)覽能力都沒了因為OSS里存的是密文。這個在需求階段就要和產(chǎn)品確認(rèn)清楚。如果需要預(yù)覽有兩種常見解法后端解密后通過一個臨時簽名的接口輸出到瀏覽器預(yù)覽預(yù)覽完即失效把縮略圖或視頻轉(zhuǎn)碼流放行成明文原始文件保持密文我在項目里是先把圖片壓縮生成一個縮略圖明文只對原始文件加密。這樣列表頁展示縮略圖不受影響下載原文件時才走解密接口。這個方案兼顧了體驗和安全推薦給你參考。8. 安全加固與擴展實踐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ò)安全等級保護要求高的場景這層簽名是很有必要的。8.3 后續(xù)擴展方向這個方案后續(xù)還可以做幾個擴展把加密從“上傳加密”擴展到“下載解密”后端存密文用戶下載時前端解密展示全程不在服務(wù)器落明文引入文件指紋MD5、SHA-256在上傳前先做秒傳判斷同時保證加密后的文件指紋一致可以用來去重結(jié)合消息隊列做異步解密任務(wù)避免大文件解密時阻塞主線程影響其他接口響應(yīng)在我做過的系統(tǒng)里擴展方向往往取決于業(yè)務(wù)對文件安全重視到什么程度。加密是一個不能只做一半的事情前端加密了后端存儲還暴露明文就白做了后端解密后又會把明文暴露在接口層也要加權(quán)限控制。所以全鏈路都要考慮到才能算完成了一次加密存儲改造。最后說一點個人體會前端加密從來都不是萬能的密鑰、算法、傳輸、存儲、權(quán)限每個環(huán)節(jié)都可能成為短板。但在現(xiàn)實項目里RSAAES混合加密已經(jīng)是性價比最高的方案了——性能開銷可接受、破解難度足夠、實現(xiàn)成本也不算高。如果你和我一樣在維護老項目這套東西真的可以直接復(fù)制過去用比從零搭一套安全體系省太多事了。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
曰韩av中文字幕专区| 国产一进一出视频网站| 国产综合永久精品日韩鬼片| 视频黄色国产一级| 国产精品69久久久久孕妇欧美| 一级A片女人高潮叫床| 中文字幕免费在线观看| 色九月综合| 一区二区三区欧美激情| 国产美女口爆吞精视频| 九九九九精| 欧美色图成人网一区二区| 久久青青草原免费视频| 人妻一区二区三区| 亚洲欧美一区二区三区一猛片| 欧美第五页| 99色在线视频| 国产女生在线| 久久久国产亚洲精品系列| 久久69| 久久偷偷色综合蜜桃| 久久久久成人蜜桃精品| 蜜乳av首页| 天天懆天天日| 一级性爱啪啪视频| 欧美精品二区视频在线| 大色综合| 91av熟女人妻| 国产精品不卡高清在线观看| 男人的天堂2000| 伊人黄色视频免费观看| 久久精品国产亚洲AV成人直播| 欧美 亚洲精品首页| 精彩久久中文| 国产精品亚洲美女久久久久| 日韩欧美经典在线观看| 国产精品女生av| 91人妻在线视频| 唯美清纯 妖精视频| 9ⅰ久久久天天| 久久久婷婷| 中文字幕 码精品视频网站| 操逼视频免费日韩无码| 精品国产乱码久久久久久口爆网站 | 欧美片第一页| 国产一区二区免费福利片| 熟女激情综合网| 久久久久97| 乱操乱伦AV| 色在线亚洲视频www| 天天色播亚洲综合网站| 国产精品视频精品一二| 久久久久久久 九九九九九九九| 熟女人妻av在线资源,黄色的资源| 97干日韩| 久久久内射良家| 亚洲一区深夜| 久久久久免费少妇| 怡红院怡春院| 天天操熟妇| 张柏芝国产一区在线观看| 日本性爱视频一级| 久超碰这里只有精品| av 模特一区了| 亚洲国男人的天堂| 欧美亚洲影视| 91亚·色| 欧美色91| 久草国产在线视频| 一区中文字幕二区日韩| 亚州乱码中文字幕综合久久久| 丝袜 亚洲 偷拍| 日本三级久| 欧美日韩人妻少妇 一区二区三区| 东北女人性交| 日韩欧美中文日韩欧美色| 黄色av一区二区在线| 欧美青青视频| 豆花视频操逼网址| 亚州操操穴网| 色色青青久久| 男女啪啪啪18禁网站| 日本Xx性爱| 日韩久久艹| 亚洲成人激情小说视频| 五月综合久久| 亚洲男人天堂网| 欧美日韩色综合网| 亚洲日韩久久精品一区| 立川理惠无码一区二区| 人妻在线中出视频| 少妇一级无码精品| 日韩综合97P| 97色妞| 97国产伦理| 狠狠图片青青草| 亚洲天堂,男人| 色妺妺在线视频| 青草伊人网| 午夜男人一级A片7777| 亚av顶级裸体一区二区三区四区五区 | 欧美午夜熟妇黑人精品91| 啪啪视频亚洲第一| 青青草白白色| 国产精品老师| 国产精品美女视频诱惑| av天堂5| 亚洲丝袜少妇在线| 欧州激情视频在线一区二区| 黑人狂躁日本妞一区二区三区| 天天综合日韩网| 69XX一中文字幕人妻91| 久久久久婷婷精品av电影| 太久视频| 欧色网址| AV99热18这里只有精品| 992这里有精品| 91超碰在线| 天天综合香 ld视频| 自怕偷自怕亚洲精品| 插入粉嫩少妇视频| 色婷婷九月| 四虎午夜影院| 欧美加勒比| 六月婷激情福利天堂69| 久操不卡视频| 日本女优在线视频福利| 国产偷人伦激情在线观看| 亚洲激情在线| 999熟女精品| 丁香五月天啪啪| 99久久99久久免费精品蜜臀| 久久精品中文| 一本久久精品中文字| 伊人天堂在线| 长长久久曰曰夜夜成人网| 91久久九九精品国产综合| 午夜精品久久久99热蜜桃的功能特点| 91美腿丝袜在线观看| 强奸乱伦麻豆| 浓厚中出中文字幕在线| 国产精品白丝www| 久久精品99久久久久久| 亚洲成人色情五月天丁香花| 国产白丝在线| 日本99一区二区| 四季AV综合网址| 极品白嫩福利在线| 伊人久久88国产女| 亚洲五月丁香花狠狠干一区二区三区| 自拍偷拍 日韩无码| 国产丝袜欧美在线视频| 人人人摸人人| 色色色日本| 欧美18老人禁| 欧美黑人精品在线播放| 亚洲成人免费在线| 96AV精品| 亚洲欧美日韩电影网站一区 | 大香蕉天天看妹子| 国产精品亚洲日韩骚欢乐谷最新地址发布页huanieguty性屋娱乐妖精视频 | 在线性黄高清免费视频| 亚洲黄色影视| 亚洲图片欧美制度| 狠狠做深爱婷婷久久二区| 久久9999| 一区二区乱码福利| 黑人精品成人一区二区三区| 狠狠穞A片一區二區三區| 久综合网| 秋霞福利网| 热热色青青草| 亚洲AV无码AV吞精久久久久| h在线看免费版在线看| 亚洲美乱| 女人天堂网| 91操操操操| 在线观看日韩av不卡| 久久精品视-一级做a爰片性色毛片16美国-中国女与老外在线精品 | av天堂天堂av日韩| 一级毛片久久久久久久女人18| 热99这里只有精品| 伊人 俄罗斯 a v| 天天操天天舔| 丁香五月婷婷啪啪| 日本精品一区二区三| 亚洲日韩精品一区二区| 日本福利二区视频| 91高潮喷水美女| 成人免费毛片| 东京日日夜夜| 色五月av| 国产11页| 在线洲亚线| 国产久久一区二区三区野外在线| 蜜桃臀av一区二区| 一级性爱aaaa| 熟妇一区,二区,三区。| 在线岛国新天堂8| 97激情97激情| 夜夜骑夜夜操| 天天操天天射青青草| 日本精品一区二区不卡| 亚洲欧美精品一区天堂久久| 亚洲天堂人人妻| 一起草在线视频| 色婷婷久久| 福利视频香蕉免费一区二区在线| 欧美极品女人的天堂| 亚洲图片另类| 日韩素人无码一区二区三区三州| 久肏视频字幕| 亚欧国产无码精品在线| 欧美人妻少妇| 婷婷性网| 日本日日色视频| AV一区观看| 欧洲性人爱视频| av在线免费一区二区| 天天爱综合网| 日韩99神马视频播放片在线播放| 高潮的A片激情扒开一区| AV在线资源| 一块操欧美性爱| 久久区| 日韩欧美被操黄免费观看| 一本久道在线综合视频| 91日韩国产欧美亚洲另类精盘州至城都| 四虎884| 在线啊啊啊啊| 91精品久久久| 亚洲欧美九九| 国产女人操逼视频| 亚洲国产另类在线中文| 久久亚洲天堂| 久久熟妇五十路一区| 亚洲熟女av日韩熟女| 人妻少妇久久中文字幕一区二区 麻豆| 97免费在线视频在线观看| 欧美性生活免费网| 偷拍精品一区二区三区| 亚洲天堂资源在线| 中文字幕精品三级久久久| 久久久精品成人国产| 国产精品久久久久久久久久久久久久久久久久 | 最新国内自拍av免费| 五月天AV资源| 欧美第二页午夜| 男人的天堂色偷偷青青草视频婷婷网| 丁香五月婷婷色| 日本三级一区二区 在线| 加勒比人妻综合| 9 7超碰在线免费观看| 色婷婷电影| 日本黄大片在线观看视频| 欧美大战久久久伊人| 成人AV素股で擦久久| 久热伊人| 中文字幕日产av人| 日本一区二区三区精品| 好吊色一区| 久久天天躁日日躁狠狠躁| 亚洲熟妇丝袜在线观看| 国产日韩精品无码去免费专区国产| 丰满岳乱妇一区二区三区| 日本一区二区三区四区五区六区七区八区九区 | 亚洲人妻五月丁香婷婷| 国产97在线视频| 国产精品爆乳懂色蜜乳| 久久受www免费人成| 午夜乱轮操逼视频免费看| 中文字幕丰满人妻日本| 精品久久久久av影院| 午夜无遮挡男女啪啪视频| 亚洲成人日韩小说| 日本中文字幕在线电影| 台欧久久精品视频| 久操| 91啦人妻| 天天综合网站| www.高清无码诱惑一区.com| 干超碰碰熟女| 欧美精品日韩一区二区| 亚洲人91| 欧亚无码视频| 日本天天吊| 久久久久久中文| 久久成人精品| 三男一女不戴套的A片| 每日更新AV| 高潮嗯啊性感美女久久久| 日日骚一区二区三区| 国产成年免费大片黄在线观看| 性爱动态120秒| 日韩特一级久久| 97爱| 炮色五月| 小说区 图片区色 综合区| 国产精品免费日韩| 久久久久密| 蜜汁欧美| 大香蕉乱伦视频网| 欧美v日韩v亚洲v最新在线| 天天欧美色| 国产精品久久久九九九| 欧美成人免费在线观看| 七久久久| 成人怡红院| 久热伊人| 国产强奸乱伦第1页| 大香蕉一线视频| 99热日| 免费的黄片有限公司| 亚洲蜜臀懂色| www.91人妻.com| 九九九久久久久| 日韩啊V| 久久亚洲熟妇在线视频| 亚欧成人综合影院| 熟妇无码视频三区| 色999五月色| 精品一区二区三区丰满熟女-亚洲欧美一区| 日逼国产| 欧美性夜| 国产熟妇一区二区| 久久九九国产精品| 国产伦精品| 国产欧美一区二区| 国产精品999zyz| 成年在线视频日本亚洲在线视频区精品江靖宇公司 | 青椒国产97在线熟女| 色偷偷色偷偷欧美日韩| 性做久久久久久免费观看软件| 夜夜嗨免费视频| 日本三级韩国三级99| 中国AAAAAA黄色片| 色情婷婷久久五月天| 99热只有| 久久精品日韩| 国产精品熟女一区二区三区| 夜夜夜夜夜夜夜夜夜狠狠狠狠狠狠狠| 这里只有精品视频在线观看麻豆| 熟女91网| 亚洲999综合| 国产成人网站在线观看| 午夜超爽| 无码人妻精品酒店| 亚洲熟女一区二区| 97色涩| 亚洲日韩一区电影| 乱伦日本色图AⅤ| 999久久久免费精品国产牛牛| 欧美性爱18观看| 亚州色交| 校园春色亚洲色图| 国产精品三级视频网站| 青草园大香蕉| 亚洲色五月| 欧美日本不卡在线| 97自拍一区| 五月婷婷丁香中文字幕| 屁股久久久久久| 1.igao73.com 加入收藏 免费专区 国产精品 中文字幕 日韩精品 欧美精品 精彩 | 啊啊啊com| 国产三级在线现体验区| 欧美日韩小说| 校园春色家庭伦理欧美激情| 夜夜久久| 欧色综合| 丰满少妇人妻久久久久久| 丰满高潮18xxxx| 国产熟女无套内射| 久久婷婷一区| 中文字幕色AV| 欧美精品欧美精品系列| 国产精品久久久久久久久久久久久久久| 综合自拍| 亚洲黄色网址视频| 操逼操逼逼操操逼91 | 免费A V在线| 精品国产三级av韩国在线| 九九九九精品视频| 欧美色图欧美| 深夜国产福利| 久久精品国产亚洲AV先锋| 92大香蕉| 又黄又硬又粗又长国产视频| 亚洲欧美综合图片| 青青草在线视频美女| 欧洲亚洲人人爽爽视频| 亚洲中文sv| 操淫穴亚洲五月丁香| 久久久久久久久久久久久久久久9| 少妇一区二区三区在线观看| www.四虎在线| 久久伊人网视频一区二区三区 | 色九九九九久| 91亚洲不卡一区| 久久国产精品熟女人妻| 天天操天天干美女网址导航| 自拍六区| 久久亚州精品成人Av无| 欧亚乱色熟女一区二区| 国内精品伊人久久久久影院会| 婷婷丁香在线| 天天α片| 人妻欧美| 国产尤物AV尤物在线观看不卡| 婷婷中文网| 亚洲天堂男人在线| 校园春色中文字幕AV| 婷婷五月天色网| 97超碰超| 一级aaaaa欧美中文字幕录像片| 欧美一区二区观看在线| 天天爽爽爽爽| 91成人久久| 91精品国| 日本操嫩b网| 蜜臀少妇一区二区| 欧美性五月| 亚洲另类小说卡通动漫| 99久久久无码| 2020中文字幕在线观看| www久| 老女人91| 国产精品亚洲天堂网址| 丁香五月激情综合| 蜜臀99久久精品久久久久久| 亚洲熟女中文字幕在线| baiduhicn.com。| 欧美在线播放| 熟女丰满人妻一区| 国产综合久久久麻桃个| 立川理惠无码一区二区| 激情文学亚洲| 日韩欧美俄罗斯A片| 国产25页| 成人无码在线超碰网| 精品久久99| 天天欧美| 97亚洲性爱| 诱惑网综合| 久久久久久久 九九九九九九九| 色路综合| 色色99| 日夜伊人网| 97超碰国产精品| 欧美日韩在线小说 | 九月丁香婷婷色| 东北老女人的激情视频| av天堂天堂av日韩| 国产97色在线 | 亚洲| 国产无马av| 东北女人性交| 亚州色图狠狠干| 日本视频一区二区三区| 一本一道久久综合久久| 国产成人资源| 天天操天天射天天日| 日日噜噜夜夜久久亚洲一区二区 | 91亚州欧美| 亚洲视频1区| 伊人四虎综合| 国产农村妇女精品1区二区| 久久99午夜精品一区人妻| 性91| 亚洲伊人久久精品影院| 啊啊啊啊一区| aaa一级黄片| 久久国产熟女影院| 天天日天天看| 十八禁电影伊人网| 在线天堂999| 婷婷色播婷婷| 精品人妻av在线播放| 好爽视频在线观看视频| 亚热日本熟女| 久久精品免视看国产成人﹣蜜臀av一区. 久久精品免视看国产成人,蜜臀av一区 | 99在线精品视频| 二三四区精品| 欧美少妇高潮久久91| 欧美 中文字幕 一区| 99热啪啪| 大香蕉九九| 亚洲精品日日夜夜52| 人人摸人人添人人操| 一级人妻性爱视频| 探花视频免费观看国产专区| 青草综合| 亚洲色宗合| 亚洲色图A| 大香蕉2017| 91在线一起| 婷婷20月天青娱乐| 日日摸日日碰夜夜爽视频| 97ai亚洲| 国产精品禁久久久精品| 日产精品久久久一区二区| 久久久久久九九九九九| 欧美一级在线观看成人| 3PAV乱伦视频| 国产精品久久久久久久电影渣男| 男女猛烈无遮掩视频免费软件| 国产偷拍网站| 免费精品中文字幕| 欧美黄色手机在线观看| 色哟哟综合| 黄片在线免费在线观看| 六月婷激情福利天堂69| 日韩精品三区四区| 97精品综合久久网| 亚洲少妇综合| 91丨九色丨国产丨人妻在线| 欧亚在线视频| 天天综合网~91综合网| 成人一二三区| 人人爱人人乐人人操| 男女激烈网站最新| 亚洲影院无码在线| 丰满人妻大屁一区二区| 9.1小视频| 亚洲综合九| 日韩精品-原创伙伴| 91午夜无码| 18一区二区三区| 青青草好吊色| 1024香蕉视频| 高清视频一区| 伊人久久大香大香线蕉中文| 超碰98综合网| 日韩精品黄片免费观看| 伊人色综合欧美| а√天堂资源官网在线资源| 精品久久久九九九孕妇| 91精品丝袜久久久久久| 久久99精品视频| 97欧美资源| 黑操B| 欧美精品黑人猛交高潮| 亚洲18禁| 无遮挡男女激烈动态图| 欧美天堂超碰97| 台湾成人无码AV| 91超碰在线播放| 小情侣高清国产在线视频| chaopen97久久| 91丨九色丨大屁股| 国产午夜在线观看| 九九亚洲精品| 最新精品久久蜜桃| GVH-003 母子姦 青木玲-麻豆视频,麻豆视传媒短视频网站入口,麻豆视传媒官网直 | 精品999999| 麻豆区99999| 人人操我人人干| 大香蕉92| 91色图片| 99热综合| 色嗨嗨在线| 亚洲黄色电影| 中文一区在线日| 久99热| 国产一区二区三区免费视频在性观看| 青青青艹在线视频| 精品精品精品| 韩国女主播青草在线| www.av不卡中文字幕| 久久久久久999| 亚洲免费在线探花| 嗯……啊…嗯嗯…啊…好舒服| 欧洲性爱无码区| 日本熟人妻中文字幕在线|...久久国产精品-国产精品_日本一区二区三区中文字幕 | 亚洲AV无码乱码| 乱欲性色| 国产伦精品一区二区三区在线观| 色臀AV| 日韩av熟女一区二区三区成人| 日本孕妇一区二区视频操逼免费看| 天天做天天爱天天爽AV| 色色色五月婷婷| 国产又粗又大硬免费色网视频| 绑缚麻绳人妻寝取完整版| 亚洲中文字幕三级在线| 26UUU欧美日本| 日本欧美不卡| 大香蕉欧美国产日韩高潮| 天天舔天天 | 麻豆国产精品午夜视频| 日日骚一区二区三区| 综合激情97 | 人人玩人人添人人澡免费| 亚洲日韩美女丝袜美腿人妻视频| 日韩精品影视| 91天堂视频| 欧美视频中文字幕区| 天天视频网站黄| 亚洲成成熟女人综合一区二区| 久9久精品视频| 中文字幕老熟妇黄色视频| 人人操人人操人人人操| 夜夜操美女| 欧美高清无码免费视频高清版| 密臀在线一区尤物| 性色综合网| 久久久精品,3| 久九九九九九九九热| 精品国产乱码久久久久久免费| 大香蕉青青9| 色大香蕉97N| 亚洲中文字幕有码视频一区二区三区| 99免费视频| 青青草中文-久久青草精品一区二区三| 亚洲 欧美 手机在线观看| 国产欧美亚洲精品a第2页| 欧美色性情| 青草地一本线一区二区三区| 国产精品农村妇女精品| 夜夜嗨老熟女AV一区二区三区| 九九亚洲精品| 91影视亚洲| 国产AV中文| 亚洲精品人体| 国产精品毛片?v一区二区三区| 中文字幕精品免费一区二区| 国产极品精品美女视频| 天堂无码精品国产久| 日本韩国国产精品一区| 国产一区二区三区导航| 中文字幕 码 自拍 视频 区| 久久久久9999妇女| 韩日自拍| 中文字幕欧美日韩三级| 亚洲国产一区二区日韩专区| 日韩av一级黄片| 台欧久久精品视频| 精品美女久久一二三| 超碰九九| 超碰色综合| 免费观看网黄| 最新欧美色网| 中日992视频| 国语对白露脸XXXXXX| 国产啊v在线免费播放| 免费一级欧美片片线观看| 国产综合久久久鬼色| 久久久久女教师免费一区| 曰韩操B| 色婷婷综合久久久久中文国产精品一区中文字幕,国产福利电影一区二区三区 | 亚洲成人久久美女| 欧美中文字幕一区 | 中文AV制服乱伦| 成人五月香网在线| 精品无码少妇| 无码又爽又硬又激情免费视频| 97久久久精品| 国产精品爆乳懂色蜜乳| 炮色五月| 国产精品ww久久| 九九Av| 午夜一区| 三级片网站在线播放| 午夜精品久久久久| 成人午夜高潮av猛片| 中文字幕二区日韩天堂| 国产乱子伦久久精品综合一区二区三| 亚洲人妻AV| 久久机热| 国产亚洲精品第一最新| 白丝少妇一区二区| 精品亚洲国产成人精品| 亚洲中文sv| 日日爽夜夜爽| 1级黄色夫妻对换性交免费看| 国产污视频麻豆传媒一区二区| 欧美天天综合| 上床不卡网站| 中文字幕一区二区在线日韩精品| 黄页网站成人免费| 大香蕉综合在线| 亚洲综合色在线| 国精精品无码一二三区水多多| 舔舔啊| 伊人久久大香线综合无码| 超碰97人妻免费在线| 91碰碰| 亚州宗合另类| 能在线播放的国产三级| 亚洲性少妇| 五月天激情四射| 97在线免费看视频| 男人的亚洲天堂| 成人五月香网在线| 欧美一区二区三区四区综合| 91天美免费| 日日夜夜国产综合| 欧美午夜精品久久久久久3D| 新版天堂中文资源8在线| 国产精品爆乳懂色蜜乳| 超碰久草| 久久日本熟妇熟色高清| 色蜜AV| 国产精品无码AV网站| 内射小黄片| 思思久热在线精品66| 亚洲不雅视频1区二区| 天欧美在线| 亚洲第一色页夜| 欧美综合站| 精品国产久热在线观看| 国产美女自拍AV| 日韩无码三级影院| 国产捆绑一区| 亚洲黄色| 亚洲动态色图| 少妇一区二区三区| 99热在线播放| 亚洲色图欧洲| 欧美 亚洲 综合 制服 另类| 天天爽天天| 无码国产精品久久久久| 岛国激情视频在线观看| 91精品人妻偷情| 国产黄色视频久久| 亚洲色图欧美色图日韩色图| 二男一女成人A片| 91在线视频观看国产| 日本Xx性爱| 97精品综合久久| 97人妻免费中文字幕| 国产女人高潮嗷嗷嗷叫小说| 操逼操逼逼操操逼91| 丁香色五月 97干| 射丝袜高跟鞋99| 欧美韩日精品资源| 国产青视频| 亚洲清纯唯美| 欧美 亚洲| 亚洲一区中文精品| 欧亚成人| 亚洲丁香花色| 又大又白奶子| 日韩在线观看AV| 国产精品精品系列在线观看| 熟女色综合久久| 啊啊啊啊视频免费| 亚洲天堂少妇| 亚洲最新av无码成人精品区| 深夜啪啪啪视频免费| 超碰97玖玖爱| 99re99| 白嫩国模丰满一二三区| 人妻久热在线| 狠狠干2020| 日韩成人精品| 超碰人人在线| 欧美日韩精品国产91| 国产精品农村妇女| 欧美伊人久久综合网| 天天做天天爱| 男女啊啊啊| 人人干人人搞人人摸| 日日干日日操五月天伦理视频| 国产精品乱码久久| 丁香婷婷大香蕉| 日本黄页视频在线观看| 成人乱人伦一区二区| 久久久人体| 欧美另类丝袜熟女| 中国亚洲呦女专区| 人人澡人人澡人人| 丁香五月成人| 久久久久久久97| www.91色综合| 91丨人妻丨国产丨丝袜| 激情五月丁香五月| 一本久道久久综合狠狠爱一密臀精| 天堂无码精品国产久| 亚洲欧洲激情| 久久久com| 婷婷久久五月综合激情| 欧洲亚洲人妻无码中字久久三区四区| 一区二区三区亚洲| 色97国产69香蕉| 人妻少妇一区二区| 中文字幕av亚洲精品| 久久综合女优| 97最新在线播放视频| 天天干人人乐| 偷拍 精品另类 凸凹了四区| 尹人免费观看视频在线| 超碰538| 亚洲人妻AV| 亚洲欧美日韩偷拍色图| 夜草欧美| 日韩AV一起草| 麻豆三极片| 久日综合网| 99ri视频| 色欲久久久久综合网| 特级大荫道BBwBBwBBW| 日本黄色大片一级视频免费麻豆| 日韩欧视频| 欧美日韩另类字幕中文| 色一射色一射| 色欲日韩欧美在线一区| 成人自拍三级在线观看| 天天综合色图| 99精品无码| 天堂涩涩| 精品然女一区二区| 亚洲18禁| 久久婷婷五月综合| 996热| 国产绿奴视频在线观看| 欧美日韩91| 亚洲第一黄色av网站| 午夜福利一区二区影院| 久久久久久9| 久久久久久久| 91人人| 亚洲 暴爽 AV人人爽日日碰| 日日骚网站| 综合亚洲网| 97国产|免费| 狠狠爱夜夜| 亚洲高清欧美总合| 自拍六区| 超碰91在线| 国产又黄又爽| 人妻丰满熟妇一区二区三| 久久精品国产99精品亚洲蜜...| 亚洲欧美日韩激情不卡| 国产狂喷潮在线精品| 无码国产Av| 亚洲欧综合另类无码一区| 两性色网| 五月婷丁香| 草b在线| 欧美 熟女 日韩| 啊啊啊啊啊好舒服视频| 香蕉大久久久| 国产精品另类| 亚洲精品久久久久毛片A片拉屎 | 91色伦| 九九九色| 日本操大逼| 97摸视频| 激情图片伦理国产一区二区日韩| 免费成人在线熟妇网| 一区超碰一区| 国产亚洲99久久精品熟| 五月婷婷久久综合| 蜜臀av在线播放一区二区三区| 日本一片一区| 婷婷久久久精品| 麻豆国产97在线| 亚洲成人在线高清| 亚洲中文字幕三级在线| 男人天堂综合| 亚洲国产日韩精品久久久| 377p欧洲日本亚洲大胆| 婷婷综合五月| 欧洲乱码一区二区| 9I1性色影院| www.久久| 人人九九精| 国产特级毛片AAAAAA高潮流水 | 亚洲 在线| 欧美黄色片AAAAA| 亚洲丝袜制服国产91_国语字幕免费观看完整版下载第5集_ | 日韩大香蕉精品在线视频| 乱伦熟女论坛| 肉丝网站91| 美女裸体无遮挡永久免费观看网站 | 九九色综合| 国产AV中文| 欧美激情五月天| 久操免费观看| 丰满人妻-区二区三区免费| 99少妇内射| 久久久久久久一级黄色打同平台| 人澡逼| 精品人妻av在线播放| 97一本大道亚洲一区| 欧美1区二区三区公司| 嗯啊不要啊啊在线观看视频| www国产无码| 激情文学 国产一二三aV| 美女尤物人人操| 人人澡人人澡人人| 国产欧美美女免费观看视频| 精品国产一区二区三区在线播出| 久噜噜| 岛国黄色大片网站| 欧美高潮| 人妻熟女一区在| 亚洲欧洲自拍图片专区满春格 | 国产精品人妻无码久久久老鸭窝| 思思热在线视频精品| 黄色激情电影在线观看| 日韩欧美~中文字| 欧美性暴力猛交XXXX| 久久精品国产亚洲AV嘿嘿| 精品97久久| 欧美狠狠弄| 激情视频网址| 亚洲 欧美 偷拍 唯美| 久9九综合在线| 伊人久久亚洲中文字幕不卡| 亚欧国产无码精品在线| 躁躁躁日日躁2020| 狠狠躁日日躁夜夜躁A| 婷婷性爱| 中文字幕交换人妻| 蜜乳中文字幕a在线| 99re黄 | 色老汉色| 欧美拳交在线播放| 日本在线播放不卡一区| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区老师黑人潮喷一 | 亚洲日本天堂| 超碰精品| 女人的久久久| 亚洲免费人妻在| 亚洲精品国产专区在线观看| 九九九九精| 午夜无码熟妇丰满人妻| 日本蜜桃| 大香蕉碰碰| 日韩三级久久久| www.色婷婷.com| 丁香五月婷婷色| 亚洲成av人片色午夜乱码| 激情无码日韩| 久久九九视频九九视频| 久操网无码在线| 无码WWW免费视频网站| 亚洲欧美国产成人综合不卡| 人妻日日干| 这里只有精品视频在线| 9久精品| 欧美黑人XXXⅩ高潮交| 色一射色一射| 亚洲第91页 | 色噜噜人妻丝袜a∨先锋影| 青青久久手机线视频| 26UUU欧美激情一区二区| 国产精品女生av| 国产h片在线观看视频| 久久五月视频| 日韩午夜啪啪视频| 国产白嫩精品久久| 精品性爱久久视频| 久久久成人免费av电影| 日韩大香蕉AV影片| 亚洲国产成人精品999| 91视频伊人| 一区二区三区机械有限公司| 91丝袜激情在线| 久久伊人东京热| 大香蕉视频一二三区| 人人看人人摸人人色| 97午夜剧场日韩| 色偷综合| 成人精品在线免费视频| 婷婷丁香五月激情啪啪| 国产精品制服丝袜中文字幕日韩一区二区三区| 天美精品av| 在线小说视频一区| 欧美性爱免费短视频| 99久久婷婷| 久久超碰av在线| 色色毛片| 天天综合~91入口| 4虎在线视频| 日本Xx性爱| 久久綜合很很很| 成人一二| 国产原创精品| 久久产精品一区二区三区电影| 国产精品色片一区二区| 欧美激情视频一区二区三区不卡| 亚洲女优有码无码高清| 午夜国产成人精品视频| 99国内精品| 欧美在线永久天堂| 久久久久久久久九九久孕交| av毛片aaaaa免费看| 日韩在线AB| 无码操逼视频一下| 亚洲熟女国产综合另类| 欧美精品69性爱| 在线啊啊啊啊| 老熟女乱伦一区| 97天天操天天干| 岛国网址国产| 日日AAvv| 男人的天堂啪啪啪啪啪蜜桃不卡| 欧美日韩一二三| www久久久| A片大香蕉在线| 欧美国产操逼| 92福利社视频| 日韩激情无码影院| 日韩综合97P| 手机在线人成免费视频| 男人天堂毛片| 久久av色| 秋霞免费AV| 男人的天堂2019| 精品妇操一区二区三区| 美女被艹尤物视频| 久热一区二区| 久久久久久久久久久久久女过产乱-少妇高潮一区二区三区喷水-成人AV | 91人妻爽爽人人做人人澡| 国产aⅴ无码片毛片一级网站| 色香91| 久久春色| 懂色AV中文| 91无人区卡一卡二卡三乱码入口最新版:能让用户有更多选择的选择-经典说说-爱 | 成人五月香网在线| 国产aⅴ无码片毛片一级网站| 国产熟女高潮一区二区三区| 强上我不卡卡| 99综合网| 久久久精品成人国产| 91在线超高颜值国产| 中文字幕后石码四区五区| 免费超碰97久久| 91N综合在线| 国产丰满少妇久久久精品影院| 欧美国产日韩清纯唯美| 懂色AV蜜臀无码精品APP| 日韩黄片影院| 99re在线| 欧美综合网| 精品午夜福利| 97超碰站| 欧美日韩在线视频网站| 91久久婷婷| 日本加勒比无码专区| 亚洲熟女综合网| 五十路熟女人妻一区二区在线观看| 国产区在线| 久久精品国产亚洲AV清纯| 久久婷婷电影网| 人人操人人操人人人操| 午夜视频好爽啊| 精品人妻美妇91job| 九月丁香| 裸模AV女优| 91熟女.com| 视频在线观看青青99国产| 久久啊啊啊| 老外又粗又长一晚做五次| 激情小说成人日本无码一| www.99视频| 啊啊好多水| 精品人妻久久久久一区二区三区| 五月婷亚洲精品天堂| 岛国片在线播放| 九九综合久久| 蜜臀99999| 亚洲视频精选| caoni国产亚洲av| 操碰97| 激情文学小说一区二区| 伊人五月天婷婷| 97色色视频| 97在线观看免费| 亚洲色图 图片| 97国产精品视频| 大香蕉综合网| 一区二区三区一亚洲中文字幕、综合区灬 | 国产亚洲精品自在线亚洲情侣| 青青青青草av在线观看| 中文字幕av一区二区三区人妻少妇| 美女久久久| 99这里有精品视频| 日韩天天本| AAAA级日本片免费视频| 蜜桃视频精品一区二区| 天美传媒av在线| 亚洲无码国产探花在线观看| 久久综合18p| 熟妇一区二区| 成人欧美一区二区三区黑人一| 中出20p| 欧美一区二区福利在线| 天天舔九色婷婷| 视频一区二区三区精品| 秋霞曰韩R级| 欧美色图99| 亚欧韩av| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区 | 色呦呦呦在线观看视频| 在线97在线| 国产高清无码一区三区二区| 日本一区二区电影网站| 国产无码精品成人| 91国产美女丝袜足交精品视频| 中文字幕欧美丝袜07资源| 96久久科窝| 欧美色女人| 欧美在线大香蕉| 岛国艾薇凹凸视频天堂| 9久久久久| 亚洲AV免费在线观看| 国产最火爆久久国产网站网站| 99re6国产精品99re| 手机在线人成免费视频| 97操碰| 色牛aV| 欧美同性恋 的搜索结果 - 91n| 九九九九久久久| 一起草三级AV电影在线观看 | 午夜高清成人在线视频| 日本一二三免费久久| 女人妻一区| 天天躁日日躁AAA片李宗瑞| 男人综合网| 熟女AV一区| 亚洲日韩肥臀视频在线观看| 亚洲男人天堂网久久| 色色色色综合网| 翔田千里无码中出中文字幕| 伊香蕉综合久久久久久久噜噜噜| 久久99深爱久久99精品| 用力操死我| 97超碰美国| 激情五月婷婷综合| 日韩精品 视频一区二区| 九九九九9999| 人妻激情视频| 亚洲 欧美 日韩另类 麻豆| 亚洲人在线成线成人| 婷婷五月丁香五月| 99免费在线视频| 日韩人妻一区二区精品| 中文字幕精品日韩中文字幕| 欧美大波激情xxxx| 97超碰人人操人人操| 亚洲精品人体| 精品国产乱码久久久| 综合第一页| 超碰97 线线 在现| 成人情色综合网| 操淫穴亚洲五月丁香 | 操啊国产| 无码久久国产| 老熟女乱伦一区| 91福利网在线观看| 精品免费视频国产一区| 欧美精品精品一区二区| 成人精品久久久午夜福利| 国产黄片精品在线| 色综合久久88色综合久久天天| 一区二区三区激情在线观看| www.99在线| wwe 天天干.com|