You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
7.4 KiB
7.4 KiB
基于网络的文件安全传输工具
项目简介
一个基于“数字信封 + 数字签名(Encrypt-then-Sign)”的文件安全传输工具,提供 GUI 和 P2P 直连传输,适合教学与小型场景演示。
功能特性
- 支持 AES(CBC/GCM/CTR)对称加密
- 数字信封 v2.0:强制数字签名(先加密后签名),保证完整性与来源认证
- RSA 封装 AES 密钥,信封中不携带公钥,基于本地受信任公钥验证签名
- 从 .enc 加密文件一键生成数字信封
- 文件摘要校验(SHA-256)
- P2P 点对点传输(文件不经中转服务器)
安全设计与假设(v2.0)
本项目面向教学/演示,安全模型做出适度简化:
- 公钥分发:假设通过线下可信渠道交换公钥;信封中不携带公钥,验证一律使用“本地预置受信任公钥”。
- 数字签名:v2.0 强制“先加密后签名(Encrypt-then-Sign)”,签名对象为密文的哈希;拒绝无签名的信封。
- 信令服务器:仅用于交换对端地址,不承载文件内容;假定在可控环境中运行。
- 传输信道:P2P 直连;公网环境建议再叠加 TLS。
- 未覆盖:CA 证书体系、证书链与吊销检查、防重放、NAT 穿透等高级特性。
生产环境加固建议:
| 能力 | 当前 | 建议 |
|---|---|---|
| 身份认证 | ✅ 数字签名 | 结合 CA 体系与证书链校验 |
| 公钥分发 | 线下分发 | 引入 PKI/CA、指纹比对或 TOFU |
| 传输安全 | P2P 明文信道 | 叠加 TLS 或 QUIC+TLS |
| 防重放 | 未实现 | 加入 Nonce/时间戳/序列号 |
| NAT 穿透 | 未实现 | STUN/TURN/ICE 或中继 |
目录结构
SecureFileProject/
├── keys/ # 存放 .pem 证书和私钥
├── core/
│ ├── __init__.py
│ ├── crypto.py # 核心加密逻辑(AES/RSA)
│ ├── protocol.py # 数字信封封装与解析
│ ├── transfer.py # P2P 传输模块
│ └── signaling_client.py # 信令客户端
├── ui/
│ ├── __init__.py
│ ├── main_window.py # Tkinter 主窗口与上下文
│ ├── context.py # 共享 GUI 上下文与工具
│ ├── keys_tab.py # 证书/密钥页
│ ├── crypto_tab.py # 加密/解密页
│ ├── envelope_tab.py # 数字信封页
│ ├── p2p_tab.py # P2P 传输页
│ └── about_tab.py # 说明页
├── signaling_server.py # 信令服务器(独立运行)
├── main.py # 客户端程序入口
└── utils.py # 文件读写等辅助工具
安装依赖
推荐使用虚拟环境,并按 requirements.txt 安装:
# Windows PowerShell
python -m venv .venv
.\.venv\Scripts\Activate.ps1
pip install -r requirements.txt
若仅想快速运行核心功能,也可直接:
pip install -r requirements.txt
使用方法
1. 启动信令服务器(需要一台电脑作为服务器)
python signaling_server.py
2. 启动客户端(发送方和接收方都需要启动)
支持启动时指定信令地址/端口、用户名和本地监听端口,方便同机多实例测试。
# 示例:发送方 alice,监听 8001,信令端口 9999
python main.py --user alice --listen-port 8001 --sig-port 9999
# 示例:接收方 bob,监听 8002,信令端口 9999
python main.py --user bob --listen-port 8002 --sig-port 9999
参数说明:
--user:客户端用户名(默认 alice)--listen-port:P2P 本地监听端口(默认 8001)--sig-host:信令服务器地址(默认 127.0.0.1)--sig-port:信令服务器端口(默认 9999)
3. 使用流程
完整的安全文件传输流程:
- 【密钥/证书】生成密钥对:生成 RSA 密钥对并相互交换公钥(线下可信方式)。
- 【两种创建信封的方式】:
- 方式 A(推荐):在“数字信封”页直接选择原文件,选择算法(推荐 GCM),使用接收方公钥封装并签名。
- 方式 B:先在“加密/解密”页用 AES 加密生成
.enc,再在“数字信封”页导入.enc生成信封。
- 【P2P 传输】:将
.envelope.json发送给对方。 - 【验证与解密】:接收方加载本地受信任的发送方公钥,验证签名并解密恢复原文件。
关键说明:
- “数字信封 v2.0”强制签名;缺失签名或签名验证失败的信封会被拒绝。
- 信封中不包含发送方公钥;验证必须使用本地预置的受信任公钥。
.enc文件仅用于演示对称加密流程,不应直接传输(对称密钥明文可见)。
4. 数字信封 v2.0 说明
结构(简化示例):
{
"version": "2.0",
"algorithm": "AES-256-GCM",
"encrypted_key": "<Base64(RSA(AES_key))>",
"iv": "<Base64(IV)>",
"encrypted_data": "<Base64(ciphertext)>",
"tag": "<Base64(GCM tag)>",
"digest": "<Base64(SHA-256(original_file))>",
"filename": "example.pdf",
"filesize": 12345,
"sender_id": "alice",
"signature": "<Base64(Sign(hash(ciphertext)))>"
}
实现细节:
- 模式支持:创建支持 CBC/GCM/CTR;解析当前支持 CBC/GCM(CTR 解析未启用)。
- 签名对象:对密文做 SHA-256 后进行 RSA 签名(Encrypt-then-Sign)。
- 摘要字段:存储原始明文文件的 SHA-256,用于完整性校验。
开发任务分配(节选)
- 数字信封 v2.0:Encrypt-then-Sign、移除信封携带公钥
- 从 .enc 文件创建数字信封
- P2P 直传与基本信令
- 引入 TLS/证书链验证
- 防重放(Nonce/时间戳)与会话绑定
P2P 传输架构
三层架构
客户端 A ←→ 信令服务器 ←→ 客户端 B
↓ ↓
└─────── P2P 直接连接 ───────┘
工作流程
- 注册阶段:双方启动客户端,向信令服务器注册(IP + 端口)
- 发现阶段:发送方查询接收方的连接信息
- 连接阶段:发送方主动连接接收方
- 传输阶段:直接传输加密的数字信封(文件)
优势与限制
✅ 优势:
- 文件不经过服务器,隐私性强
- 传输速度快,无中转延迟
- 服务器压力小(只传输元信息)
⚠️ 限制:
- 目前仅支持局域网环境
- 需要双方同时在线
- NAT 穿透需要额外配置(高级功能)
数字信封流程
参见项目需求文档中的流程图。
Git 工作流(推荐)
以功能分支为例:
# 初次克隆
git clone https://github.com/moxuun/SecureFileProject.git
# 基于 main 创建功能分支
git checkout -b feature/your-name
# 日常开发提交
git add -A
git commit -m "feat(envelope): xxx"
# 同步主分支并保持线性历史
git fetch origin
git pull --rebase origin main
# 推送功能分支
git push -u origin feature/your-name
# 出现“无法自动合并”/冲突时:
git fetch origin
git pull --rebase origin main
# 按提示解决冲突后
git add <resolved-files>
git rebase --continue
git push -f origin feature/your-name
在 GitHub 上创建 Pull Request,CI 通过且无冲突后合并即可。