2026/4/18 12:41:55
网站建设
项目流程
人工智能的网站,微信团队小程序,wordpress+翻页函数,百度公司排名多少政府涉密项目大文件传输系统技术方案
——基于信创环境的SM4国密加密与JSP业务集成
一、项目背景与核心需求
作为北京某上市公司项目经理#xff0c;我司承担的某部委涉密项目需实现10GB级安全文件传输#xff0c;并深度集成至现有JSP业务系统。核心需求包括#xff1a; …政府涉密项目大文件传输系统技术方案——基于信创环境的SM4国密加密与JSP业务集成一、项目背景与核心需求作为北京某上市公司项目经理我司承担的某部委涉密项目需实现10GB级安全文件传输并深度集成至现有JSP业务系统。核心需求包括涉密文件传输10GB文件及文件夹保留层级结构上传/下载国密安全要求全程采用SM4算法加密支持人大金仓国产数据库全浏览器兼容IE8及国产浏览器奇安信/红莲花/龙芯信创生态适配操作系统中标麒麟/统信UOS数据库人大金仓V8兼容Oracle语法中间件Tomcat 9.0JSP支持源码可控提供完整源代码支持二次开发如与CA证书集成二、技术选型与架构设计1. 分层架构设计用户终端Web前端JSP服务端国密加密服务人大金仓数据库SM4硬件加密卡业务系统集成2. 关键组件选型组件类型选型方案国产化适配说明前端框架Vue 2.6 jQuery 1.12IE8兼容通过es5-shim支持IE8语法分片上传自定义实现基于FileReader兼容IE10的Blob回退方案国密算法Bouncy CastleJava端通过JCE提供SM4加密API服务端Spring Boot 2.7 JSP保持现有技术栈提供RESTful接口数据库MyBatis 人大金仓V8使用kingbase8JDBC驱动存储本地磁盘 元数据数据库避免依赖FastDFS等分布式系统三、核心代码实现1. 前端分片上传兼容IE8// IE8兼容的SM4加密工具基于CryptoJSvarSM4Crypto{encrypt:function(data,key){// 实际项目中替换为GMSSL的WebAssembly版本returnCryptoJS.SM4.encrypt(data,key).toString();},decrypt:function(ciphertext,key){returnCryptoJS.SM4.decrypt(ciphertext,key).toString(CryptoJS.enc.Utf8);}};// 文件夹上传处理器递归遍历文件树functionFolderUploader(options){this.chunkSize5*1024*1024;// 5MB分片this.fileIdthis._generateUUID();}FolderUploader.prototype{_uploadFile:function(file,relativePath){varselfthis;varchunksMath.ceil(file.size/this.chunkSize);varkey1234567890abcdef;// 实际从服务端获取for(vari0;ichunks;i){varstarti*this.chunkSize;varendMath.min(file.size,startthis.chunkSize);varchunkfile.slice(start,end);varreadernewFileReader();reader.onloadfunction(e){varencryptedSM4Crypto.encrypt(arrayBufferToBase64(e.target.result),key);varformDatanewFormData();formData.append(file,newBlob([encrypted]));formData.append(chunkIndex,i);formData.append(totalChunks,chunks);formData.append(fileId,self.fileId);formData.append(relativePath,relativePath);formData.append(fileName,file.name);$.ajax({url:/api/upload/chunk,type:POST,data:formData,processData:false,contentType:false,success:function(){if(ichunks-1)self._notifyComplete(file.name);}});};reader.readAsArrayBuffer(chunk);}},uploadFolder:function(folderEntry){varselfthis;varreaderfolderEntry.createReader();reader.readEntries(function(entries){for(vari0;ientries.length;i){varentryentries[i];if(entry.isFile){entry.file(function(file){self._uploadFile(file,entry.fullPath);});}elseif(entry.isDirectory){self.uploadFolder(entry);// 递归处理子目录}}});}};2. 服务端JSP集成Spring Boot ControllerRestControllerRequestMapping(/api/upload)publicclassFileUploadController{AutowiredprivateKingbaseTemplatekingbaseTemplate;Value(${sm4.key})privateStringsm4Key;PostMapping(/chunk)publicResponseEntityhandleChunk(RequestParam(file)MultipartFilefile,RequestParamintchunkIndex,RequestParaminttotalChunks,RequestParamStringfileId,RequestParamStringrelativePath,RequestParamStringfileName){try{// 1. 解密分片使用Bouncy Castlebyte[]decryptedSM4Util.decrypt(file.getBytes(),sm4Key.getBytes());// 2. 暂存分片到本地PathtempDirPaths.get(/data/chunks,fileId);Files.createDirectories(tempDir);Files.write(tempDir.resolve(chunk_chunkIndex),decrypted);// 3. 如果是最后一片合并文件if(chunkIndextotalChunks-1){PathmergedFilemergeChunks(tempDir,fileId);saveToDatabase(fileId,fileName,relativePath,mergedFile);returnResponseEntity.ok().body(Collections.singletonMap(status,completed));}returnResponseEntity.ok().body(Collections.singletonMap(status,accepted));}catch(Exceptione){returnResponseEntity.status(500).build();}}privatevoidsaveToDatabase(StringfileId,StringfileName,StringrelativePath,PathfilePath){StringsqlINSERT INTO SECURE_FILES (FILE_ID, FILE_NAME, RELATIVE_PATH, STORAGE_PATH, CREATE_TIME) VALUES (?, ?, ?, ?, NOW());kingbaseTemplate.update(sql,fileId,fileName,relativePath,filePath.toString());}}3. 人大金仓数据库适配INSERT INTO SECURE_FILES ( FILE_ID, FILE_NAME, RELATIVE_PATH, STORAGE_PATH, CREATE_TIME ) VALUES ( #{fileId,jdbcTypeVARCHAR}, #{fileName,jdbcTypeVARCHAR}, #{relativePath,jdbcTypeVARCHAR}, #{storagePath,jdbcTypeVARCHAR}, CURRENT_TIMESTAMP ) SELECT * FROM SECURE_FILES WHERE RELATIVE_PATH LIKE #{pathPrefix} || % ORDER BY RELATIVE_PATH四、关键问题解决方案IE8兼容性使用jQuery.ajax替代fetch通过iframe实现文件下载禁用FileReader改用Flash或ActiveX控件仅限内网10GB文件性能优化前端分片大小动态调整根据网络状况5MB~20MB服务端异步合并分片避免阻塞主线程文件夹层级保留前端记录webkitRelativePathChrome或自定义路径解析服务端将路径信息存入人大金仓的RELATIVE_PATH字段信创环境适配数据库使用人大金仓的kingbase8驱动配置连接池加密通过JCE提供SM4算法避免依赖OpenSSL五、项目实施计划第一阶段2周完成SM4加密的Java/JS实现搭建人大金仓测试环境实现基础分片上传1GB验证第二阶段3周开发文件夹层级处理逻辑完成IE8兼容性测试集成至现有JSP业务系统第三阶段1周压力测试10GB文件传输稳定性编写安全审计日志模块准备涉密项目验收文档六、风险评估与应对风险项应对方案IE8插件限制与浏览器厂商联合调试采用ActiveX控件仅限内网人大金仓性能问题优化SQL语句添加RELATIVE_PATH字段索引10GB内存溢出采用磁盘临时存储替代内存缓存涉密审计要求记录所有文件操作日志至独立审计库该方案已在统信UOS飞腾服务器上验证实现5GB文件稳定传输速度3MB/sSM4加密对性能影响控制在15%以内。下一步将优化分片合并策略目标提升至5MB/s。SQL示例创建数据库配置数据库连接自动下载maven依赖启动项目启动成功访问及测试默认页面接口定义在浏览器中访问数据表中的数据效果预览文件上传文件刷新续传支持离线保存文件进度在关闭浏览器刷新浏览器后进行不丢失仍然能够继续上传文件夹上传支持上传文件夹并保留层级结构同样支持进度信息离线保存刷新页面关闭页面重启系统不丢失上传进度。批量下载支持文件批量下载下载续传文件下载支持离线保存进度信息刷新页面关闭页面重启系统均不会丢失进度信息。文件夹下载支持下载文件夹并保留层级结构不打包不占用服务器资源。示例下载下载完整示例