文件传输系统报告
实验目的
在当下的大数据和人工智能时代,数据的重要性已经愈来愈重要。但是文件作为数据在计算机系统中的重要载体,在网络传输的过程中容易被监听嗅探,导致隐私泄露问题,因此文件传输安全的保障也是数据安全中重要的一部分。
本实验我们将学习 socket 编程,从传输层开始动手设计一个简单的文件安全传输系统。本实验涉及到简单的应用层协议设计,socket C/S 程序实现,SSL 安全传输协议,多线程技术,以及网络通信流量的嗅探与分析。
一、完成的工作
证书的签发
- 使用 OpenSSL 生成 CA 根证书
- 使用 OpenSSL 生成服务器私钥及待签名证书,并使用 CA 根证书对其签名
- 使用 OpenSSL 生成客户端私钥及待签名证书,并使用 CA 根证书对其签名
自定义传输协议
- 客户端包头
- 服务端包头
文件传输系统客户端
- 用户注册、登录
- 文件浏览、下载
- 文件上传
- 可选 使用/不使用 SSL 加密传输
- GUI 图像界面
文件传输系统服务端
- 响应用户注册、登录
- 响应用户上传、下载
- 多线程
- 记录用户操作日志
Wireshark 抓包分析
- SSl 加密
- 不使用 SSL 加密
二、程序运行环境
注:本系统服务器没有部署在云端,需在本地启动执行
操作系统:Win10 编程语言:Python3.6 依赖 Python 库:tkinter、pymysql、ssl、socket 等(大多均为 Python 内置) MySQL 中应先建立数据库:filetransfer,新建表 user,含有三个字段:id、username、 password
启动方法:
启动服务器:
c++
python server_ssl.py python server_no_ssl.py
启动客户端:
c++
python main.py
文件夹说明请参考 README.md 文件
三、系统框架
客户端流程图
服务器流程图
自定义传输协议在服务器与客户端的每次交流都添加了自定义报头,客户端主动向服务器请求数据,
服务器被动返回,因此两者的数据包头会不同。本系统使用了 python 的 struct 结构体实现了报头二进制流的传输。
3.1 客户端的报头内容如下:(1024 字节)
- Command 包括:Download、Upload、Update、Login 和 Register
- Filename 在 download 指令下是要下载的文件名,在 upload 模式下是本地上传文件的路径。
- Filesize 是文件的大小
- Time 是数据请求的时间
- User 和 password 是用户名和密码,每次请求数据都会验证一次,模拟 Cookie 模式。
c++
header = {
'Command': 'Download'
,
'fileName':
filename,
'fileSize': ''
,
'time':
time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()),
'user':
self.username,
'password':
self.password,
}
服务器的报头内容如下:
(128 字节)由于服务器是被动地回复客户端,所以报头内容不需要太多,故使用 128 字节。
- Feedback 指示要回应的指令
- Stat 指示响应的状态(如注册、登录等)
- Filesize 是文件的大小 User 是当前用户
c++
header = {
'Feedback': 'Login'
,
'stat': 'Success'
,
'fileSize':
os.stat(listResult).st_size,
'user':
username
}
四、效果展示
登录界面可选择使用或不使用 SSL 加密
注册界面
下载
下载路径为项目文件夹下的 ClientDownload,下载采用多线程,点击确认后会后台下载,不影响当前页面操作。
上传
上传同样采用多线程,不会影响当前界面的操作。上传的文件路径是项目目录下的
ServerRec 文件夹。
服务器日志
日志保存在项目目录下的 Serverlog.txt,记录了用户的登录、注册、上传、下载操作及具体的时间和操作的状态,如图:
五、抓包分析
使用 Wireshark 对应用产生的流量进行抓包分析,结果如下:
5.1 不使用 SSL 加密
过滤条件为:ip.addr == 127.0.0.1 and tcp.port == 9999
前三个数据包如下:第一个数据包为客户端(端口 50623)向服务器(端口 9999)发送,其中 SYN 被置位了,说明这是个 TCP 连接请求包。第二个包为服务器向客户端发送,其中 SYN 被置位,ACK 为 1,说明是确认了客户端的连接请求。第三个包为客户端向服务器发送,ACK 为 1。至此,TCP 三次握手建立完成。
从第四个包开始,是服务器与客户端的数据传输包,可以看到,每次发送后都会收到对方的反馈包,ACK 为自己的 Seq+len+1。这是 TCP 的协议决定的,以此实现可靠的传输。这里也能看出,客户端的数据包头为 1024 字节,服务器的数据包头为 128 字节,与我们的协议设置一致。
点开第四个包的内容(客户端登录请求的数据包头),可以看到信息都以明文的方式传输,非常不安全。如果被人嗅探,则很容易泄露账号及密码。
5.2 使用 SSL 加密
前三个包依然是 TCP 三次握手,在握手完成之后客户端跟服务器开始了 SSL 加密协议商定过程,可以看到双方互相交换了证书、Key 等信息。
点开一个 Application Data 包,发现内容都是乱码,说明已经被加密,嗅探者无法破译内容。证明我们的 SSL 加密是成功的。
六、实验收获与体会
这次的实验让我学到了很多东西,让我对 SSL 加密传输和 TCP 协议有了更深的了解。以前都是在书上看到的 TCP 协议知识,这次通过自己抓包,验证了 TCP 的三次握手、ACK 号等等,让我对计算机网络知识更加感兴趣了。此外,这次实验自己设计协议,自己申请 SSL 证书、实现 GUI 等都是以前没有试过的,完成之后成就感非常大,对相关领域的理解又加深了一点。
此次实验遇到的问题主要有 GUI 的设计、SSL 证书的申请等。因为事前不是很了解,所以开发时比较难处理,后来经过大量查阅资料、逛博客、学习别人代码,终于把困难一一解决,成功实现了所有功能。这次的实验锻炼了我思考和解决问题的能力,也增加了自己的经验,非常充实。
参考文献
- 基于代理重加密的邮件系统的研究与设计(暨南大学·李应开)
- 内部网络信息安全防护系统——信息管理与展示子系统的设计与实现(东北大学·李春娇)
- 基于J2EE权限管理系统平台设计与实现(吉林大学·任翔)
- 基于Java EE的数据库间的通用数据传输系统的分析与设计(北京邮电大学·陈飞雁)
- 基于Tor的文件传输管理系统的设计与实现(北京邮电大学·邱秀杰)
- 基于GRPC的安全存储系统的设计与实现(北京交通大学·方赢)
- 商务网站后台系统的设计与实现(电子科技大学·蒋豪)
- 商务网站后台系统的设计与实现(电子科技大学·蒋豪)
- 基于Tor的文件传输管理系统的设计与实现(北京邮电大学·邱秀杰)
- 基于Tor的文件传输管理系统的设计与实现(北京邮电大学·邱秀杰)
- 基于J2EE的入侵检测配置与日志审计服务系统的研究与实现(国防科学技术大学·肖毅)
- 基于J2EE的入侵检测配置与日志审计服务系统的研究与实现(国防科学技术大学·肖毅)
- 电信公司办公助手的设计与实现(北京邮电大学·陈琳)
- 基于J2EE与OpenSSL的物流系统安全性研究及实现(北京邮电大学·田轶)
- 基于数据安全通信的分布式入侵防御系统研究(电子科技大学·周峻锋)
本文内容包括但不限于文字、数据、图表及超链接等)均来源于该信息及资料的相关主题。发布者:源码码头 ,原文地址:https://bishedaima.com/yuanma/35791.html