胡逸平 王俊 张龙 刘洋 徐敏 王六平
摘要: 介绍了Hash算法在数据库加密系统中的应用,包括在用户身份验证中的应用,在数据库完整性认证中的应用,以及在密文检索中的应用。
关键词: 数据库安全; Hash算法; 身份验证; 数据库完整性; 密文检索
中图分类号:TP309.2文献标志码:A 文章编号:1006-8228(2012)04-06-03
Application of Hash algorithm in database security
Hu Yiping, Wang Jun, Zhang Long, Liu Yang, Xu Ming, Wang Liuping
(Hu Nan Normal University, Changsha, Hunan 410081, China)
Abstract: In this paper, the authors mainly consider the application of hash algorithm in database security, including the application of hash algorithm in identity authentication, database integrity checking, and encrypted data searching.
Key words: database security; hash algorithm; identity authentication; database integrity checking; encrypted data searching
0 引言
计算机的产生逐渐将人类带进了信息化技术的时代,但是高风险性使得信息系统的安全性问题随着信息化进程而变得日益敏感和重要。作为信息系统的核心,数据库安全问题一直是人们所关注的焦点。
数据库安全的威胁包括数据的泄密和非法修改,即对数据的三种属性的破坏:可用性、保密性和完整性。可用性是指合法用户可以随时访问他被授权的可以访问的数据,保密性是指数据信息不被泄密,完整性是指数据信息不被非法修改或破坏。
为了保护数据库中数据的安全性,目前大型数据库管理系统(DBMS)都构建了自身的安全机制。以Microsoft公司的SQL Server为例,SQL Server的安全机制可以划分为四个等级:客户机操作系统登录的安全性、SQL Server登录的安全性、数据库访问的安全性、数据库对象使用的安全性。SQL Server提供了授权机制、角色机制、视图机制、审计机制以及数据加密等来实现上述安全机制。合理利用这些安全机制,能够极大地增强数据库系统的安全性。
大多数数据库管理系统都仅局限于访问控制,然而,在众多的安全机制中,数据加密才是保护敏感信息最为有效的手段。加密后的数据以密文的形式存储在数据库中,只有拥有解密密钥的管理人员才能将其解密得到明文;对于攻击者来说,即使他得到了数据库的物理文件,也无法获得其中敏感数据的明文信息。用于数据库数据加密的各种加密算法,大都是经过实践检验运行良好的算法,具有很高的安全性,如果没有解密密钥,在现有的计算条件下,一般很难破解。
基于数据加密的数据库安全机制,可以采用两级密钥体系:一级是用于加密敏感信息的数据密钥,另一级是用于加密数据密钥的服务密钥。加密时,首先生成数据加密密钥,并用数据密钥加密敏感信息,然后用服务密钥加密数据密钥。解密时,系统先用服务密钥解密加密后的数据密钥得到数据密钥,再用数据密钥解密敏感信息。由于对称加密算法速度比非对象加密算法快,而非对称加密算法比对称加密算法安全,所以,加密敏感信息一般采用对称加密算法,而加密数据密钥一般采用非对称加密算法,这样敏感信息和数据密钥都得到了有效的保护,因而系统具有很高的安全性,同时又不会过于影响数据访问效率。
然而,无论机制设计如何精巧,并不能解决数据库所有的安全问题。即使用于加密数据密钥的服务密钥可以写入专用硬件,攻击者还是有可乘之机。由于数据库管理员在登录系统时需要提供SQL Server账户和密码,这就难以防止SQL Server注入攻击。而一旦攻击者登录到数据库,即使他不能获得敏感信息的明文数据,他还是可以对敏感信息进行篡改,比如用一个加密的记录值替换另外的加密值。而如果数据库中数据极多,针对几条记录的篡改是很难以被发现的。除此之外,针对加密数据库的数据检索也是极其费时的,这是数据库加密系统需要解决的另一个问题。
Hash算法是一种计算相对简单的单向函数,其意义在于提供了一种快速存取数据的方法:它用一种算法建立了键值与真实值之间的对应关系。Hash算法由于自身的具有优良的特性,可以被用于用户身份验证、数据库完整性认证以及数据检索中,从而极大地提高原有系统的性能。
1 Hash算法在用户身份认证中的应用
SQL Server提供了两种类型的用户管理方法:一是SQL Server身份验证模式,二是Windows识别模式。SQL Server身份验证模式是通过比较用户传入数据与存储在SQL Server数据库中的数据来实现的,这使得数据库容易被下载或复制,也容易受到SQL注入攻击。在Windows识别模式下用户必须通过Windows用户账户验证,然后才可以连接到SQL Server,这种模式虽然具有较高的安全性,却不适用于大规模的网络应用环境中。
在SQL Server身份验证模式下,数据库中存储的数据不是通常意义下的密码,而是密码经过某种算法处理后的随机值,当用户登录系统时,也用相同的算法计算随机值,如果两个值互相匹配,就可以访问数据库,这样就可以防止SQL Server注入攻击。而Hash算法具有不可逆性和唯一性的优良特性,使得我们可以选择一种安全的Hash算法来完成这个任务。
SHA算法就是一种很好的Hash算法,它是由美国国家标准和技术协会(NIST)开发,于1993年作为联邦信息处理标准发表。对于长度小于264位的消息,SHA会产生一个160位的消息摘要。当接收到消息时,这个消息摘要可以用来验证数据的完整性。在传输过程中,如果数据发生变化,那么就会产生不同的消息摘要。SHA具有如下特性:不能从消息摘要中复原信息;两个不同的消息不会产生同样的消息摘要。该算法经过加密专家多年来的发展和改进已日益完善,现在已成为世界公认的最安全的哈希算法之一,并被广泛使用。
可以用SHA算法来对用户密码产生哈希值,并将这个值存储在数据中。当用户登录系统时,也用SHA对密码进行处理,再将哈希值将数据库中的值进行匹配。为了防止攻击者对密码的哈希值进行分析,我们还可以为每个密码添加一个惟一的随机值。用户登录系统时,采用两次SHA而不是一次SHA,第一次是用SHA将用户输入数据进行哈希,第二次是将哈希值添加随机值后再用SHA进行哈希,最后再与数据库中数据进行匹配。而数据库中数据也是用户密码经过两次哈希并添加随机值后的值,这样即使攻击者得到了密码数据库,也无法还原密码。
2 Hash算法在数据库完整性验证中的应用
如果攻击者登录到数据库中,他就拥有对数据的权限。如果数据库中的数据没有进行加密处理,攻击者就能查看到所有的敏感信息,从而导致数据泄露。如果在加密数据库系统中,此时攻击者如果没有解密密钥就不能获得敏感信息,从而不会导致数据泄露。但是如果攻击者拥有对数据进行修改的权限,攻击者就可以对数据进行篡改甚至替换某些记录,这种行为无疑对数据库的完整性造成了极大的破坏。在不知道数据库被攻击的情况下,数据库的这种完整性破坏可能要经过很长时间才能被数据库管理员发现,或许也有可能直到数据库被废弃时也未被发现。通过审计机制我们或许可以发现一些端倪,可是如果攻击者足够聪明,即使我们能够发现数据库中数据被篡改,也无法定位到具体数据。为保证数据的完整性,研究人员提出了多种方案。2007年Chien-Yuan Chen等人提出了一种可保证数据库完整性的加密方案[2],在他们的方案中使用随机过滤器为每一条记录生成一个认证向量从而节省了认证数据的存储空间,在检查完整性时只需通过若干次Hash操作,并且当有数据被篡改后通过认证向量也可检查出被篡改的具体数据项。这种方案能够有效地保护数据库中数据的完整性。其中的Hash操作是一种被称为Bloom Filter的技术,因其空间高效性和随机性在许多领域中都有其应用。
Bloom Filter 是由 Howard Bloom 在1970年提出的二进制向量数据结构,它具有很好的空间和时间效率,被用来检测一个元素是不是集合中的一个成员。这种检测只会对在集合内的数据错判,而不会对不是集合内的数据进行错判,这样每个检测请求返回有“在集合内(可能错误)”和“不在集合内(绝对不在集合内)”两种情况[1]。
初始状态时,Bloom Filter是一个包含m位的位数组,每一位都置为0。
为了表达S={x1, x2,…,xn}这样一个n个元素的集合,Bloom Filter使用k个相互独立的哈希函数(Hash Function),它们分别将集合中的每个元素映射到{1,…,m}的范围中。对任意一个元素x,第i个哈希函数映射的位置hi(x)就会被置为1(1≤i≤k)。如果一个位置多次被置为1,那么只有第一次会起作用,后面几次将没有任何效果。
在判断y是否属于这个集合时,我们对y应用k次哈希函数,如果所有hi(y)的位置都是1(1≤i≤k),那么我们就认为y是集合中的元素,否则就认为y不是集合中的元素。图1中k=3,y1就不是集合中的元素。y2或者属于这个集合,或者刚好是一个False positive。
图1
假设kn 其中1/m表示任意一个哈希函数选中这一位的概率(前提是哈希函数是完全随机的),(1-1/m)表示哈希一次没有选中这一位的概率。要把S完全映射到位数组中,需要做kn次哈希。某一位还是0意味着kn次哈希都没有选中它,因此这个概率就是(1-1/m)的kn次方。在实际应用中,可由集合元素和所期望的误报率来选择合适的Bloom Filter。 基于Bloom Filter的数据库加密数据库认证方案是为每条记录都引入一个Bloom Filter向量,加密时对每条记录的每个敏感字段都将其明文数据与数据字段密钥的“异或”值用一组相互独立的Hash函数映射到Bloom Filter向量中,并用一个计数器向量记录Bloom Filter向量中每一位被映射的次数。完成映射后再用数据字段密钥将明文数据加密后存入数据库中,当整条记录被处理完毕后将这条记录的Bloom Filter向量存入数据库中,这样Bloom Filter就记录了一条记录中每个敏感字段的信息。在对密文数据库进行查询或更新时,也是先将输入数据的每个敏感字段数据值与数据字段密钥进行“异或,”再将“异或”值用相同的一组Hash函数映射到一个向量中,当所有数据都处理完毕后再将新生成的向量与存储在数据库中的向量相“与”,如果结果与新生成的向量相同,则再将要查询的数据加密与存储在数据库中的加密数据相匹配,如果相同再对数据库中的记录进行解密。如果数据库中数据被篡改或是替换了,则两个向量的相“与”值与新生成的向量必不相等。而且由于Bloom Filter向量记录了每条记录中每个敏感字段的信息,在数据被篡改或替换的情况下,我们还可以精确定位到每个数据字段值。 3 Hash算法在数据库检索中的应用 SQL Server提供了数据加密功能,然而数据加密功能并非免费的午餐,若需要使用数据加密功能,就一定要为之付出代价—典型的代价就是数据库读写性能下降。不同的加密方法在不同情况下对性能的影响各不相同。对称加密算法性能要远远高于非对称加密算法。非对称加密的加密效果要高于对称加密,但是加密性能上的代价也必须考虑。所有类型的加密都是非确定性的,所以在对已经实现索引的数据进行搜索或者过滤时,索引的作用也不能很好地发挥。如果搜索、联结、或者分组操作是基于被加密数据的,那么即使使用性能较好的对称加密也会影响到数据库的可扩展性。 当然,加密并非一无是处,如果对敏感数据进行安全确定的哈希,那么就能够同时兼顾数据库中数据安全性和系统可扩展性。基于信息验证码(message authentication code,MAC)的搜索键可以充分发挥索引的作用,从而达到最佳的性能。 MAC是敏感数据与一个隐秘数值相结合之后的哈希值。这是一种使用了安全加密盐的哈希算法,可以防止字典攻击。MAC作为加密数据的一个安全的、确定性的表示值,可以与加密数据保存到同一个表中,所有的搜索操作都是针对MAC列进行的。 为了实现MAC方案,首先要把一个隐秘的数据进行加密并存入数据库中,把它作为加密盐,然后把该加密盐解密后与数据连接起来。使用加密盐改变了数据的哈希值,可以使字典攻击几乎完全失效。最后要把连接后的结果传入一个安全的Hash函数,生成一个MAC。当把加密后的数据存储到数据库中时,同时也要将MAC进行保存。 检索数据时,我们首先将加密盐解密,然后把该加密盐与输入数据连接起来,再把连接后的结果传入Hash函数生成一个新的MAC,随后用数据库中MAC列中的数据与新的MAC进行比较,最后再将匹配的结果记录解密。由于MAC列以明文形式存储在数据库中,故而可以对其建立索引。而我们在进行检索数据时,都是针对MAC进行检索,并不直接针对加密数据,因此可以达到最佳的性能。 4 结束语 数据库中数据的可用性、保密性和完整性是数据库安全性的主要方面。数据加密是保护敏感数据最有效的手段。Hash算法由于其不可逆性、惟一性以及其高效的性能,在加密数据库系统中得到了广泛的应用。Hash算法在用户身份认证、数据库数据完整性认证以及密文数据检索中具有极其重要的价值。合理利用Hash算法,能够显著提高加密数据库的安全性和可扩展性。 参考文献: [1] 任洪庆,卢建朱,许娇阳. 基于 Bloom Filter 的加密数据库字段认证方案[J].计算机工程与设计,2011.32:818~821 [2] Chen Chien-Yuan,Ku Cheng-Yuan,David C Yen.Cryptographic relational algebra for databases using the field authenticator[J].Computers & Mathematics with Applications,2007.54(1):38~44 [3] 杨昱昺.一种通用数据库数据加密方案[J].计算机安全,2009.7:72~74 [4] 钟阿林,许方恒.数据库加密新技术的研究[J].河南师范大学学报(自然科学版),2007.4:51~53 [5] 徐立新,何敏,狄文辉.同时保护数据库数据保密性和完整性的方法[J].计算机工程,2007.33(10):179~180