代理重加密(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 |lyp password |123 |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
通信参考:socket实现文件上传与下载(Python) - 彩虹然 - 博客园
代理重加密使用:nucypher/pyUmbral: NuCypher’s reference implementation of Umbral (threshold proxy re-encryption) using OpenSSL and Cryptography.io
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)