发明内容
考虑到不同数据的不同需求,本发明设计了一种针对于大文件的选择性加密方法。
方案1:对文件进行读取,对其数据或者内容进行分段加密,除非加密为同态加密,加密前先进行压缩,如果是同态加密,则不压缩直接加密,如果无需保密的不加密,如果需要加密的根据其需要采用不同的加密方法,最后保存为密文。加密的总体步骤如下:
1、读取文件,获得内容,对于文本文件,可以是直接对数据进行先压缩再加密,对于word之类的文件,可以对其包含的文本进行压缩再加密,根据需要对数据或者内容进行分块(分段),比如分块可以是Hadoop中的SequenceFile等文件(流式文件)中包含的一个文件,或者是xml文件中的一个特性的值,或者是word文件的一个段落、句子等单元,表格中的一个数据项、一行、一列等。
2、根据需要选择是否加密,以及何种加密方式,这个可以是机器的,也可以是人工的,比如根据设定的规则进行机器判断或者用户的人工选择,判定大文件的每一个数据块(段)是否需要进行加密,以及采用什么样的方式进行加密。
3、选择已有密钥或者产生密钥,根据选择的加密方法进行加密:对于同态加密,不压缩直接加密,对于其他的加密则对各个数据块进行压缩,再进行加密,加密可以针对于每一块的值,比如某些文件格式中有分隔符,有长度的记录,如果需要明文形式,可以不进行加密。
4、将每一个数据块加密得到的密文,如果需要,进行必要的适应性的编码转换,比如通过一般加密得到的是字节数组,一般情况下需要转换为字符数组再写入文件(解密的时候需要进行相反的转换),并且根据相应的文件格式要求连接为一个密文文件,采用相应的格式保存最后的密文,比如,如果是word文档,针对其文本内容压缩再加密,则将加密的密文转换为字符形式的编码连接起来作为文本,放入word文档,然后保存word文档,如果是流式文件,根据流式文件的格式进行存储,加密中如果引起长度的变化,则需要在最终存储的文件中进行修改长度值,对文件结构中的长度信息进行相应的调整。即进行必要的处理让数据符合保存的格式,将这些密文数据保存在密文文件中,并且将数据是否加密,如果加密,则相应的解压缩、解密所需要的信息和参数都要存储起来,比如数据块的位置信息(比如起始和结束位置或者起始位置和长度)采用什么方式进行加密,压缩算法和相关参数,加密的密钥(或获得密钥需要的信息)和各种参数,这一块密文乃至于明文的长度存放起来。为了方便,可以将这些信息存放在表中,这些信息包含有能唯一确定这个分段的信息A(比如xml文件中的一个特性,块在一个文件中的起始位置和结束位置,存储器中的位置等),获得对应的块密钥需要的信息,比如密钥K(这个密钥可能是加密的)或者密钥的存放信息B(比如,地址或者是在某个表格中的位置),加密的算法和其他解密所需信息(比如分组长度,初始向量,加密模式等),也可以包括其他需要备注的消息。加密算法也可能是公钥加密算法等,则需要存放相应的公钥信息。
解密是一个相反的过程,对于每一块数据,首先判断其是否压缩和加密,如果已经加密,则需要解密,获取其密钥等信息。对数据块进行解密,如果压缩过,还需要解压缩。
本方案的的有益技术效果有:解决了现有技术不适用于大文件加密的缺陷,避免了完全加密不现实的问题。对于不同的块根据不同的需要采用不同的加密方法。通过压缩减少存储,而且增强安全性。
方案2:在前面方案1的基础上,考虑到同态加密一般只对数值有意义,在表中,可能某一列都是需要进行同态加密的数据,很容易进行区分,xml文件中的数据一般也容易区分,但是在文本文件和word中,需要进行同态加密的数值可能夹杂在文本(文字)或者其他的数据中,在前面分段的基础上可以进一步将数值与文本等数据进行分开加密,数值加密的时候在采用同态加密,这样需要将同态加密后的数值进行委托计算的时候可以很容易找到数据,而且大量的数据可以不进行复杂,而且冗余度高的同态加密计算。分段后依然要保证对原来文件格式的适应性,保证解密的可逆性,比如如果对于word文件,分段的时候进一步将这些数值和其他数据进行分块即可,如果是SequenceFile文件,可以采用两种方法:A)类似于上面的,如果一个记录中包含有数值和其他数据,则进一步将每一段数值和其他数据进行分割,成为不同的块进行加密,同时,根据SequenceFile文件的格式,将这些块也设置为对应的一个记录,原来的一个记录被分割为多个记录;B)每一个记录中的每一段数值和其他数据进行分割,成为不同的块进行加密,同时,加密后的密文依然连接起来,成为一个记录,并且依然根据流式文件的格式进行存储,在存储加密信息的时候,为了实现这类需要进行代理计算的数据密文和一般文本的密文的区分,每一个块的位置信息(比如起始位置和长度或起始位置和结束位置)和加密方式被记录下来,便于解密。也可以采用设置起始标记和结束标记的方法来分割这些块,这些起始和结束标记是密文中不会出现的符号,在密文前后增加起始标记和结束标记。
方案3:在方案1或者2的基础上,考虑诸如同态加密,包括全同态加密,并不能满足所有云计算背景下的委托计算的需要,有些计算依然不能被全同态加密后处理,所以,它不能解决所有问题,也没有必要花如此大的代价全部采用同态加密。考虑到同态加密有时候既有需要,但是又代价比较高,对于一般的数据如果用代价太大的同态加密就显得大材小用,吃力不讨好,除了全同态加密,比全同态加密代价小的加法同态和乘法同态也有其适用范围,如果能够用加法同态加密的数据采用全同态加密同样显得吃力不讨好。优选地,在加密的时候进行加密方法的选择,根据数据需要进行计算的所有函数来判断涉及到的数据是否需要用到同态加密(只有一个函数需要用到同态加密,而其他函数都不需要同态,也视为需要用到同态加密,即满足所有可能函数的需要,下同),需要采用什么样的同态加密,当其他一般的加密和非全同态加密都不可行,必须用同态加密的时候,采用全同态加密,当全同态加密和非全同态加密的时候,采用非全同态(半同态)加密方法,当普通加密可行的时候,优先选择普通的加密方法,即当多种方法都可以达到目的的时候,优先选用次序为,一般加密、半同态加密、全同态加密。
方案4:在前面方案1、2或者3的基础上,优选地,在加密中,非对称的加密,包括同态加密,还有重代理加密总是少数,因为他们的代价比较高,因此更多会采用对称的加密,对称加密中采用相同的加密参数去加密大量的数据是不安全的,所以需要较多的密钥。考虑到大文件的大量数据的对称加密需要用到大量的密钥,大量密钥的管理复杂,为了避免这些缺陷,这里采用单向的函数去产生密钥。单向函数可以正向计算,但是反过来求逆则困难。比如hash函数就是这样的函数,我们用大文件的数据块的位置信息(可以唯一确定这个分段的信息A),初始密钥或者是口令(统称为密码,初始密码)K产生,现实中,人们往往很容易记住口令,这样无需保存口令,但是密钥则需要另外加密存储。单个分段的加密密钥由唯一确定这个分段(数据块)的位置信息A和K的不可逆的单向函数M(F(K,A))产生,比如哈希函数,即HASH(F(K,A))值,F为一个函数,简单地可以是将KA两个数据合并,截取加密数据块所采用对称加密算法的密钥长度相应的位数,注意,如果密钥的长度大于hash函数的输出长度,可以将以上信息分别输入多个函数,HASH(F1(K,A)),HASH(F2(K,A)),也可以是多个不同单向函数(如hash函数)的值,作为所定位的数据块的加密密钥。当然也可以把这个整体当做一个单向函数。采用单向性的函数就可以避免通过块的密钥去逆向推导初始密码,其他块的密钥,安全性好而且方便。如果数据块需要采用公钥加密方法,则不需要用到上述产生的密钥,只需要利用公钥和私钥加密解密即可,如果是对称加密,则需要用到上面产生的块加密密钥。在有些加密中,比如一些误导功能的加密,有时候还需要两层的加密,需要较长的密钥,可以用产生的数据去产生一个伪随机序列,比如可以采用单向函数产生(可能需要截取)一个流密码的密钥,通过这个密钥以流密码算法产生密钥流,在密钥流中截取需要的误导加密的各层密钥。产生密钥后,根据方案1,2,3的方法进行加密。
理论上说,我们只需要存储好初始密码,并且记录每一块对应的初始密码就行了,不过有时候为了方便可选地也可以加密各个分段的加密密钥。可以采用多重加密,优选地可以用公钥加密分段加密密钥,并且将公钥加密后的分段加密密钥、分段信息、分段是否加密、分段的加密密钥对应的数据块的信息、解密分段所需的信息、明文数据的编码类型等等,存放在一起,比如用表格存储起来,我们称为加密信息表。
方案5:在前面方案4的基础上,进一步地,可以是各个用户有自己的初始密钥或者口令,这里也可以统一称为密码Ki,这样他可以加密和解密自己负责的数据块,加密信息也存放在加密信息表中,如果采用多个初始密码,加密信息表中应该包含初始的密码Ki(可能是加密的Ki)或者Ki的信息(比如编号,存放位置等)。如果是单个块密钥泄漏,采用新的初始密码产生密钥去加密泄漏密钥的块,并且更新加密信息表。
方案6:在前面方案4或者5的基础上添加更新密钥功能,有时候密码可能存在泄漏,丢失的情形,如果是Ki丢失,需要更换所有的由它产生的数据块的块密钥,重新解密,再用新的密钥加密,如果是单个块密钥泄漏,一般情况下,根据密钥的产生规则也需要更换那个初始的密码Ki,由于采用多个初始密码,加密信息表中应该包含初始密码(可能是加密的)或者初始密码的信息。因此,优选地,我们提出两种方案:A)采用新的密码产生密钥去加密泄漏密钥的块,并且更新加密信息表;B)计算块密钥的时候,增加一个信息更改密钥次数的信息,简单地可以是Null(空),1,2这样的形式,或者f(0),f(1),f(2),只要能够唯一确定修改次数的信息就行,用单向的函数M(F(K,A,f(N)))产生块密钥,在密钥信息表中也必须同样对应更改密钥次数的信息,或者由于更改密钥的数据块总是少数,可以对有更改密钥的数据块的更改次数和对应的数据块信息在其他地方存储起来。
数据解密时候先判定数据是否加密,根据加密信息表的信息解密。也可以根据密码生成分段的块加密密钥用于解密。
方案7:在前面方案4或者5的基础上,考虑在大数据的一些流式文件中,实际上一个文件包含许多记录,实际上相当于一个独立文件,这里还是称为数据块。在许多时候,不同的用户对大数据文件中的某一部分包含的数据块(比如记录)有不同的加密解密权限,比如一个高级别用户可以解密所有的加密数据块,而低一级的用户则只能解密一部分数据块,这些用户都有自己独自负责的一部分文件可以解密,他们管理的文件范围如同一棵树,最高级别用户可以看成是树根,负责所有文件,级别越低,负责的文件越少。举一个例子,一个科的人每一个人都管理自己的文件,一个科长可以查阅该科所有人的文件,处长可以查阅所有下辖科的文件,以此类推,这种情况现实中经常存在。
目前大数据越来越大,而许多大数据是存放在一个大的流式文件中。这种大文件的记录可能属于不同的用户,有不同的权限,需要用不同的密钥加密。在数据量大的时候,密钥量是比较大的,而且管理起来非常复杂。目前有许多密钥管理方案,如果只是对密钥进行加密存储,则密钥量比较大,管理起来复杂,而且对于这类提到的如同一棵树一样的加密密钥的管理权限不能很好控制。为了能够存储较少的密钥,而且对不同级别的用户赋予不同的权限,我们依然可以利用单向函数来产生密钥。
大数据中的不同记录往往属于不同的用户,需要用不同的密钥加密,有不同的安全级别,有不同的访问控制权限。本发明利用单向函数的单向性质设计了一种可以满足需要的密钥生成管理方法,并且应用于大文件的加密保护。
当有多级用户的时候,由最高级用户的初始密码Kr结合次高级用户的某一唯一信息Bi(可以是公开的,也可以是只有最高级用户知道的,比如用户名称、姓名、代号、编号等,但是这个信息应该是唯一,不重名的)产生次高级用户的初始密码,计算方法为M(F(Kr,Bi)),M()为单向函数,截取合适长度的数据作为次高级用户的初始的密码;进一步由次高级用户初始的密码以相同的方式产生再低一级用户的初始的密码;直到产生最低级用户的初始的密码,然后由最低级用户的初始的密码产生数据块的加密密钥。
因此在文件很大,其中的数据块(比如记录)的权限也往往复杂,可能是属于上面提到的多级用户的树形的权限,则可以采用如下的加密方法:
1、确定好各级用户的权限,根据上述的方法,首先最高级用户产生一个初始密码K1,下一级用户的初始密码Kr+1产生单向的函数为M(F(Kr,B),B为用户的编号,以此类推逐级地产生多级用户的初始密码。
2、根据需要对需要加密的大文件进行分块(分段),以Hadoop中的SequenceFile等大文件的一个记录。
3、根据设定的规则或者用户的选择,判定数据块(段)是否需要进行加密,以及采用什么样的方式进行加密。如果数据块需要采用公钥加密方法,则不需要用到产生的密钥,只需要利用公钥和私钥加密解密即可,如果是对称加密,则需要在下一步产生块加密密钥。
4、根据数据块的位置信息(唯一确定这个分段的信息A)和最低级用户的初始密码Kl产生数据块的加密密钥,我们用初始密码产生。单个分段(块)的加密密钥由唯一确定这个分段(数据块)的信息A和对于这个分段有加解密权限的最低级用户的初始密码Kl的不可逆函数M(F(Kl,A))产生,比如哈希函数,即HASH(F(Kl,A))值,F为一个函数(简单地可以是将K、A两个数据合并),截取加密数据块所采用对称加密算法的密钥长度相应的位数。采用单向性的函数就可以避免通过块的密钥去逆向推导初始密码,其他块的密钥,安全性好而且方便。
5、对需要加密的块,根据选择的方法对数据块进行加密,得到的数据,加密可以只针对于每一块的值,比如某些文件格式中有分隔符,有长度的记录,可以不进行加密,加密后长度有变化则做相应的修改。并且将数据是否加密,如果加密,则相应的解密所需要的信息和参数都要存储起来,比如采用什么方式进行加密,对应的密钥信息(可以获得密钥的信息,比如确定这个块属于某个最低级的用户,根据块密钥的产生规则就获得块密钥,另外也可以是块密钥的存放位置(比如,地址或者是在某个表格中的位置),或者加密的块密钥等等。)和各种参数。为了方便,本例可以将这些信息存放在表中,这些信息包含有唯一确定这个分段的信息A----数据块的起始位置和结束位置,可以恢复块密钥的信息-加密的块密钥,加密的算法和其他信息(分组长度,初始向量,加密模式,填充模式等)。
6、将每一个数据块加密的密文根据相应的方法连接为一个密文文件,采用相应的格式保存,比如,如果是word文档,针对其文本内容加密,则将加密的文本也连接起来作为文本,放入word文档,然后保存文档,如果是流式文件,根据流式文件的格式进行存储,对文件结构中的长度信息进行相应的调整。
本方案的优势在于减少需要存储的密码或密钥,而且可以控制多级的权限。
方案8:在前面方案7基础上增加密钥(密码)更新功能,有时候密钥(密码)可能存在泄漏,丢失的情形,如果是各级的初始的密码丢失,由于密钥(密码)的产生规则,需要更换所有的初始的密码和由它们产生的块密钥,重新解密,再根据规则重新产生密钥(用户密码)用新的块密钥加密,如果是单个块密钥泄漏,一般情况下,也需要更换初始的密码,由于采用多个初始密码,加密信息表中应该包含初始密码(可能是加密的)或者初始密码的信息。这会带来较大的代价,因此,优选地,我们提出在加密信息中,增加一个信息更改密钥次数的信息,简单地可以是Null(空),1,2这样的形式,或者f(0),f(1),f(2),只有能够唯一确定修改次数的信息就行,下一级用户的初始密码Kr+1产生单向的函数为M(F(Kr,B,f(N))),B为用户的编号,数据块的对称加密密钥采用M(F(Ks,A,f(N)))产生,A为文件的确定信息,比如位置信息,在密钥信息表中也必须同样对应更改密钥次数的信息,或者由于更改密钥的数据块总是少数,将N和对应的数据块信息在其他地方存储起来。表面上看,函数形式和前面的不一样,增加了N相关的内容,可以当做是原单向函数的进一步限定。
如果某一级用户A的初始密码泄漏,从用户A的上一级用户的初始密码产生用户A的新密码(密钥),注意其中N在原来的基础上加1,即M(F(Kr,B,f(N+1))),这样可以保证密钥是新的,而且由于单向性,互相之间不能相互推导,不会泄密。
这样密钥丢失的时候可以直接更换新的密钥,重新加密数据块。一旦泄密,无需大面积更换密钥(密码)。
实施例7:在实施例5的基础上,考虑大数据中的不同记录往往属于不同的用户,需要用不同的密钥加密,有不同的安全级别,有不同的访问控制权限。
当有前面提到的树型的多级用户的权限时候,由最高级用户的初始密码Kr结合次高级用户的某一唯一编号Bi产生次高级用户的初始密码,计算方法为HASH(Kr‖Bi)),截取合适长度的数据作为次高级用户的初始的密码;进一步由次高级用户初始的密码以相同的方式产生再低一级用户的初始的密码;直到产生最低级用户的初始的密码,然后由最低级用户的初始的密码产生数据块的加密密钥。完整步骤如下:
1、确定好各级用户的权限,根据上述的方法,首先最高级用户产生一个初始密码K1,然后根据利用方法hash函数SHA256(K1‖B),‖表示简单的合并连接,逐级地产生多级用户的初始密码。
2、根据需要对需要加密的大文件进行分块(分段),以Hadoop中的SequenceFile等大文件的一个记录。
3、根据关键词出现的频率和用户按需要选择,判定数据块(段)是否需要进行加密,以及采用什么样的方式进行加密。如果数据块需要采用公钥加密方法,则不需要用到产生的密钥,只需要利用公钥和私钥加密解密即可,如果是对称加密,则需要在下一步产生块加密密钥。
4、根据数据块的位置信息和最低级用户的初始密码Kl产生数据块的加密密钥。单个分段(块)的加密密钥由HASH(F(Kl‖A))值产生,截取加密数据块所采用对称加密算法的密钥长度相应的位数。
5、对需要加密的块,根据选择的方法对数据块进行加密,得到的数据,加密可以只针对于每一块的值,并且将数据是否加密,如果加密,则相应的解密所需要的信息和参数都要存储在加密信息表中,包括采用什么方式进行加密,加密的块密钥、数据块的起始位置和结束位置和其他信息(分组长度,初始向量,加密模式,填充模式等)。
6、将每一个数据块加密的密文根据相应的方法连接为一个密文文件,采用相应的格式保存,本实施例针对的是流式文件,根据流式文件的格式进行存储,对文件结构中的长度信息进行相应的调整。