云存储安全方案研究

0x00 描述

现在所有的公共网盘,都是没有对文件进行加密的。也就是说,所有的私人数据,都是明文存储在对方的服务器上的啦。

这种方式虽然方便,但是安全性实在没有什么保障啊!

所以啊,真正合适的做法是,对于存储在云上的文件要进行加密,这样的话就算文件被窃取了,别人也无法读取啊(想想冠希哥)。

0x01 加密算法

在密码学里,安全方案要保证文件的三个特性:

1、可用性

2、机密性

3、完整性

可用性,就是指文件需要时可以被用户使用,文件不能损坏导致无法使用。

机密性,就是指文件不能被没有授权的人读取(再次想想冠希哥)。

完整性,就是文件必须是完整的没有被篡改和丢失。

团队项目给予用户两种对称加密算法:3DES(就是DES运算3次),AES。

这里又提到了一个密码学概念,就是对称加密。

对称加密就是指加密和解密使用同一个密钥啦。

那么有对称自然有非对称了,典型的非对称算法有:RSA和ECC。

非对称就是加密和解密使用不同的密钥,公钥用来加密,私钥用来解密。但是啊,非对称加密算法虽然在安全性上做的非常不错,但是计算效率实在太低了,除非对安全性有非常高的要求,而且加密的内容也不多,才会用到哦。

0x02 密钥保存方法

好了,确定了加密算法,那么要怎么在服务器上面保存文件的加密密钥呢?

这里提到了加密密钥的安全性问题,要知道,现代密码学体系里,最核心的问题,就是与密钥相关的生成、管理和分配。丢了加密过的文件没关系,丢了或者泄露了密钥,整个安全体系都会变的不安全啦。

加密密钥肯定是保存在服务器上的啦,但是能不能明文存储呢?显然是不应该的。

服务器明文存储密钥,那么当服务器被人从外部攻破之后,用户的密钥被窃取,黑客很容易就能对文件进行解密!典型的案例请参考csdn密码泄露事件。

那么服务器既然不能明文存储,那么就肯定需要对密钥进行一些处理了。

这个处理就是hash(哈希)算法(又名单向散列算法)。

哈希算法能做到,对不同的输入,能对生成不同的固定位数的输出。

典型的算法有:MD5,SHA系列。

比如以MD5为例:

输入:aaa

输出:47BCE5C74F589F4867DBD57E9CA9F808

输入:123456

输出:E10ADC3949BA59ABBE56E057F20F883E

哈希算法又名单向散列算法,意思是指,通过输出的散列值,是不能计算得出加密内容的。整个过程是单向的,不可逆的。

那么好,只要用哈希算法对密钥进行加密,就算黑客得到了加密后的值,也无法得到原本的密钥。

0x03 简单过程

简单的加密保存过程如下所示:

1、用户选择需要上传的文件,并填写加密密钥

2、密钥的MD5散列值从用户端传到主服务器,主服务器存入数据库。

3、用户端使用密钥加密文件按并分片传送到存储节点。

文件下载时,用户需要提供正确的密钥才能通过下载验证。

似乎这就可以了?没那么简单哦。

加密算法对于密钥的长度可是有要求的(比如DES是56位,AES的话是128,192,256位的都有),但是不可能要求用户输入固定位数的密码啊。

所以啊,为了得到统一长度的密码,我们还要借助hash算法的特性,就是生成的字符串是固定位数的哦。

那么对明文密钥进行一次hash之后才能作为加密算法的加密密钥才行。

还有一些问题,下面一个个来讨论。

0x04 服务器的安全性

服务器安全吗?

在刚刚发生的openssl漏洞的时候,这真是一个难以说的清楚的问题。

那么既然服务器都不安全的话,好的安全方案自然也要考虑,如果服务器也不安全的话,该怎么办呢?

在安全性方面,我们认为存储节点是不安全的,那么存储节点就不能保存任何密钥,只能保存文件。

其次,主节点安全性要高级很多,但是,主节点依然不能完全信任。

任何存储在主服务器上的密钥都应该是经过加密过后的。明文存储非常不安全。

在安全云存储系统的设计上,并没有使用哈希加密来存储文件密码,而是利用用户的唯一登陆密钥,来加密文件密钥存入数据库。

这样一来,就算数据库被黑客拿到了,如果没有用户的密钥,是难以造成较大的破坏的。

0x05 通信的安全性

用户、主节点、存储节点都是接入在开放的互联网上的,所有他们之间传输的数据包会很容易的被人拦截下来。

那么,基本可以认为三者之间的通信信道是不安全的。

channel

在这种不安全的信道下,要做的最重要的事情就是防止重传攻击。

当前TCP/IP的底层已经做了一些加密方案,但是这些方案都是公开的, 很难保证其安全性。(openssl事件)

所以,自己设计一个加密通信协议也是很有必要的。

首先是用户和服务器节点间的通信,文件数据自然是在用户加密过后通过信道上传的,主要问题在于密钥的传输上面。

当传输密钥(经过hash)到主节点服务器的时候,采用非对称加密(如RSA)将是一个很好的方法。

其次,是主服务器和存储节点通信的时候,如果有一个共有的标识,使其能进行双向的认证就好了。双向认证的数据通信,都要采用非对称加密。

以下是整个通信的流程图:

encrypt

原文地址:https://www.cnblogs.com/study-development/p/3683872.html