From 95b658b4a01e3340eb22f9a77dea384ed4caead2 Mon Sep 17 00:00:00 2001 From: jlzhou <12020042@qq.com> Date: Mon, 18 Nov 2024 15:39:46 +0800 Subject: [PATCH] update crypto --- admin-ui/package.json | 1 + admin-ui/pnpm-lock.yaml | 8 +++ admin-ui/src/utils/crypto/fileHash.js | 60 +++++++++++++++++++++ admin-ui/src/utils/crypto/index.js | 75 +++++++++++++++++++++++++++ 4 files changed, 144 insertions(+) create mode 100644 admin-ui/src/utils/crypto/fileHash.js create mode 100644 admin-ui/src/utils/crypto/index.js diff --git a/admin-ui/package.json b/admin-ui/package.json index 4432e11..bb01417 100644 --- a/admin-ui/package.json +++ b/admin-ui/package.json @@ -18,6 +18,7 @@ "@vueup/vue-quill": "1.1.0", "@vueuse/core": "9.5.0", "axios": "0.27.2", + "crypto-js": "^4.2.0", "echarts": "5.4.0", "element-plus": "^2.8.4", "file-saver": "2.0.5", diff --git a/admin-ui/pnpm-lock.yaml b/admin-ui/pnpm-lock.yaml index 5d236db..56f6185 100644 --- a/admin-ui/pnpm-lock.yaml +++ b/admin-ui/pnpm-lock.yaml @@ -20,6 +20,9 @@ importers: axios: specifier: 0.27.2 version: 0.27.2 + crypto-js: + specifier: ^4.2.0 + version: 4.2.0 echarts: specifier: 5.4.0 version: 5.4.0 @@ -398,6 +401,9 @@ packages: resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} engines: {node: '>= 0.10'} + crypto-js@4.2.0: + resolution: {integrity: sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==} + css-select@4.3.0: resolution: {integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==} @@ -2039,6 +2045,8 @@ snapshots: object-assign: 4.1.1 vary: 1.1.2 + crypto-js@4.2.0: {} + css-select@4.3.0: dependencies: boolbase: 1.0.0 diff --git a/admin-ui/src/utils/crypto/fileHash.js b/admin-ui/src/utils/crypto/fileHash.js new file mode 100644 index 0000000..87c64ea --- /dev/null +++ b/admin-ui/src/utils/crypto/fileHash.js @@ -0,0 +1,60 @@ +import CryptoJS from 'crypto-js/crypto-js' + + +const bufferChunkSize = 1024 * 1024 * 5; + +export const fileHash = (file, config={}) => { + config = { + algo: 'MD5', + enc: 'Hex', + onProgress: (a,b)=>{console.debug(a,b)} + ,...config + } + return new Promise((resolve, reject) => { + if(file==null || file.size==0){ + resolve(null) + return + } + const hash = CryptoJS.algo[config.algo].create() + let count = 0; + const reader = new FileReader() + + // 以流的方式读取文件 + function readChunk(start, end) { + const slice = file.slice(start, end) + reader.readAsArrayBuffer(slice); + } + + // 递归读取文件的每个分块 + function processChunk(offset) { + const start = offset; + const end = Math.min(start + bufferChunkSize, file.size) + count = end + + readChunk(start, end) + } + + // 当读取完整个文件后,计算哈希值并返回 + reader.onloadend = function () { + const arrayBuffer = reader.result + const wordArray = CryptoJS.lib.WordArray.create(arrayBuffer) + + // 更新哈希对象 + hash.update(wordArray) + config.onProgress(count,file.size) + if (count < file.size) { + // 继续处理下一个分块 + processChunk(count) + } + else { + // 计算哈希值并返回 + const ret = hash.finalize() + resolve(ret.toString(CryptoJS.enc.Hex)) + } + } + config.onProgress(count,file.size) + // 开始处理文件内容分块 + processChunk(0) + + }) +} \ No newline at end of file diff --git a/admin-ui/src/utils/crypto/index.js b/admin-ui/src/utils/crypto/index.js new file mode 100644 index 0000000..6cdc01c --- /dev/null +++ b/admin-ui/src/utils/crypto/index.js @@ -0,0 +1,75 @@ +export { fileHash } from './fileHash' + +import CryptoJS from 'crypto-js/crypto-js' + +import { encrypt, decrypt } from '../jsencrypt' + + +const AESKey = "d34xsfljkwSD}2cv32$#%dfdgvcJH{PIOPeopir1KSHD" + +/** + * Base64编码 + * @param {String} str + * @returns + */ +const Base64Encode = (str) => CryptoJS.enc.Base64.stringify(CryptoJS.enc.Utf8.parse(str)) + +/** + * Base64解码 + * @param {String} str + * @returns + */ +const Base64Decode = (str) => CryptoJS.enc.Utf8.stringify(CryptoJS.enc.Base64.parse(str)) + +/** + * 消息摘要md5加密 + * @param {String} str + * @returns + */ +const md5 = (str) => CryptoJS.enc.Hex.stringify(CryptoJS.MD5(str)) + +/** + * 消息摘要sha256加密 + * @param {String} str + * @returns + */ +const sha256 = (str) => CryptoJS.enc.Hex.stringify(CryptoJS.SHA256(str)) + + +/** + * 对称加密AES + * @param {String} str + * @returns + */ +const aesEncrypt = (str) => CryptoJS.AES.encrypt(str, AESKey).toString() +/** + * 对称解密AES + * @param {String} str + * @returns + */ +const aesDecrypt = (str) => CryptoJS.AES.decrypt(str, AESKey).toString(CryptoJS.enc.Utf8) + +export { CryptoJS, Base64Encode, Base64Decode, md5, sha256, encrypt, decrypt, aesEncrypt, aesDecrypt } + + +// let str = "https://evoai.cn" +// let strEncode = Base64Encode(str) +// console.debug("Base64Encode", strEncode) +// console.debug("Base64Decode", Base64Decode(strEncode)) + +// console.debug("md5", md5(str)) +// console.debug("sha256", sha256(str)) + +// strEncode = encrypt(str); +// console.debug("encrypt", strEncode) + +// console.debug("decrypt", decrypt(strEncode)) + +// strEncode = aesEncrypt(str) +// console.debug("aesEncrypt", strEncode) +// console.debug("aesDecrypt", aesDecrypt(strEncode)) + +// console.debug("Hex.stringify",Hex.stringify(str)); +// console.debug("Hex.parse",Hex.parse(Hex.stringify(str))); +// var words = CryptoJS.enc.Base64.parse("SGVsbG8sIFdvcmxkIQ=="); +// console.debug(words)