数据库加密技术总结
一个好的数据库加密系统应该在保护数据安全的基础上,尽可能提高工作效率,在
工作效率和安全性之间取得一个平衡。总体来说应该满足以下要求:
1. 加解密速度要求足够快,这样减少影响数据操作响应时间。
2. 加密强度足够大,保证大部分数据长时间不被破译。但是在实际应用中加密算法不一定在理论上无法破解,但在实际应用中应能保证破解密文的代价大于获得其中数据的意义。
3. 对数据库的合法用户来说加解密操作是透明的,它不会影响用户的合理操作。换句话说,若某用户在明文数据库系统中能够进行更新、增加、删除数据、那么在密文数据库中也可以用相同的方法增加、更新和删除数据,用户不用关心数据如何完成加解密。
4. 加密后的数据库,存储量不能有较大程度增加。
5. 密钥管理方案灵活、高效,密钥安全存储,使用方便可靠。众所周知,加密算法本身并不保密,所以要确保加密数据的安全性通常取决于密钥的安全性。
3.1数据库加密应该考虑的问题:
1、加密不能代替访问控制
(1)加密技术往往是以牺牲系统性能为代价的,如果对数据库中的数据采用加密的方法来完成访问控制的功能,那么拥有密钥的用户在访问加密数据时,需要解密,这个操作代价往往比较大,极大地影响系统的性能。
(2)加密技术并不一定比访问控制更安全。加密技术和访问控制是保护数据库安全的两种不同方法,并不存在哪一种方法更安全的问题。一般来说,加密技术的安全程度取决于加密算法的强度。密钥的长度和密钥管理方案的好坏。加密算法越强,密钥位数越长!密钥管理方案好,这样的加密技术就越安全,抗攻击能力就越强。就我们所知,目前不存在一种绝对安全的加密技术。访问控制技术是一种非常有效的安全措施,它有一些成熟的安全理论模型作为其理论基础,但是,这并不意味有了访问控制技术,安全问题就得到解决。非法的攻击者可以通过绕过访问控制机制入侵到DBMs,对数据库中的数据进行破坏。
(3)加密技术不能提供灵活的安全控制策略。访问控制可以灵活地实现对数据库中各种粒度的对象(包括表,记录,字段值等)进行授权(包括select,insert,update,delete等)。如果采用加密方法,则不可能实现。例如,对某一字段进行加密后,一旦用户拥有解密密钥,那么他可以对该字段进行任何操作。
2、区分数据库中动态数据加密和静态数据加密
动态数据加密:当数据经过各种网络,从数据库服务器流入客户端,或者从客户端流入数据库服务器,对传输过程的数据加密称为动态数据加密,这种方法己经被广泛地研究,在实际应用中也相当成熟。
静态数据加密:对存储在数据库服务器中的数据进行加密,也称为存储数据加密,研究相对较少。
3、加密算法的选择
通常来说,加密算法有对称算法和非对称算法。
4、加密层次的选择
(1)操作系统层。
数据库系统包括数据库和与之相关的应用程序,它运行在计算机操作系统之上,集硬件、软件于一体的系统。从操作系统层看来,数据库是存储在操作系统上的文件,所以对数据库的加密可以通过对操作系统中的数据库文件加密来实现。操作系统中的数据库文件是不能分割的,所以对从操作系统层加密容易实现。但是在操作系统层加密,数据库文件无法识别,密钥无法根据需求合理产生和管理,或者整个数据库文件使用一个密钥,这样密钥丢失数据库的安全威胁就会很大。在操作系统层加密还有一个严重问题就是系统效率非常低下,每次数据库查询、插入、删除记录都需要对整个数据库文件加解密,代价大,效率低下。频繁的采用同一或少数密钥对数据库加解密,还会使密钥暴露的可能性大大增大。这种方法不可取,对于大型数据库的应用来说,很少在操作系统层加密。
(2)DBMS内核层
在DBMS内核层实现加密,通常指的是通过修改DBMS内核,在数据库内部创建加解密的命令语句,数据在经过操作系统的存取之前完成加解密。这种加密方式对用户来说是透明的,用户不必去了解数据库管理系统是如何完成加解密操作,用户就像操作正常的SQL命令语句一样,而且集成加密功能为数据库管理系统的功能,实现加解密功能和数据库管理功能的结合。DBMS内核层加密的缺点也很多:
1) 在内核层实现加密,需要创建一些DMBS内核加解密原语,还有对应的数据
库加解密的数据库定义语句、带有加解密实现的数据库操纵语句[14]。
2) 数据库管理系统经过长时间的应用及发展,已经形成了较为完备的结构体系,对数据库管理系统的修改是一项浩大的工程,其内部模块之间的分配关系很复杂,需要得到数据库厂商的大力支持,但是厂商考虑数据库管理系统现有的大量用户,修改结构往往会影响系统的稳定性,对于引起风险的可能性,往往不希望修改其原有的结构。
3) 应用用户只能局限于由数据库管理系统提供的加密算法,缺乏灵活性。
4) 在DBMS内核层实现加密的操作系统,其密钥库通常也存在于DBMS系统文件中,密钥的安全和数据库的安全都依托于数据库的身份识别和鉴别机制,系统的安全性差,加密系统的优势降低。
(3)DBMS外层加密
DBMS外层加密只是在数据库系统外层做一个加密应用软件,在数据库存入数据库之前对数据加密,取出数据库之前进行解密,DBMS直接管理的是密文数据。所示,通过加密要求定义工具对数据库中已经建好的数据表定义加密粒度、加密算法等要求。数据库加密系统根据加密定义获取数据与加密参数,然后调用加解密引擎模块自动完成加解密,加密结果交给DBMS,解密结果返回给数据库应用系统。采取DBMS外层加密时,加解密过程由数据库加密系统完成,DBMS直接管理的是密文或者包含明文密文的数据表。这样数裾库加密系统的加解密功能模块就可以灵活布置,可以部署在客户端,也可以部署在服务器上或者服务器局域网的其他主机上。密钥管理也灵活方便,密钥可以和加密数据分开保存,如服务器端其他主机上,增强安全性。
值得注意的是如果将加解密功能在客户端实现,可以有效降低数据库服务器端的任务,但是这要涉及到密文在网络上的传输,明文数据经过加密以后的密文所占空间往往较大,又会面临网络传输困难,增加网络负担。加密以后密文数据库的功能会受到一些限制,数据库的完整性和一致性遭到破坏,对于密文数据库无法像明文一样比较,所以无法建立索引。本文的数据库加密系统采用DBMS外层加密,并在库外构造一个数值类型的密文索引,实现加密系统与数据库的有机结合。
4、加密粒度的选择
(1)数据库级
数据库级加密就是将每个数据库作为加密系统的输入。对于数据库级,数据库管理系统与操作系统的文件系统交换的是数据库的物理块号,所以对数据库的加密就像对操作系统的文件加密一样,读取数据库所在块号加密,数据库内部的系统信息表、用户数据表、建立的索引都被作为数据库文件的一部分。对数据库加密容易实现,密钥管理也很简单,一个数据库只需要一个密钥。对于数据库来说最常用的操作就是査询,每次频繁的查询需要将整个数据库解密,包括系统信息表,很多与检索目标无关的数据表都要被解密,査询效率非常低下,会造成系统资源极大浪费,对于移动存储设备的机密数据加密比较适合这种方式。
(2)表级
表级加密其实与数据库级加密类似,将数据表作为文件加密,对表信息的读取通常采用对存储数据表的物理地址的读取,DBMS并不支持这个功能,修改DBMS内核工作量大,也会引起其他风险问题,而且需要DBMS厂商的支持。
表级加密相对于数据库加密有其自己的优势:灵活度提高,可以选择有加密要求的数据表加密,其他表可以按照数据库的正常表来管理与查询,进而系统的资源能较大的节省,一定程度上提高系统的性能。但是加密数据表中还可能包含一些不需要加密的字段,比如用户基本信息表中,日常需要对用户的手机号码和身份账号加密,而姓名、性别、年龄等加密的意义可能不大。
(3)记录级
记录级加密是把数据表中的一条完整记录作为加密对象,加密后对应输出的是各个字段的密文字符串。数据库中的每条记录包含的信息有一定的封闭性,一般一条记录包含的信息是一个实体的完整记录,记录级加密是较常用的一种加密粒度,与表级相比具有更高的灵活性、能获得更好的查询性能。加密时一条记录对应一个密钥,但是解密过程也是需要对整条记录解密,特别是对单个字段的查询,效率更低,为了査询字段值,需要将每条记录都解密,工作量大。
(4)字段级
字段级加密是以数据表中的字段为对象,每次读取字段所在列的一个属性值加密。这种加密方式灵活度较记录级更高,通常这种加密方式也非常适合数据库频繁的查询操作,数据库的查询条件通常都是记录中的某个字段值,在査询过程中,对查询条件的字段值解密以后就可以像明文数据一样检索输出结果语句,解密过程也不包含非查询条件的字段值,效率很高,系统性能影响也很小。字段级加密也有自己的缺点,就是字段采用同一密钥加密,而数据库字段中往往存在大量的重复属性值,对于同一值的加密结果是一样的,大量重复密文对数据库的加密强度是一个减弱,攻击者有可能通过对比明文攻击获取密文信息。
(5)数据项级
数据项是指数据库中记录的每个字段,是数据库中的最小粒度。数据项级具有最高的灵活度,也具有最高的安全强度;每个数据项都采用不同的密钥加密,即使记录相同,加密结果也不相同,数据库的安全强度加强,有效提高了抗攻击能力,解决了字段级加密的问题。由于数据项级加密需要大量的密钥,在密钥的管理使用、定期更新方面是一项很复杂的工程,数据库的安全在于加密算法的安全,而加密算法是公开的,整个加密数据的安全就依赖于密钥的安全保护。如果基于数据项级加密的大量密钥得不到安全的储存,系统安全就会受到威胁;如果密钥的获取过程复杂,又会影响系统的整体性能。所以需要妥善处理密钥管理问题。
3.2数据库加密的主要方法:
1、秘密同态技术。
寻找一种既保证数据库安全性,又保证使用(如:查询,插入,删除) 的方便性的加密方法一直是数据库加密的主要研究方向。为了提高密文数据库的查询效率,Rivest 等人提出秘密同态的概念。
定义1 (秘密同态) 假设Ek1 和Dk2 分别代表加密、解密函数, 明文数据空间中的元素是有限集合{ M1 , ⋯, Mn} ,α 和β 代表运算, 若α( Ek1 ( M1), ⋯,Ek1 ( Mn) ) = Ek1 (β( M1 , ⋯, Mn) ) 成立, 则称函数族( Ek1 ,Dk2 ,α,β) 为一个秘密同态。
秘密同态技术能够对数据直接在密文的状况下进行操作,从而有效提高对密文数据库的查询速度。但是该方法对已知明文攻击存在一定安全隐患,所以Domingo 等人对其进行了改进。此后国内外也有很多基于秘密同态技术的研究。秘密同态技术能够对未经解密的密文数据进行查询,大大提高了密文数据库的查询效率。但是,因为该方法对加密算法提出了一定的约束条件,使得满足密文同态的加密算法的应用不具有普遍性。
2、密文索引技术。
提高密文数据库查询效率的另一种主要方法是密文索引技术。假设属性A 是用户的查询属性,为A 建立索引A’,A 是对用户保密的,用户只能看到其索引A’,这样既保证了用户查询的方便性又保证了敏感数据的安全性。对于加密粒度为字段级和记录级的加密方法比较适合于建立索引,而对于加密粒度为属性列的加密算法,因为算法是以属性列为最小加密单元的,即使为属性列建立索引在检索时也需要对整个属性列进行解密,所以并不适合于建立密文索引机制。
目前有许多关于密文索引的方法。提出了一种基于哈希算法的分散密文索引技术,假设敌手只拥有密文数据及其对应的索引,由于索引中的数据地址是以密文形式存放的,找不出密文与索引的对应关系,该方法能对抗敌手的静态分析,但是对于动态跟踪技术存在一定的安全隐患。提出了一种可以防范内部攻击的基于元组的索引方法,但是对每一个索引的查询都会返回所有相匹配的元组,降低了查询效率。另外还有顺序索引技术、数组索引技术和矩阵索引技术等也都针对不同问题被先后提出。对于大型数据库建立索引,由于数据量较大,建立的索引不能完全存放于主存之中,目前大多采用B + 树的方法将索引存于外存之中,当应用时再将部分索引调入主存。采用B + 树存储存在一定缺陷,因为数据库需要进行大量的存储和删除操作,随着节点的增删,势必会引起B + 树的不平衡,从而影响查询效率。所以,对于小型数据库有研究提出以矩阵的形式存放索引表,并将索引表一次性存入主存之中,以提高查询效率。目前,大多数的密文索引技术都是针对于外部攻击的,虽然也有一些针对于内部攻击的密文索引技术,但是在安全性和易用性上还存在一定问题。
3、子密钥加密方法。
传统的基于记录的数据库加密的方法存在一个问题,因为数据是以记录为单位进行加密的,所以在查询时需要对整个字段进行解密(或对需查询的明文进行加密) 以后再进行查询,这就必然增加了查询开销。为了解决基于记录的数据库加密技术存在的问题, G. I.David 等人提出了子密钥数据库加密技术。Hwang M - S 等人提出采用多级子密钥的安全模型以提高子密钥系统的灵活性和安全性。子密钥加密算法的核心思想是根据数据(特别是关系型数据库) 中数据组织的特点,在加密时以记录为单位进行加密操作。而在解密时以字段为单位进行解密操作,系统中存在两种密钥,一种是对记录加密的加密密钥,另一种是对字段进行解密的解密密钥。子密钥加密方法,从一定程度上解决了针对记录加密方法的缺陷。但是,因为系统要保存两种密钥,这就增加了密钥管理的复杂性。这一点也是子密钥加密所急需解决的问题。