随着信息技术的发展,数据库在信息管理的应用已非常广泛。为了确保数据库文件的安全,我们提出了一种基于内层加密函数对数据库表的动态变换加密技术,动态变换加密数据库文件能使当前行、列数据的加密密钥做到互不干扰。

一、数据库加密技术

目前数据的加密技术主要有两大类,即库内加密及库外加密。

1、库内加密

库内加密是在DBMS内核层加密,解密过程也在内层实现,加密与解密的过程已封装在内部,对用户与应用系统只提供接口操作,数据记录在物理存储前进行加密、解密,库内加密通常以存储过程形式调用,密钥以系统数据字典的形式保存在DBMS可以访问的区域。在DBMS内核实现加密,加密函数可以与DBMS内部数据库的访问机制、权限控制、操纵机制等功能进行有机结合。

目前大部分数据库厂商在其数据库产品中提供加解密功能,如从Oracle 8开始,就提供DBMS-OBFUSCATION-TOOL-KIT的PI /SQI包,以实现对数据的加解密。0racle log开始支持DES、3DES、AES等加密算法,为用户提供库内数据加密存储手段。

库内加密方式的优点是隐蔽性强,加密手续整合到DBMS的功能中,封装后的加密、解密方式对用户及应用系统实行了通明策略,与DBMS进行了无缝对接。加密算法、加密粒度及加密
方式可以按照数据库的特点进行合理取舍。由于库内加密在DBMS的内核进行,库内加密对系统性能影响较大,除了要完成常规的功能外,还要对数据文件加密解密进行处理,增加了数据库服务器的负荷,因此需要选择速度快性价比高的加解密的算法,不能为了加密和解密而牺牲系统性能。同时,为了满足加密粒度的需要,可以选择加密的基本单位。基本的加密单位可以是数据库、表、记录、字段、数据项等。库内加密还存在密钥保管困难的问题,同时需要数据库厂商的支持。

2、库外加密

库外加密是指加密、解密过程在DBMS外面进行。DBMS所管理的是密文。加密、解密过程由客户端或者专用服务器程序完成。如,在基于操作系统层的加密时,可以利用管理文件的系统功能直接把存储数据的文件实施加密。但基于操作系统的加密粒度是基于文件的,对数据库中的表、记录、字段无法控制加密。

库外加密使数据库服务器及DBMS的负载较少,密钥和数据分开存放,网络传输时可只传输密文。但库外加密后的数据库功能受限,加密后的数据无法正常索引,破坏完整性,使用约束规则无效,因此对于大型数据库及管理系统而言,库外加密丧失了原来数据库提供的索引、约束规则等,是用户不能接受的。

二、动态变换加密原理

数据库文件的加密、解密必须至少满足性能及安全性的要求。加密解密过程不能过分繁锁,不能占用太多资源,以免增加服务器的负担,从而影响性能。加密后的数据应具有一定的安全性。

在对数据库加密时,可以有选择性地对表内部分关键字段进行加密,其它字段内容不变。动态变换加密数据库时,只针对数据库表的数值型字段加密。数据库文件加密后,数据库的数值型数据与未加密的数据相似,只是该数值已非真实数据。当数据库被入侵或数据库整体被盗后,数据表能正常读写,使破坏者对数据库已加密的事实不知情,即使知道数据库已加密,也无法判断数据的真实性,从而达到保密的目的。动态变换加密技术仅能应用于只要求加密数值型字段的环境,如IT经济类数据库,表内的敏感数据一般是指数值型数据,如单价、金额、数量、折扣等,其它字符型的货物名称、日期型的购买日期等字段不属于机密数据,不参与加密。

假定表中m个可以公开而不必加密的字段(可以是字符型、数值型、日期型等),有n个需要加密的数值型字段,表中共有记录s条。若所有字段都是要加密的数值字段,则设置一列自动增长的ID字段。

为了达到加密后数据能正常读写操作,仅对需要加密具有n个数值型的字段集N加密,由于要加密的字段有n个,为了使每个字段每条记录的密钥不相同,即实行数据库的元素级加密,本方法是从公开而不必加密且具有m个的字段M生成密钥。

定义1 M={Mij},Mij表示第i条记录第j个不必加密的字段明文值。

定义2N={Nii},Nij表示第i条记录第j个需要加密的字段明文值。

定义3 K={Kij},Kij表示第i条记录第j个加密的密匙,即Nij的对应密钥为Kij。

定义4 C={Cij},Cij表示第i条记录第j个的对密文,即Nij的对应密文为Cij。

由上述定义即有:

基于动态变换技术的数据库加密方法

称为求密公式,利用Mij求出Kij所表示的密钥。

式(2)称为加密公式,在求得Cij后,用Cij改写Nij的值即完成加密过程。

动态变换技术在数据库加密中的应用

式(3)称为解密公式,在知道密钥、密文时通过f’可求出明文Nij。

动态变换技术在数据库加密中的应用

为了能利用式(1)、式(2)、式(3)实施基于数据库字段元素级的加密与解密,需要解决f、g、g'的算法问题。

1、密钥的生成方法

基于数据库的字段元素级加密就是以每条记录的每个字段为基本单元进行加密,这种加密方法具有最小的加密粒度,具有很好的灵活性和控制性,但各个字段的数据元素分别采用不同的密钥加密,密钥个数较多,即密钥Kij=f(Mij)的个数为i×j,其数量巨大,若对每个密钥进行存储,必然会增大一倍以上的存储空间,因此需要寻找一种算法,使其仅在加密、解密时才动
态生成密钥,既节省存储空间,也增加安全性。

动态生成密钥的f应满足:①生成重复密钥的概率趋于0,即使是相同明文但不在同一位置上的元素Mij,也应生成出不同的密文;②生成的动态密钥要具有一定的复杂度。

对于Mij∈M,由于Mij1与Nij2不是一一对应的,即j1与j2不一定相等,若1>j2,则令j2=(modj1);若j1<j2,则对j1重复填充j1,直至j1=j2。在j1= j2的情况下,Mij1与Nij2 一一对应,取Mij,Nij进行运算。

表中有s条记录,在执行时只要循环s次即可达到目的,故对表示第几条记录的i不必考察,只考察单条记录即可。但是需要注意,i不是数据表的记录号,而是物理序列号(也称物理记录号),因为数据表的普通记录号是会附记录的增加、删除而变化,而数据表的物理序列号一经存储后,数据库系统会分配一个永久物理号,是不会变化的。如Oracle数据库中可用RowID
关键字获取,SQL Server可以设定自动编号。

假定Mij中的i是已知值(在循环时已明确知道记录号),则从Mij获取密钥源MK,使:

动态变换技术在数据库加密中的应用

这时进行了第一次变换,其中0是异或运算符,Ri是扰动系数,扰动系数R;由i、j、Mij,进行按位运算确定,R只需正向求出,无需求逆。接着进行二次变换求所有动态密钥集Kij,得:

动态变换技术在数据库加密中的应用

同理,Rj是扰动系数,扰动系数Rj由i、j、Mij进行逻辑与或运算确定,Rj也只需正向求出,无需求逆。

2、加密算法和解密算法设计

已知Kij=f(Mij)及Nij,通过Cij=g(K,j,N,j)求Cij。此时关键在于确定g,使g算出的Cij还属于正常的数值范围,并且Cij相互之间无联系,不能从一个密文推出另一个密文。

由于Nij是一个数值型数据,且在一定的范围内,假定合理范围是在[-A,A]之间,则把K'ij=K,j( mod | A |),于是,Cij=K'ij+Nij为所求,这里不采用异或的原因是数值运算,使其改写
原值且无规律即达到加密目的。

由qj=K'ij+Nj得,Nii=g'(Kij,Cij)=Cij- K'ij= Cij -Kij(mod |A |),此为解密算法。

三、动态变换技术在数据库加密中的应用

与密钥协商技术相比,基于动态变换的加密钥的生成不必经过复杂的运算。动态变换加密和解密方案中要求数据库文件在加密后,不知情者能正常读写数据及相关的操作,但不清楚这是假
内容,从而达到保密的目的。因此在具体的实现上,必须把数据库文件加密程序、解密程序分别做成存储过程或内置类函数,通过调用相应的存储过程或自定义函数对表内数值型字段进行加密及解密。数据库的数据操纵语句为Insert、Update、Delete,查询语句为Select;在执行Insert、Update时运行加密程序,即此时调用加密的函数即能在存储数据前加密,Delete操作时不必加密,但作为条件获取时可调用解密函数还原原值进行判断。在执行查询语句Select时需要调用解密函数进行解密,使之得出的结果是真实有效的;如果在Select时不调用解密函数,则得到的不是真实数据。

但是,动态变换加密技术只负责对数据文件加密,无法阻止入侵者的入侵。入侵后,若对数据进行了篡改,将会使数据失效,这与入侵者篡改未加密的数据的情况类似。

阻止入侵者篡改数据是无法做到的,但是若在数据表上增加一列原值校验字段,用于存放加密后该记录所有字段的MD5值(也可提取其它摘要值或CRC码),若入侵者篡改了某个值,则重新计算的MD5值将与存储的值不一致,从而知道数据已被人篡改,若用CRC或海明码甚至还可以对原值还原。

在加密后要注意更新MD5的值,可以直接把该功能写人到加密函数中,把加密与保存MD5值进行捆绑实现。

四、数据库文件加密实验

选用SQL Server 2005为数据库平台,以一个设备存货表为例,按前面所述的方法进行数据库文件加密,加密前的数据表内容如图1所示。

动态变换技术在数据库加密中的应用

在图1中,假定字段sbbh(设备编号)、sbmc(设备名称)、ggxh(规格型号)、dw(单位)的内容可以公开,为数据集M,不必加密处理,字段dj(单价)、sl(数量)是需要加密的内容,为数据集N。

在数据库内部创建加密函数fun_jm,函数需接收两个参数,一个是数据集M,一个是被加密字段Nij。接收参数后,函数内部对M进行元素分拆,得到M“,i随记录号变化,j是元素序号,此时利用式(1)、式(2)、式(3)按照第2节所述的原理实现。同理,解密函数fun_ujm也需接收上述两参数,按加密算法的逆过程操作一次即可。如对字段dj进行加密时执行[dbo].fun_jm
(“sbbh,sbmc,ggxh,dw”,dj),其中逗号是约定的元素分隔标志,解密函数的调用方式为[ dbo].fun_ujm(“sbbh,sbmc,ggxh,dw”,dj)或[dbo].fun_ujm(“sbbh,sbmc,ggxh,dw”,sl),此时即返回dj或sl的原值。

经加密后的数据表保存的结果如图2所示,此时的dj、sl的值依赖于dj、sl的原值与所在记录的sbbh、sbruc、ggxh、dw的内容及其记录号(物理号),无规律可循,其它未加密的字段内容不变。

动态变换技术在数据库加密中的应用

如果要更新dj、sl字段的内容,必须先调用解密函数提取dj或sl字段的原值,按要求执行运算后再加密保存,它的调用要在同一表达式中进行,如要对全部的dj提高100%,则执行语句update表名set dj=[dbo].funjm(“sbbh, sbmc,ggxh,dw”,[dbo].fun_ujm(“sb-bh,sbmc,ggxh,dw”,“dj”)*(1+10%))即可。

小知识之密钥协商

两个或多个实体协商,共同建立会话密钥,任何一个参与者均对结果产生影响,不需要任何可信的第三方(TTP)。