zoukankan      html  css  js  c++  java
  • 云存储安全方案研究

    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

  • 相关阅读:
    ELK初学搭建(logstash)
    认识基本的UI资源
    C# 枚举器
    NGUI---使用脚本控制聊天系统的内容显示,输入事件交互
    NGUI----简单聊天系统一
    C# 类型、存储和变量
    C# Execl表格文件转xml文件
    网易云音乐如何从0到亿级用户整理笔记
    如何成为一名完美的传道授业解惑者
    grouping sets,cube,rollup,grouping__id,group by
  • 原文地址:https://www.cnblogs.com/study-development/p/3683872.html
Copyright © 2011-2022 走看看