网站搭建怎么做深圳公司排名名字

张小明 2026/1/11 12:32:26
网站搭建怎么做,深圳公司排名名字,上海网站建设seo公司哪家好,中国正式宣布出兵大文件传输系统设计方案#xff08;基于SM4国密算法#xff09; 需求分析 作为四川某软件公司的开发人员#xff0c;我面临以下核心需求#xff1a; 实现10GB级别大文件的分片上传/下载采用国密SM4算法进行端到端加密服务端需支持SM4加密存储兼容主流浏览器及信创国产化…大文件传输系统设计方案基于SM4国密算法需求分析作为四川某软件公司的开发人员我面临以下核心需求实现10GB级别大文件的分片上传/下载采用国密SM4算法进行端到端加密服务端需支持SM4加密存储兼容主流浏览器及信创国产化环境基于SpringBootVue技术栈需要开源可审查的代码技术选型经过调研我决定采用以下技术方案前端方案基于Vue-cli构建使用自定义分片上传组件替代已停更的WebUploader集成SM4加密的JavaScript实现通过wasm或纯JS实现后端方案SpringBoot 2.7.x集成BouncyCastle的SM4实现支持分片合并和加密存储前端核心代码实现1. SM4加密工具类 (sm4-utils.js)// 使用wasm版本的SM4实现性能更好letsm4Modulenull;exportasyncfunctioninitSM4(){if(sm4Module)return;try{sm4Moduleawaitimport(sm4-wasm);awaitsm4Module.default();// 初始化wasm模块}catch(e){console.error(SM4 WASM加载失败降级使用JS实现,e);// 降级方案使用纯JS实现awaitimport(./sm4-js).then(module{sm4Modulemodule;});}}exportfunctionencryptFileChunk(chunk,key,iv){if(!sm4Module)thrownewError(SM4未初始化);// 转换为ArrayBufferconstarrayBufferchunkinstanceofArrayBuffer?chunk:awaitnewResponse(chunk).arrayBuffer();// 使用SM4-CBC模式加密returnsm4Module.encrypt(arrayBuffer,key,iv,CBC);}exportfunctiondecryptFileChunk(encryptedChunk,key,iv){if(!sm4Module)thrownewError(SM4未初始化);returnsm4Module.decrypt(encryptedChunk,key,iv,CBC);}2. 分片上传组件 (FileUploader.vue)import{initSM4,encryptFileChunk}from./sm4-utils;// 生成随机IVfunctiongenerateIV(){returncrypto.getRandomValues(newUint8Array(16));}exportdefault{data(){return{file:null,uploading:false,progress:0,chunkSize:5*1024*1024,// 5MB每片sm4Key:null,// 实际应从安全渠道获取fileId:null};},asyncmounted(){awaitinitSM4();// 生成随机密钥实际项目应从安全渠道获取this.sm4Keycrypto.getRandomValues(newUint8Array(16));},methods:{handleFileChange(e){this.filee.target.files[0];this.progress0;},asyncstartUpload(){if(!this.file)return;this.uploadingtrue;this.progress0;try{// 1. 初始化上传获取fileIdconstinitResawaitthis.$http.post(/api/upload/init,{fileName:this.file.name,fileSize:this.file.size,chunkSize:this.chunkSize});this.fileIdinitRes.data.fileId;constivgenerateIV();// 2. 上传加密分片constchunkCountMath.ceil(this.file.size/this.chunkSize);letuploadedChunks0;for(leti0;ichunkCount;i){conststarti*this.chunkSize;constendMath.min(startthis.chunkSize,this.file.size);constchunkthis.file.slice(start,end);// 加密分片constencryptedChunkawaitencryptFileChunk(chunk,this.sm4Key,iv);// 上传分片constformDatanewFormData();formData.append(fileId,this.fileId);formData.append(chunkIndex,i);formData.append(chunk,newBlob([encryptedChunk]));formData.append(iv,newBlob([iv]));// 每个分片使用相同IV简单实现awaitthis.$http.post(/api/upload/chunk,formData,{headers:{Content-Type:multipart/form-data}});uploadedChunks;this.progressMath.floor((uploadedChunks/chunkCount)*100);}// 3. 完成上传awaitthis.$http.post(/api/upload/complete,{fileId:this.fileId,iv:Array.from(iv).join(,)// 实际应使用更安全的方式传输IV});this.$emit(upload-success,{fileId:this.fileId,fileName:this.file.name});}catch(error){console.error(上传失败:,error);this.$emit(upload-error,error);}finally{this.uploadingfalse;}}}};后端核心代码实现1. SM4工具类 (SM4Util.java)importorg.bouncycastle.crypto.engines.SM4Engine;importorg.bouncycastle.crypto.modes.CBCBlockCipher;importorg.bouncycastle.crypto.paddings.PaddedBufferedBlockCipher;importorg.bouncycastle.crypto.params.KeyParameter;importorg.bouncycastle.crypto.params.ParametersWithIV;importorg.bouncycastle.jce.provider.BouncyCastleProvider;importjavax.crypto.Cipher;importjavax.crypto.spec.SecretKeySpec;importjava.security.Security;importjava.util.Base64;publicclassSM4Util{static{Security.addProvider(newBouncyCastleProvider());}// 加密文件分片publicstaticbyte[]encrypt(byte[]key,byte[]iv,byte[]input)throwsException{PaddedBufferedBlockCipherciphernewPaddedBufferedBlockCipher(newCBCBlockCipher(newSM4Engine()));cipher.init(true,newParametersWithIV(newKeyParameter(key),iv));byte[]outputnewbyte[cipher.getOutputSize(input.length)];intlencipher.processBytes(input,0,input.length,output,0);lencipher.doFinal(output,len);if(lenoutput.length){byte[]resultnewbyte[len];System.arraycopy(output,0,result,0,len);returnresult;}returnoutput;}// 解密文件分片publicstaticbyte[]decrypt(byte[]key,byte[]iv,byte[]input)throwsException{PaddedBufferedBlockCipherciphernewPaddedBufferedBlockCipher(newCBCBlockCipher(newSM4Engine()));cipher.init(false,newParametersWithIV(newKeyParameter(key),iv));byte[]outputnewbyte[cipher.getOutputSize(input.length)];intlencipher.processBytes(input,0,input.length,output,0);lencipher.doFinal(output,len);if(lenoutput.length){byte[]resultnewbyte[len];System.arraycopy(output,0,result,0,len);returnresult;}returnoutput;}// 使用JCE方式备选方案publicstaticbyte[]encryptJCE(byte[]key,byte[]iv,byte[]input)throwsException{CiphercipherCipher.getInstance(SM4/CBC/PKCS5Padding,BC);SecretKeySpeckeySpecnewSecretKeySpec(key,SM4);cipher.init(Cipher.ENCRYPT_MODE,keySpec,newjavax.crypto.spec.IvParameterSpec(iv));returncipher.doFinal(input);}}2. 文件上传控制器 (FileUploadController.java)importorg.springframework.beans.factory.annotation.Value;importorg.springframework.web.bind.annotation.*;importorg.springframework.web.multipart.MultipartFile;importjava.io.File;importjava.io.FileOutputStream;importjava.nio.file.Files;importjava.nio.file.Paths;importjava.util.Base64;importjava.util.UUID;importjava.util.concurrent.ConcurrentHashMap;RestControllerRequestMapping(/api/upload)publicclassFileUploadController{Value(${file.upload-dir})privateStringuploadDir;// 临时存储上传状态privatefinalConcurrentHashMapsessionsnewConcurrentHashMap();// 初始化上传PostMapping(/init)publicUploadInitResponseinitUpload(RequestBodyUploadInitRequestrequest){StringfileIdUUID.randomUUID().toString();UploadSessionsessionnewUploadSession();session.setFileName(request.getFileName());session.setTotalSize(request.getFileSize());session.setChunkSize(request.getChunkSize());session.setReceivedChunks(0);sessions.put(fileId,session);// 创建临时目录newFile(uploadDir/fileId).mkdirs();returnnewUploadInitResponse(fileId);}// 上传分片PostMapping(/chunk)publicvoiduploadChunk(RequestParam(fileId)StringfileId,RequestParam(chunkIndex)intchunkIndex,RequestParam(chunk)MultipartFilechunkFile,RequestParam(iv)StringivBase64)throwsException{UploadSessionsessionsessions.get(fileId);if(sessionnull){thrownewRuntimeException(无效的上传会话);}// 解密分片实际项目中密钥应从安全渠道获取byte[]keyhexStringToByteArray(你的SM4密钥16字节);// 示例实际应从配置或安全存储获取byte[]ivBase64.getDecoder().decode(ivBase64);byte[]encryptedChunkchunkFile.getBytes();byte[]decryptedChunkSM4Util.decrypt(key,iv,encryptedChunk);// 保存分片StringchunkPathuploadDir/fileId/chunkIndex;try(FileOutputStreamfosnewFileOutputStream(chunkPath)){fos.write(decryptedChunk);}session.setReceivedChunks(session.getReceivedChunks()1);}// 完成上传PostMapping(/complete)publicUploadCompleteResponsecompleteUpload(RequestBodyUploadCompleteRequestrequest)throwsException{StringfileIdrequest.getFileId();UploadSessionsessionsessions.get(fileId);if(sessionnull){thrownewRuntimeException(无效的上传会话);}// 合并分片StringtempDiruploadDir/fileId;StringfinalPathuploadDir/fileId.enc;// 加密存储try(FileOutputStreamfosnewFileOutputStream(finalPath)){for(inti0;isession.getTotalChunks();i){byte[]chunkFiles.readAllBytes(Paths.get(tempDir/i));fos.write(chunk);}}// 清理临时文件Files.walk(Paths.get(tempDir)).sorted((a,b)-b.compareTo(a))// 反向排序先删文件再删目录.forEach(path-{try{Files.delete(path);}catch(Exceptione){// 记录日志}});// 存储文件元信息实际项目应存入数据库FileMetametanewFileMeta();meta.setFileId(fileId);meta.setOriginalName(session.getFileName());meta.setEncryptedPath(finalPath);meta.setSize(session.getTotalSize());// 这里应该将meta保存到数据库returnnewUploadCompleteResponse(fileId,session.getFileName());}// 计算总分片数privateintcalculateTotalChunks(longfileSize,intchunkSize){return(int)Math.ceil((double)fileSize/chunkSize);}// 内部类定义省略...}信创环境兼容性考虑前端兼容性提供wasm和纯JS两套SM4实现wasm优先使用标准的Web API避免使用实验性功能测试环境包括麒麟OS飞腾CPU、UOS龙芯等组合后端兼容性使用BouncyCastle作为密码学提供者兼容国产CPU指令集避免使用与特定JDK版本绑定的API测试环境包括中科方德JDK、华为Kunpeng JDK等安全考虑密钥管理示例中简化了密钥处理实际项目应使用硬件加密机或软HSM管理主密钥每个文件使用随机生成的密钥通过主密钥加密后传输考虑使用国密SSL/TLS (GMTLS)传输安全所有通信必须通过HTTPS考虑使用双向SSL认证存储安全服务端存储的是加密后的文件只有授权用户才能获取解密密钥性能优化建议前端可实现断点续传记录已上传分片后端可使用异步处理合并分片操作对于超大文件考虑使用更高效的存储格式实现分片校验机制确保数据完整性总结本方案提供了完整的SM4加密大文件传输实现从前端分片加密到后端存储都符合国密要求。代码结构清晰便于进行源代码审查。虽然实现起来比使用现成组件复杂但完全可控且符合政府单位的安全要求。下一步工作建议完善密钥管理方案增加下载功能实现添加更完善的错误处理和日志进行全面的性能测试和安全审计将组件复制到项目中示例中已经包含此目录引入组件配置接口地址接口地址分别对应文件初始化文件数据上传文件进度文件上传完毕文件删除文件夹初始化文件夹删除文件列表参考http://www.ncmem.com/doc/view.aspx?ide1f49f3e1d4742e19135e00bd41fa3de处理事件启动测试启动成功效果数据库效果预览文件上传文件刷新续传支持离线保存文件进度在关闭浏览器刷新浏览器后进行不丢失仍然能够继续上传文件夹上传支持上传文件夹并保留层级结构同样支持进度信息离线保存刷新页面关闭页面重启系统不丢失上传进度。批量下载支持文件批量下载下载续传文件下载支持离线保存进度信息刷新页面关闭页面重启系统均不会丢失进度信息。文件夹下载支持下载文件夹并保留层级结构不打包不占用服务器资源。下载示例点击下载完整示例
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

做网站大概需要几个人ipv6域名解析 做网站

如何实现抖音直播自动录制:技术方案与实战指南 【免费下载链接】DouyinLiveRecorder 项目地址: https://gitcode.com/gh_mirrors/do/DouyinLiveRecorder 在内容创作者和直播爱好者日益增多的今天,抖音直播自动录制已成为许多用户的核心需求。传统…

张小明 2026/1/3 4:44:14 网站建设

网站在百度上搜索不到旅发集团网站建设方案

前言 网络安全渗透测试是验证系统安全性的一种重要手段,通过对系统的弱点、漏洞、配置缺陷等进行深入探测和分析,以评估系统的安全性。 以下是网络安全渗透中常用的10种渗透测试方式: 1. 端口扫描: 利用扫描工具对目标主机开放…

张小明 2026/1/3 4:43:41 网站建设

网站建设与应用教案做平面什么网站的素材不侵权

第一章:Open-AutoGLM开发硬件Open-AutoGLM 是一个面向自动化代码生成与自然语言理解的开源大语言模型项目,其本地化部署和高效推理依赖于合理的硬件配置。选择合适的计算平台不仅能提升模型训练效率,还能优化推理延迟与资源利用率。核心硬件要…

张小明 2026/1/4 5:23:10 网站建设

做网站找哪家好要钱吗作文网站大全

想要随时随地享受Zwift虚拟骑行而不受网络限制?zoffline作为专业的Zwift离线服务器解决方案,让你无需订阅即可畅玩虚拟骑行离线版。这款开源工具通过模拟Zwift服务器环境,为骑行爱好者提供完全离线的虚拟骑行体验。 【免费下载链接】zwift-of…

张小明 2026/1/9 17:33:23 网站建设

网站制作案例流程图产品营销策划方案3000字

Mac百度网盘极速下载终极指南:开源插件解锁全速体验 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 作为一名Mac用户,你是否经历…

张小明 2026/1/10 1:51:47 网站建设