一种面向云存储数据加解密的流式处理系统及方法
技术领域
本发明涉及网络存储安全领域,特别涉及一种面向云存储数据加解密的流式处理系统及方法。
背景技术
云存储是云计算技术延伸和发展出来的一个新概念,是一种新兴的网络存储技术。云存储技术通过集群应用、网络技术或分布式文件系统等功能,将网络中大量不同类型的存储设备通过应用软件集合起来协同工作,共同对外提供数据存储和业务访问功能。对于云存储服务的使用者来说,可以节省自建大型存储机房的费用以及运行维护的人力成本,并且能够在任何时间、任何地点、通过网络访问容量弹性伸缩的存储资源。
然而云存储业务的特点决定了数据在从用户手中上传到云存储服务器的那一刻起,就发生了所有权和控制权的分离。在复杂的网络环境和多变的商业利益之间,如何保证自己数据的机密性是用户首先关注的问题。现有保障云存储数据机密性的技术,主要是云存储客户端对数据进行加解密、云存储服务器端对数据进行加解密。
云存储客户端加密是指在文件上传之前,就由客户端对文件进行加密,这种方式能较好地保证数据机密性,但会来延迟和额外的计算开销,尤其是对性能和功耗受限的手持设备带来负担;云存储服务端加密则指在文件上传到云端后,由服务器对数据加密再写入存储介质,服务器可以接触到明文数据,故存在隐私泄漏的可能,并且大量的数据加解密运算容易成为瓶颈。
发明内容
本发明的目的在于克服目前云存储加解密方法存在的上述缺陷,提供了一种面向云存储数据加解密的流式处理系统,可以在用户向云存储服务器上传数据的过程中,对数据进行实时流式的加密操作;在用户从云存储服务器下载数据的过程中,对数据进行实时流式的解密操作。
为了实现上述目的,本发明提供了一种面向云存储数据加解密的流式处理系统,分别与客户端、云存储服务器端建立TCP连接,所述系统包括两个环形缓冲区:客户端到服务器缓冲区和服务器到客户端缓冲区;所述客户端到服务器缓冲区用于处理两个非阻塞socket IO事件:客户端socket可读事件,此事件发生时需要从客户端socket读取数据,经过加密处理后填充到该缓冲区;云存储服务器端socket可写事件,此事件发生时需要从该缓冲区读取数据,并写入服务器端socket;所述服务器到客户端缓冲区用于处理两个非阻塞socket IO事件:服务器socket可读事件,此事件发生时需要从服务器socket读取数据,经过解密处理后填充到该缓冲区;客户端socket可写事件,此事件发生时需要从该缓冲区读取数据,并写入到客户端socket。
上述技术方案中,所述环形缓冲区是一段固定大小的连续内存空间,数据的写入和数据的读取能够循环利用同一段内存空间;当写入数据时,从环形缓冲区的Tail指针开始连续向后写入,如果到达缓冲区结尾,则从首部开始继续写入,最后将Tail指针指向新写入数据的末尾;当从环形缓冲区读取数据时,从Head指针开始连续向后读取,如果到达缓冲区结尾,则从首部开始继续读取,最后将Head指针指向读取数据的结尾。
上述技术方案中,若环形缓冲区已满,则只监听socket可写事件;若环形缓冲区为空,则只监听socket可读事件;若环形缓冲区非满也非空,则既监听socket可写事件,又监听socket可读事件。
上述技术方案中,对于客户端到服务器缓冲区和服务器到客户端缓冲区,定义从环形缓冲区tail指针到环形缓冲区结尾部分为in_buf1,从环形缓冲区起始到head指针为in_buf2;当接收到socket可读事件时,进行如下步骤的操作:
步骤S1)获取in_buf1大小为length_in_buf1,若不为0,则从可读socket中读取长度为length_in_buf1的数据写入in_buf1;
步骤S2)若可读socket为客户端socket,则对in_buf1中的数据采用流式加密算法进行加密处理,处理后的数据大小不变仍可以放入in_buf1;若可读socket云存储服务器端socket,则对in_buf1中的数据采用流式加密算法进行解密处理,处理后的数据大小不变放入in_buf1;
步骤S3)获取in_buf2大小为length_in_buf2,
步骤S4)判断length_in_buf2是否为0,如果判断是否定的,则从可读socket中读取长度为length_in_buf2的数据写入in_buf2;准入步骤S5);否则,转入步骤S6);
步骤S5)若可读socket为客户端socket,则对in_buf2中的数据采用流式加密算法进行加密处理,处理后的数据大小不变仍可以放入in_buf2;若可读socket云存储服务器端socket,则对in_buf2中的数据采用流式加密算法进行解密处理,处理后的数据大小不变放入in_buf2;
步骤S6)重置监听非阻塞socket IO事件。
上述技术方案中,对于客户端到服务器缓冲区和服务器到客户端缓冲区,定义从环形缓冲区head指针到环形缓冲区结尾部分为out_buf1,从环形缓冲区起始到tail指针为out_buf2;当接收到socket可写事件时,进行操作步骤如下:
步骤T1)获取out_buf1大小为length_out_buf1,若不为0,则向可写socket中写入长度为length_out_buf1的out_buf1数据;
步骤T2)调用socket接口的send函数发送数据;
步骤T3)获取out_buf2大小为length_out_buf2;
步骤T4)判断length_out_buf2是否为0,如果判断是否定的,则向可写socket中写入长度为length_out_buf2的out_buf2数据;转入步骤T2);否则,转入步骤T5);
步骤T5)重置监听非阻塞socket IO事件。
此外,基于上述的系统,本发明还公开了一种面向云存储数据加解密的流式处理方法,所述方法包括:
步骤1)对于客户端到服务器缓冲区和服务器到客户端缓冲区,定义从环形缓冲区tail指针到环形缓冲区结尾部分为in_buf1,从环形缓冲区起始到head指针为in_buf2;定义从环形缓冲区head指针到环形缓冲区结尾部分为out_buf1,从环形缓冲区起始到tail指针为out_buf2;
步骤2)接收非阻塞socket IO事件,并判断事件的类型;所述事件为socket可读事件或socket可写事件;
步骤3)如果所述事件的类型为socket可读事件,转入步骤4),否则,转为步骤9);
步骤4)获取in_buf1大小为length_in_buf1,若不为0,则从可读socket中读取长度为length_in_buf1的数据写入in_buf1;
步骤5)若可读socket为客户端socket,则对in_buf1中的数据采用流式加密算法进行加密处理,处理后的数据大小不变仍可以放入in_buf1;若可读socket为云存储服务器端socket,则对in_buf1中的数据采用流式加密算法进行解密处理,处理后的数据大小不变放入in_buf1;
步骤6)获取in_buf2大小为length_in_buf2,
步骤7)判断length_in_buf2是否为0,如果判断是否定的,则从可读socket中读取长度为length_in_buf2的数据写入in_buf2;准入步骤8);否则,转入步骤13);
步骤8)若可读socket为客户端socket,则对in_buf2中的数据采用流式加密算法进行加密处理,处理后的数据大小不变仍可以放入in_buf2;若可读socket为云存储服务器端socket,则对in_buf2中的数据采用流式加密算法进行解密处理,处理后的数据大小不变放入in_buf2;
步骤9)获取out_buf1大小为length_out_buf1,若不为0,则向可写socket中写入长度为length_out_buf1的out_buf1数据;
步骤10)调用socket接口的send函数发送数据;
步骤11)获取out_buf2大小为length_out_buf2;
步骤12)判断length_out_buf2是否为0,如果判断是否定的,则向可写socket中写入长度为length_out_buf2的out_buf2数据;转入步骤10);否则,转入步骤13);
步骤13)重置监听非阻塞socket IO事件。
本发明的优势在于:
本发明的系统通过云存储加解密代理服务器设置两个环形缓存区,在数据上传和下载的过程中,在两个缓存区上进行流式的加密和解密操作;使得数据可以在传输过程中被实时地加解密和转发,同时兼顾内存利用率和处理效率,提高了运行效率。
附图说明
图1为本发明的面向云存储数据加解密的流式处理系统的示意图;
图2为本发明的环形缓冲区分段示意图;
图3为本发明的面向云存储数据加解密的流式处理方法的流程图。
具体实施方式
下面通过附图和实施例,对本发明的技术方案做进一步的详细描述。
为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
为便于对本发明实施例的理解,下面将结合图1以具体实施例做进一步的解释说明,实施例并不构成对本发明实施例的限定。
如图1所示,一种面向云存储数据加解密的流式处理系统,所述系统位于云存储用户和云存储服务器之间,并分别与二者建立TCP连接。该系统作为一个实时的TCP代理,将从客户TCP连接收到的数据加密并转发给服务器TCP连接;将从服务器TCP连接收到的数据解密并转发给客户端TCP连接。
为了协调数据的接收、缓存、加解密和转发流程,设置了两个环形缓冲区。其中客户端到服务器缓冲区只监听客户端socket可读和服务器socket可写两个事件,他负责从客户端socket读取用户上传的数据,采用流式加密算法加密后保存起来,在发生服务器socket可写事件时将数据转发给服务器TCP连接。
服务器到客户端缓冲区只监听服务器socket可读和客户端socket可写两个事件,他负责从服务器socket读取用户下载的数据,采用流式加密算法解密后保存起来,在发生客户端socket可写事件时将数据转发给用户TCP连接。
为了便于理解,下面通过一个具体的实施例,结合图2的应用场景,对环形缓冲区操作方法做详细的说明。
图2具体展示了发生socket可读和socket可写两种事件时,环形缓冲区的分段操作方法。
本发明中环形缓冲区是一段固定大小的连续内存空间,数据的写入和数据的读取可以循环利用同一段内存空间。当写入数据时,从环形缓冲区的Tail指针开始连续向后写入,如果到达缓冲区结尾,则可以从首部开始继续写入,最后将Tail指针指向新写入数据的末尾;当从环形缓冲区读取数据时,从Head指针开始连续向后读取,如果到达缓冲区结尾,则可以从首部开始继续读取,最后将Head指针指向读取数据的结尾。
若环形缓冲区已满,则只监听socket可写事件;若环形缓冲区为空,则只监听socket可读事件;若环形缓冲区非满也非空,则既监听socket可写事件,又监听socket可读事件。
当发生socket可读事件时,需要从该socket中读取数据写入环形缓冲区,此时环形缓冲区的内存布局可能是情况1也可能是情况2。情况1存在两个可写入的连续内存区in_buf1和in_buf2,需要分别将数据拷贝到in_buf1和in_buf2并进行流式加解密处理;情况2则只存在in_buf1,需要进行一次数据拷贝和流式加解密处理。
当发生socket可写事件时,需要将环形缓冲区中的数据写入到可写的socket中,此时环形缓冲区的内存布局可能是情况3也可能是情况4。情况3存在两个可读取的连续内存区out_buf1和out_buf2,需要分别从这两个内存区读取数据转发给可写的socket;情况4则只存在out_buf1,需要进行一次数据读取和转发操作。
如图3所示,一种面向云存储数据加解密的流式处理方法,所述方法包括:
步骤1)对于客户端到服务器缓冲区和服务器到客户端缓冲区,定义从环形缓冲区tail指针到环形缓冲区结尾部分为in_buf1,从环形缓冲区起始到head指针为in_buf2;定义从环形缓冲区head指针到环形缓冲区结尾部分为out_buf1,从环形缓冲区起始到tail指针为out_buf2;
步骤2)接收非阻塞socket IO事件,并判断事件的类型;所述事件的类型为:socket可读事件、服socket可写事件。
步骤3)如果所述事件的类型为socket可读事件,转入步骤4),否则,转为步骤9);
步骤4)获取in_buf1大小为length_in_buf1,若不为0,则从可读socket中读取长度为length_in_buf1的数据写入in_buf1;
步骤5)若可读socket为客户端socket,则对in_buf1中的数据采用流式加密算法进行加密处理,处理后的数据大小不变仍可以放入in_buf1;若可读socket为云存储服务器端socket,则对in_buf1中的数据采用流式加密算法进行解密处理,处理后的数据大小不变放入in_buf1;
步骤6)获取in_buf2大小为length_in_buf2,
步骤7)判断length_in_buf2是否为0,如果判断是否定的,则从可读socket中读取长度为length_in_buf2的数据写入in_buf2;准入步骤8);否则,转入步骤13);
步骤8)若可读socket为客户端socket,则对in_buf2中的数据采用流式加密算法进行加密处理,处理后的数据大小不变仍可以放入in_buf2;若可读socket为云存储服务器端socket,则对in_buf2中的数据采用流式加密算法进行解密处理,处理后的数据大小不变放入in_buf2;
步骤9)获取out_buf1大小为length_out_buf1,若不为0,则向可写socket中写入长度为length_out_buf1的out_buf1数据;
步骤10)调用socket接口的send函数发送数据;
步骤11)获取out_buf2大小为length_out_buf2;
步骤12)判断length_out_buf2是否为0,如果判断是否定的,则向可写socket中写入长度为length_out_buf2的out_buf2数据;转入步骤10);否则,转入步骤13);
步骤13)重置监听非阻塞socket IO事件。
以上所述的具体实施方式,对本发明的目的、技术方案和有益效果进行了进一步详细说明,所应理解的是,以上所述仅为本发明的具体实施方式而已,并不用于限定本发明的保护范围,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。