介绍
代理重加密(proxy re encrytion)
Proxy re-encryption (PRE) is a type of public-key encryption (PKE) that allows a proxy entity to transform or re-encrypt data from one public key to another, without having access to the underlying plaintext or private keys.
NuCypher
因此该技术非常适合网盘的设计。下文将介绍我们设计的一个基于代理重加密技术的安全网盘,其中参考了很多网络上的博客和一些相关的技术,同时也是为了完成课程作业,感谢老师和大家。
该项目只适合再局域网下运行,采用socket通信,同时设计的非常简洁。
项目位置 dustbird/umbral-disk - 码云 - 开源中国
项目
从giteee中clone下来后,可以通过 git log
查看编写时的日志,如果不考虑代理重加密技术的话,就可以通过 git 返回到其中一个版本,那个版本实现了基本的网盘操作,但没有添加代理重加密。
项目总共可以分成5个模块,它们分别是目录系统、图形化界面、通信模块、服务端模块和加解密模块。整体架构如下图所示。
功能简介
登录操作
因为没有实现注册,目前可用的用户及密码如下
account |alice |bob
password |123 |123
主系统
- upload:上传文件。获取3中提供的文件路径,将文件上传到云端。
- new folder:新建文件夹。
- 上传文件路径。4选择的本地文件路径显示到这里。
- 选择本地文件,将选择的本地文件路径显示到3。
- forward:前进,继续访问选中文件夹的内容。
- backward:后退,访问上级目录。
- refresh:更新,上传目录和公钥到云端,退出时会自动调用。这里会执行更新密钥的操作。
- 文件路径显示,显示云端的路径。
- 用户账号。
- 将分享链接复制到这里。
- 获取分享链接。通过10的分享链接,下载相对应的分享文件。分享链接被下载到/etc/share.txt
- 文件夹,左至右为文件类型,文件名。
- 分享,生成分享链接,同时分享文件。
- 下载。
- 删除文件。
分享
需要登录两个账号,在现在的代码中,我们并没有设置注册功能,因此内置只有两个用户,alice和bob。操作演示如下:
alice将文件 upload.txt 分享给用户bob。
然后bob使用它生成的共享链接来获取到upload.txt文件。共享链接就是alice/c3f189...
如何运行
文件依赖:
服务端:将cloudserver.py cloudlog.py clouddatabase.py复制到一个目录下。新建log文件夹。新建data文件夹,在其中继续新建alice和bob文件夹。初次运行时,可能还需要为每个用户文件夹新建一个directory.txt文件,内容为[]
,作为初始目录。
客户端:把其它源文件复制到一个目录下。创建用户文件夹如alice和bob。在每个用户文件夹下创建data和etc文件夹。其中data文件夹存放数据,etc文件夹下则授权密钥对(delegating_key.txt),存储签名密钥对(signing_key.txt)和目录(directory.txt)。然后运行client.py。
环境依赖:
客户端 python3(umbral, pycryptodome, pyqt5) 如果是通过anaconda安装的python需要额外安装的大致上就是 umbral, pycryptodome。
服务端 python3(umbral, pymysql)
数据库依赖:需要在服务端创建数据库mysql
Ubuntu18.04 安装MySQL_Weison-CSDN博客_ubuntu 安装mysql
利用root用户创建数据库
# 数据库
CREATE DATABASE cloudpre;
use cloudpre;
# 表
CREATE TABLE sharedfiles (
delegator VARCHAR(32) NOT NULL,
delegatee VARCHAR(32) NOT NULL,
filename VARCHAR(64) NOT NULL,
kfrag BLOB NOT NULL,
PRIMARY KEY(delegator, delegatee, filename)
);
并创建新用户ubuntu,并赋予权限。关于这里 mysql 的设置基于本地环境即可,我的虚拟机的用户名就是Ubuntu。
CREATE USER 'ubuntu'@'localhost' IDENTIFIED BY 'ubuntu';
GRANT ALL ON *.* TO 'ubuntu'@'localhost';
原理记录
代理重加密技术。
下图为umbral的示意图,运用的也是这个。
原始的加解密,用于upload和download。
代理重加密如下图。代理重加密的相关使用需要参考代码和umbral项目。同时这里需要指出,对于传统的代理重加密而言,reencrypt
这一步应该由代理服务器即我们这里的云盘来完成,但在实现中,我们将这一步放到了Bob端进行。同时,因为Umbral生成的kfrags可以是多个,但我们只想用它进行分享操作,因此将它简化为一个。
目录设计
用于网盘虚拟空间的目录。
# class设计
type level name parent_name
_____________________________________
FOLDER 0 '' ''
f1 = FD_File('FOLDER', 1, '1', '')
f2 = FD_File('FOLDER', 2, '2', '1')
f3 = FD_File('FOLDER', 2, '3', '1')
f4 = FD_File('FILE', 2, '4', '1')
f5 = FD_File('FOLDER', 3, '5', '2')
f6 = FD_File('FILE', 3, '6', '2')
f7 = FD_File('FILE', 3, '7', '3')
示意图如下:level0是虚拟存在的,只是为了方便后续的操作。
通信协议设计
opcode 4bytes # 操作码 用于指示服务器执行何种操作
head(head_len(4 bytes)+head_content) 任意字节 # 字典结构 用于包含各种信息
body(maybe files, or other infomation)
opcode 由struct.pack打包。head_content的字典结构由json处理。
数据库设计
delegator and delegatee and filename唯一确定kfrag。blob存储二进制数据。
mysql> describe sharedfiles;
+-----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+-------------+------+-----+---------+-------+
| delegator | varchar(32) | NO | PRI | NULL | |
| delegatee | varchar(32) | NO | PRI | NULL | |
| filename | varchar(64) | NO | PRI | NULL | |
| kfrag | blob | NO | | NULL | |
+-----------+-------------+------+-----+---------+-------+
参考文献
多线程负载均衡参考:PythonChat/my_server.py at master · chevalx/PythonChat