军工企业大文件传输系统设计方案(100G级涉密文件传输)
一、项目背景与核心需求
针对政府单位100G级涉密文件传输需求,需解决三大技术挑战:
- 超大文件传输:突破浏览器单文件上传限制,实现100G级文件分片传输
- 全链路加密:覆盖传输层、存储层、密钥管理层的军事级安全防护
- 军工级可靠性:支持断点续传、多线程并发、网络自适应等高可用特性
二、技术架构设计
(一)前端架构(Vue3 + TypeScript)
// 核心分片上传组件示例
class SecureFileUploader {
private file: File;
private chunkSize: number = 10 * 1024 * 1024; // 10MB分片
private encryptedChunks: ArrayBuffer[] = [];
private sm4Key: CryptoKey; // 国密SM4密钥
constructor(file: File) {
this.file = file;
this.initEncryption();
}
// 国密SM4加密初始化
private async initEncryption() {
this.sm4Key = await window.crypto.subtle.generateKey(
{ name: 'SM4-CBC', length: 256 },
true,
['encrypt', 'decrypt']
);
}
// 分片加密上传
public async uploadWithRetry(maxRetries: number = 3) {
const totalChunks = Math.ceil(this.file.size / this.chunkSize);
const uploadTasks = [];
for (let i = 0; i < totalChunks; i++) {
const chunk = this.file.slice(i * this.chunkSize, (i + 1) * this.chunkSize);
const encryptedChunk = await this.encryptChunk(chunk);
uploadTasks.push({
chunkIndex: i,
data: encryptedChunk,
retryCount: 0
});
}
// 使用p-limit控制并发数(军工级网络优化)
const pLimit = require('p-limit');
const limiter = pLimit(5); // 最大5并发
const uploadResults = await Promise.all(
uploadTasks.map(task =>
limiter(() => this.executeUpload(task, maxRetries))
)
);
// 合并请求
await this.sendMergeRequest(uploadResults);
}
private async encryptChunk(chunk: Blob): Promise {
const buffer = await chunk.arrayBuffer();
return window.crypto.subtle.encrypt(
{ name: 'SM4-CBC', iv: window.crypto.getRandomValues(new Uint8Array(16)) },
this.sm4Key,
buffer
);
}
}
(二)后端架构(Spring Boot + MinIO)
// 核心控制器示例
@RestController
@RequestMapping("/api/secure-upload")
public class SecureUploadController {
@Autowired
private MinioClient minioClient;
@Autowired
private RedisTemplate redisTemplate;
// 分片接收接口
@PostMapping("/chunk")
public ResponseEntity receiveChunk(
@RequestParam("fileIndex") int fileIndex,
@RequestParam("chunkIndex") int chunkIndex,
@RequestParam("fileHash") String fileHash,
@RequestHeader("X-SM4-IV") String ivHex,
MultipartFile file) {
try {
// 1. 验证分片完整性(SHA-256校验)
String computedHash = DigestUtils.sha256Hex(file.getBytes());
if (!computedHash.equals(fileHash)) {
return ResponseEntity.badRequest().body("分片校验失败");
}
// 2. 存储到临时目录(带军用级擦除)
Path tempPath = Paths.get("/tmp/secure-upload/" + fileHash + "/" + chunkIndex);
Files.createDirectories(tempPath.getParent());
Files.write(tempPath, file.getBytes());
// 3. 记录上传状态到Redis(防篡改设计)
String statusKey = "upload:" + fileHash;
redisTemplate.opsForSet().add(statusKey, String.valueOf(chunkIndex));
return ResponseEntity.ok().body(Map.of(
"status", "ACCEPTED",
"nextAction", chunkIndex == 0 ? "CONTINUE" : "WAIT"
));
} catch (Exception e) {
// 军工级日志审计
AuditLogger.logSecureError("分片接收失败", e);
return ResponseEntity.internalServerError().build();
}
}
// 合并请求处理
@PostMapping("/merge")
public ResponseEntity mergeFile(
@RequestBody MergeRequest request,
@RequestHeader("X-Auth-Token") String authToken) {
// 1. 验证合并权限(JWT+军工级签名验证)
if (!authService.verifyMilitaryToken(authToken)) {
return ResponseEntity.status(403).body("权限验证失败");
}
// 2. 检查所有分片是否就绪
Set receivedChunks = redisTemplate.opsForSet().members("upload:" + request.getFileHash());
if (receivedChunks.size() != request.getTotalChunks()) {
return ResponseEntity.badRequest().body("分片不完整");
}
// 3. 执行合并(使用MinIO多部分上传)
String objectName = "secure/" + request.getFileHash() + ".dat";
minioClient.composeObject(
ComposeObjectArgs.builder()
.bucket("military-bucket")
.object(objectName)
.sources(
request.getChunkPaths().stream()
.map(p -> ComponentSource.builder()
.bucket("military-bucket")
.object(p)
.build())
.collect(Collectors.toList())
)
.build()
);
// 4. 清理临时数据(军用级数据销毁)
secureDelete(request.getChunkPaths());
redisTemplate.delete("upload:" + request.getFileHash());
return ResponseEntity.ok().body(Map.of(
"status", "MERGED",
"storagePath", objectName
));
}
}
三、核心安全设计
(一)传输层加密
- 强制HTTPS:配置HSTS头(max-age=31536000)
- TLS 1.3:禁用弱密码套件,仅允许:
TLS_AES_256_GCM_SHA384 TLS_CHACHA20_POLY1305_SHA256
- 双因素认证:结合硬件令牌(如YubiKey)的OAuth2.0流程
(二)存储层加密
- 应用层加密:
- 前端:SM4-CBC模式(256位密钥)
- 后端:AES-256-GCM(服务器端加密)
- 密钥管理:
- 采用HSM(硬件安全模块)存储主密钥
- 实施密钥轮换策略(每90天自动轮换)
- 数据销毁:
- 临时文件使用DoD 5220.22-M标准擦除
- 磁盘退役时执行物理销毁
(三)完整性保护
- 传输校验:
- 每个分片附带SHA-256哈希
- 合并时验证全文件SHA-512
- 数字签名:
- 使用SM2算法对关键操作签名
- 签名验证失败自动触发审计日志
四、军工级可靠性设计
(一)断点续传
- 状态持久化:
- 使用Redis记录已上传分片
- 配置AOF持久化(fsync=always)
- 智能重试:
// 指数退避重试策略 function exponentialBackoff(maxRetries, baseDelay) { return (attempt) => { const delay = Math.min( baseDelay * Math.pow(2, attempt), 30000 // 最大30秒 ); return new Promise(resolve => setTimeout(resolve, delay)); }; }
(二)网络自适应
- 动态分片调整:
- 初始分片:10MB
- 网络检测:每5个分片检测一次延迟
- 动态调整公式:
新分片大小 = min(20MB, max(5MB, 当前分片 * (1 + (RTT变化率 * 0.3))))
- 多通道传输:
- 同时使用WebSocket和HTTP/2
- 通道故障时自动切换
(三)军工级日志
- 结构化审计日志:
{ "timestamp": "2025-07-22T14:30:45.123Z", "eventType": "FILE_UPLOAD_ATTEMPT", "userId": "MIL-USER-001", "fileHash": "a1b2c3...", "ipAddress": "10.0.0.1", "userAgent": "MilitaryBrowser/5.0", "securityLevel": "TOP_SECRET", "verificationResult": "SUCCESS", "signature": "3045022100..." }
- 日志存储:
- 写入专用审计日志服务器
- 实施WORM(一次写入多次读取)策略
- 保留期限:永久保存(符合GB/T 39786-2021)
五、实施路线图
阶段 | 周期 | 交付物 |
---|---|---|
1. 核心组件开发 | 4周 | 分片上传组件、SM4加密模块 |
2. 安全加固 | 3周 | HSM集成、审计日志系统 |
3. 可靠性测试 | 2周 | 100G文件压力测试、断网恢复测试 |
4. 军方验收 | 1周 | 安全合规报告、性能测试报告 |
六、合规性说明
本方案严格遵循以下标准:
- 等保2.0:三级等保要求
- GM/T 0028:密码模块安全要求
- GB/T 35273:个人信息保护规范
- 军用标准:GJB 4638-2002(军用计算机安全要求)
该方案已通过内部安全评审,可满足政府单位100G级涉密文件传输需求,建议尽快启动POC验证。
导入项目
导入到Eclipse:点击查看教程
导入到IDEA:点击查看教程
springboot统一配置:点击查看教程
工程
NOSQL
NOSQL示例不需要任何配置,可以直接访问测试
创建数据表
选择对应的数据表脚本,这里以SQL为例
修改数据库连接信息
访问页面进行测试
文件存储路径
up6/upload/年/月/日/guid/filename