基于代理重加密技术的安全云盘

介绍

代理重加密(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 

主系统

  1. upload:上传文件。获取3中提供的文件路径,将文件上传到云端。
  2. new folder:新建文件夹。
  3. 上传文件路径。4选择的本地文件路径显示到这里。
  4. 选择本地文件,将选择的本地文件路径显示到3。
  5. forward:前进,继续访问选中文件夹的内容。
  6. backward:后退,访问上级目录。
  7. refresh:更新,上传目录和公钥到云端,退出时会自动调用。这里会执行更新密钥的操作。
  8. 文件路径显示,显示云端的路径。
  9. 用户账号。
  10. 将分享链接复制到这里。
  11. 获取分享链接。通过10的分享链接,下载相对应的分享文件。分享链接被下载到/etc/share.txt
  12. 文件夹,左至右为文件类型,文件名。
  13. 分享,生成分享链接,同时分享文件。
  14. 下载。
  15. 删除文件。

分享

需要登录两个账号,在现在的代码中,我们并没有设置注册功能,因此内置只有两个用户,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

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值