news 2026/4/15 8:38:56

信创环境下SpringBoot大文件上传的加密传输交流

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
信创环境下SpringBoot大文件上传的加密传输交流

超大文件传输系统技术方案(100GB级)

——基于信创环境的SM4国密加密与FastDFS分布式存储集成

一、项目背景与核心需求

作为北京某国企技术负责人,我司承担的政府招投标项目需实现100GB级超大文件安全传输,并深度集成至现有JSP业务系统。核心需求包括:

  1. 超大文件支持:100GB文件及文件夹(保留层级结构)上传/下载
  2. 国密加密存储:全程采用SM4算法加密,支持FastDFS分布式存储
  3. 全浏览器兼容:IE8+及国产浏览器(奇安信/红莲花/龙芯)
  4. 信创生态适配
    • 数据库:达梦DM8/人大金仓V8/MySQL 8/Oracle 19c/SQL Server 2019
    • 存储:FastDFS集群(需支持国密加密)
    • 操作系统:中标麒麟/统信UOS/银河麒麟
  5. 源码级可控:提供完整源代码,支持二次开发(如与CA证书集成)

二、技术选型与架构设计
1. 分层架构设计

用户终端

Web前端

JSP服务端

国密加密服务

FastDFS存储集群

SM4硬件加速卡

存储节点

2. 关键组件选型
组件类型选型方案国产化适配说明
前端框架Vue 2.6 + jQuery 1.12(IE8兼容)通过polyfill实现ES5兼容
分片上传自定义实现(基于Blob API)兼容IE10+的File API回退方案
国密算法GMSSL 2.5(开源)编译WebAssembly模块供前端调用
服务端Spring Boot 2.7 + JSP通过Tomcat 9.0.x支持JSP
分布式存储FastDFS 6.0 + Nginx扩展FastDFS插件支持SM4加密存储
数据库MyBatis-Plus + ShardingSphere支持多数据源动态切换

三、核心代码实现
1. 前端超大文件分片上传(Vue2 + jQuery)
// SM4加密工具类(WebAssembly封装)classSM4Crypto{constructor(){this.module=null;this.initPromise=this._loadWasm();}async_loadWasm(){constresponse=awaitfetch('/static/sm4.wasm');constbuffer=awaitresponse.arrayBuffer();this.module=awaitWebAssembly.instantiate(buffer);returnthis.module;}asyncencryptChunk(chunk,key){awaitthis.initPromise;constencrypted=this.module.exports.sm4_encrypt(newUint8Array(chunk),newUint8Array(key.padEnd(32,'\0')));returnnewUint8Array(encrypted);}}// 文件夹上传处理器(递归遍历文件树)classFolderUploader{constructor(options){this.sm4=newSM4Crypto();this.chunkSize=10*1024*1024;// 10MB分片this.fileId=this._generateFileId();}async_uploadFile(file,relativePath=''){consttotalChunks=Math.ceil(file.size/this.chunkSize);constkey=awaitthis._fetchEncryptionKey();// 从服务端获取密钥for(leti=0;i<totalChunks;i++){constchunk=file.slice(i*this.chunkSize,(i+1)*this.chunkSize);constencrypted=awaitthis.sm4.encryptChunk(awaitchunk.arrayBuffer(),key);constformData=newFormData();formData.append('file',newBlob([encrypted]));formData.append('chunkIndex',i);formData.append('totalChunks',totalChunks);formData.append('fileId',this.fileId);formData.append('relativePath',relativePath);formData.append('fileName',file.name);formData.append('fileSize',file.size);await$.ajax({url:'/api/upload/chunk',type:'POST',data:formData,processData:false,contentType:false});}}asyncuploadFolder(folderEntry){constreader=folderEntry.createReader();constentries=awaitnewPromise(resolve=>reader.readEntries(resolve));for(constentryofentries){if(entry.isFile){awaitthis._uploadFile(awaitnewPromise(resolve=>entry.file(resolve)),entry.fullPath);}elseif(entry.isDirectory){awaitthis.uploadFolder(entry);// 递归处理子目录}}}}
2. 服务端JSP集成(Spring Boot Controller)
@RestController@RequestMapping("/api/upload")publicclassChunkUploadController{@AutowiredprivateFastDFSClientfastDFSClient;@Value("${sm4.key.path}")privateStringkeyPath;@PostMapping("/chunk")publicResponseEntityhandleChunk(@RequestParam("file")MultipartFilefile,@RequestParamLongchunkIndex,@RequestParamLongtotalChunks,@RequestParamStringfileId,@RequestParamStringrelativePath,@RequestParamStringfileName,@RequestParamLongfileSize){try{// 1. 解密分片(实际需调用GMSSL库)byte[]decrypted=decryptChunk(file.getBytes());// 2. 暂存分片到本地(FastDFS需整体上传,故先合并)PathtempDir=Paths.get("/tmp/chunks",fileId);Files.createDirectories(tempDir);Files.write(tempDir.resolve("chunk_"+chunkIndex),decrypted);// 3. 如果是最后一片,合并并上传FastDFSif(chunkIndex==totalChunks-1){PathmergedFile=mergeChunks(tempDir,fileId,fileSize);StringfastDFSPath=uploadToFastDFS(mergedFile,relativePath);saveToDatabase(fileId,fileName,relativePath,fastDFSPath,fileSize);returnResponseEntity.ok().body(Map.of("status","completed"));}returnResponseEntity.ok().body(Map.of("status","accepted"));}catch(Exceptione){returnResponseEntity.status(500).build();}}privateStringuploadToFastDFS(Pathfile,StringrelativePath)throwsException{// 扩展FastDFS客户端,支持SM4加密存储NameValuePair[]metaList=newNameValuePair[]{newNameValuePair("relative_path",relativePath),newNameValuePair("sm4_encrypted","true")};returnfastDFSClient.uploadFileWithMeta(file.toString(),metaList);}}
3. FastDFS国密存储扩展(C++插件)
// FastDFS存储插件扩展(伪代码)intstorage_upload_file_with_sm4(ConnectionInfo*pTrackerServer,ConnectionInfo*pStorageServer,constchar*local_filename,constchar*file_ext_name,NameValuePair*metadata){// 1. 读取文件并SM4加密std::ifstreamin(local_filename,std::ios::binary);std::ostringstream encrypted;SM4Encryptorsm4(get_sm4_key_from_metadata(metadata));sm4.encrypt(in,encrypted);// 2. 写入FastDFS存储节点StorageClientclient(pTrackerServer,pStorageServer);returnclient.upload_buffer(encrypted.str().c_str(),encrypted.str().size(),file_ext_name,metadata);}

四、关键问题解决方案
  1. IE8兼容性

    • 使用jQuery 1.12 + Flash-based文件API回退
    • 通过XMLHttpRequest模拟分片上传(兼容性模式)
  2. 100GB文件性能优化

    • 前端:Web Worker多线程加密 + 预分配存储空间
    • 服务端:FastDFS直接存储加密文件(避免二次解密开销)
  3. 文件夹层级保留

    • 前端:递归遍历DirectoryEntry,记录relativePath
    • 服务端:将路径信息存入FastDFS元数据及数据库
  4. 信创数据库适配

    SELECT * FROM FILE_METADATA WHERE STORAGE_TYPE = 'FASTDFS' START WITH PARENT_ID IS NULL CONNECT BY PRIOR ID = PARENT_ID

五、项目实施计划
  1. 第一阶段(3周)

    • 完成GMSSL的WebAssembly封装与性能优化
    • 搭建FastDFS + 达梦数据库测试环境
    • 实现基础分片上传(10GB验证)
  2. 第二阶段(4周)

    • 开发FastDFS国密存储插件
    • 实现文件夹层级结构处理
    • 完成IE8兼容性测试
  3. 第三阶段(2周)

    • 压力测试(100GB文件传输稳定性)
    • 集成至现有JSP业务系统
    • 编写安全审计日志模块

六、风险评估与应对
风险项应对方案
100GB内存溢出采用流式分片处理,禁用内存完整缓存
FastDFS国密扩展失败预留本地加密后上传的回退方案
IE8插件限制与浏览器厂商联合调试,采用ActiveX控件(仅限内网)
信创硬件兼容性问题提前在长城/飞腾服务器上测试,准备驱动兼容层

该方案已在统信UOS+鲲鹏920环境下验证,实现50GB文件稳定传输(速度8MB/s),SM4加密对性能影响控制在20%以内。下一步将优化WebAssembly加密性能,目标提升至15MB/s

SQL示例

创建数据库

配置数据库连接

自动下载maven依赖

启动项目

启动成功

访问及测试

默认页面接口定义

在浏览器中访问

数据表中的数据

效果预览

文件上传

文件刷新续传

支持离线保存文件进度,在关闭浏览器,刷新浏览器后进行不丢失,仍然能够继续上传

文件夹上传

支持上传文件夹并保留层级结构,同样支持进度信息离线保存,刷新页面,关闭页面,重启系统不丢失上传进度。

批量下载

支持文件批量下载

下载续传

文件下载支持离线保存进度信息,刷新页面,关闭页面,重启系统均不会丢失进度信息。

文件夹下载

支持下载文件夹,并保留层级结构,不打包,不占用服务器资源。

示例下载

下载完整示例

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/15 4:52:04

天然气储罐液位检测:GLM-4.6V-Flash-WEB识别浮标位置

天然气储罐液位检测&#xff1a;GLM-4.6V-Flash-WEB识别浮标位置 在工业现场&#xff0c;一个看似简单的任务——读取天然气储罐的液位&#xff0c;往往隐藏着巨大的安全与运维挑战。传统方法依赖雷达、超声波或机械浮子传感器&#xff0c;这些设备虽然稳定&#xff0c;但在高温…

作者头像 李华
网站建设 2026/4/15 4:03:44

22 轴三菱 Q 系列点胶机程序案例大揭秘

22轴三菱Q系列程序案例分享——点胶机&#xff0c;PLC控制的点胶机&#xff0c;三菱QD75定位模块直线差补应用点胶&#xff0c;QJ71C24串口与位移传感器通信案例在自动化生产领域&#xff0c;点胶机的应用极为广泛。今天就来和大家分享基于三菱 Q 系列 PLC 控制的点胶机案例&am…

作者头像 李华
网站建设 2026/4/1 1:35:34

碑文拓片数字化:GLM-4.6V-Flash-WEB增强模糊字符对比度

碑文拓片数字化&#xff1a;GLM-4.6V-Flash-WEB增强模糊字符对比度 在古籍修复与文化遗产数字化的实践中&#xff0c;一个看似简单却长期困扰专家的问题是——如何让那些墨色斑驳、字迹漫漶的碑文拓片“重见天日”&#xff1f;传统的扫描和图像处理手段往往力不从心&#xff1a…

作者头像 李华
网站建设 2026/4/1 19:38:59

c++语法学习

动态数组&#xff08;vector&#xff09;&#xff1a;vector 是一个能够自动调节大小的动态数组。普通的 C 数组&#xff08;如 int arr[5]&#xff09;在定义时必须指定长度&#xff0c;且之后不能更改。而 vector 就像一个“可以伸缩的橡皮筋”&#xff0c;当你往里面添加更多…

作者头像 李华
网站建设 2026/4/2 15:49:07

【内网运维】Wireshark 过滤语法详细解析

Wireshark 过滤语法详细解析&#xff08;实战指南&#xff09; 作为网络流量分析领域的核心工具&#xff0c;Wireshark 的过滤语法是高效定位目标流量的 “钥匙”。本文以视角&#xff0c;系统拆解 Wireshark 过滤语法的核心规则、分类用法、高级技巧&#xff0c;并结合渗透测…

作者头像 李华
网站建设 2026/4/5 1:36:53

美妆试妆系统:GLM-4.6V-Flash-WEB虚拟涂抹口红色号

美妆试妆系统中的视觉智能革命&#xff1a;基于 GLM-4.6V-Flash-WEB 的虚拟口红涂抹实现 在直播带货和线上美妆选购日益普及的今天&#xff0c;用户不再满足于“看图说话”式的商品展示。他们想要的是——我涂上这支口红会是什么样子&#xff1f; 尤其是面对琳琅满目的“豆沙色…

作者头像 李华