点评:多年来,数据库已经能够防止未经授权的人看到的数据,这通常是通过数据库
管理权限和特权来实现的。在当前的环境下,用于存储数据的保密性的需求日益增长,这就意味着即使DBA有完全访问表中的数据,有可能会有一些信件,数据拥有者不希望其他任何人看到。
多年来,数据库已经能够防止未经授权的人看到的数据,这通常是通过数据库管理权限和特权来实现的。在当前的环境下,用于存储数据的保密性的需求日益增长,这就意味着即使DBA有完全访问表中的数据,可能会有一些信息,数据拥有者不想让别人看到的,尤其是基于Web的
应用程序,这个问题更为明显。在这个应用中,
用户输入的数据,如信用卡号码,需要
保存为以后使用的应用程序相同的用户。同时,用户的业主希望能够确保没有其他人可以访问这些数据。为了实现这一
功能,DB2内置的SQL
函数,允许应用加密和解密数据。当数据插入到数据库中,加密的
密码由用户提供可用于加密它。当检索数据,相同的密码必须提供解密数据。对于相同的密码重复使用,你可以使用赋值语句
设置加密密码值,使其在一定时期的有效
连接。
本文将描述这些SQL函数,并给出如何使用这些加密函数的示例。我们还将讨论在关系数据库中使用加密数据的设计和
性能相关问题。
实现
这些新SQL函数的签名如下所示。DB2
文档的SQL引用部分有更
详细的文档。为了确保
正确的数据
类型和长度用于加密数据,请参阅SQL引用下的加密函数下的表列定义部分。
加密(stringdatatoencrypt,PasswordOrPhrase,PasswordHint)
decrypt_char(加密的数据,PasswordOrPhrase)
gethint(加密的数据)
设置密码
该算法用于对数据进行加密是一个RC2分组(分组密码),它有一个128位的密钥,128位的关键是从密码
消息摘要。加密密码是
独立的DB2认证仅用于加密和解密数据。
在这里,你可以提供一个可选的
参数passwordhint,这是一个字符串,可以帮助用户记住用来加密数据的passwordorphrase。(例如,'george'can作为提醒记忆of'washington。)
列级加密
列级加密意味着使用相同的密码对给定列中的所有值进行加密。这种类型的加密可以在视图中使用,并且可以在通用密码的
情况下使用。当同一密钥用于一个或多个表中的所有行时,加密密码专用寄存器将非常有用。
示例1:这个示例使用加密密码值保存加密的密码。它加密雇员的社会安全号码,并以加密的形式存储在EMP表中。
创建表EMP(SSN varchar(124)位的数据);
设置密码= 'ben123;
插入EMP(SSN)值(加密('289-46-8832 '));
插入EMP(SSN)值(加密('222-46-1904 '));
插入EMP(SSN)值(加密('765-23-3221 '));
选择decrypt_char(SSN)从EMP;
示例2:在使用视图的情况下,此示例使用加密密码值保存加密密码:
创建视图clear_ssn(SSN)作为选择decrypt_char(SSN)从EMP;
在应用程序代码中,我们设置了密码to'ben123 ',现在你可以使用clear_ssn观。
设置密码= 'ben123;
选择从clear_ssn SSN;
行-列(单元格)或集合-列级加密
行列(细胞)或列(设置列)加密手段使用多个不同的密码在加密的数据列。例如,一个
网站可能需要保存客户的信用卡号码(CCN)。在这个数据库中,每个用户可以加密自己的密码或短语CCN。
3:Web应用程序收集用户关于客户的信息。这些信息包括客户名称(存储在这台主变custname)、信用卡号码(存储在这台主变cardnum)和密码(存储在这台主变userpswd)。应用程序
执行客户信息这样的插入
操作。
插入客户(CCN,
名字)值(加密(:cardnum,userpswd),:custname)
当应用程序需要
显示一个客户的信用卡信息,客户要输入密码,和密码相同也存储在主机变量userpswd。之后,你可以如下检索CCN:
选择decrypt_char(CCN,:userpswd)从顾客那里名称=:custname;
例4:本例使用
提示帮助用户记住密码。使用相同的应用程序,如例3中,应用程序将保存提示宿主变量pswdhint。假设userpswd is'chamonix '的价值,和pswdhint is'ski假日的价值。
插入客户(CCN,名称)
值(加密(::cardnum,userpswd,pswdhint),:custname)
如果客户请求使用所使用密码的提示,可以使用以下
查询。
选择gethint(CCN)为:从顾客那里的名字= pswdhint:custname;
pswdhint的值设置为滑雪度假。
加密的非字符值
加密的数字和
日期/时间数据类型的强制类型
转换是间接
支持。非字符的SQL类型可以通过强制转换为varchar或字符加密。关于强制类型转换的更多信息,在SQL
参考文档中看到数据类型部分之间的铸造。
示例5:用于加密和解密时间戳数据的强制类型转换函数。
-创建一个表来存储加密值
创建表etemp(C1 varchar(124)位的数据);
password'next设置加密密码;
-存储加密时间戳
插入etemp值加密(char(当前时间戳));
-选择解密时间戳
选择时间戳(decrypt_char(C1))从etemp;
示例6:加密/解密双数据。
password'next设置加密密码;
插入etemp值加密(char(1 11111 002e5));
选择双(decrypt_char(C1))从etemp;
性能
加密,其性质,减慢了大多数的SQL语句。但如果你付出更多的关注和评判,你可以保持大量的额外成本降到最低。此外,加密的数据对数据库的设计有很大的
影响。一般来说,你需要在一个
模式加密敏感数据元素,如社会安全号码、信用卡号码、病人姓名,等等。一些数据不加密,适合,如布尔值(真或假),或其他小集,如1到10的整数。这些值是容易猜到一起的名字,所以它是必要的判断是否加密是非常有用的。
在某些情况下,这是一个好主意,指数加密的数据。正确的匹配和数据加密的连接将使用您创建的指标。因为加密数据是二进制数据,扫描表需要
检查加密的数据范围。范围检查需要解密的所有线路上的一列的值,所以范围检查应该避免,至少应进行适当的
调整。
以下情况说明了我们的讨论。考虑到一个共同的主从模式,程序员可以在许多项目中使用这种模式。我们将实施对员工的社会安全号码列级加密(SSN)。在主表emp和从表empproject,SSN将以加密形式存储。
定义加密数据的表和索引
创建表EMP(SSN varchar(48)位数据,
Name varchar (48));
创建唯一索引idxemp EMP(SSN)包括(名称);
创建表empproject(SSN varchar(48)位数据,
项目名称varchar(48));
创建empproject指数idxempprj(SSN);
-添加一些数据
设置密码= 'ssnpassword;
插入EMP值(加密('480-93-7558 '),超级程序员);
插入EMP值(加密('567-23-2678),'novice程序员);
插入empproject值(加密('480-93-7558),'uddi项目);
插入empproject值(加密('567-23-2678),'uddi项目);
插入empproject值(加密('480-93-7558),'db2 udb版本10);
找
工作的选择a.name UDDI程序员,decrypt_char(a.ssn)
从EMP,empproject B
哪里
a.ssn = b.ssn
和b.project = 'uddi项目;
建立一个列表,SSN的程序员的项目
480-93-7558'is工作
选择项目
从empproject
在SSN =加密('480-93-7558);
与上面的例子,下面的两个例子是不应该用对立的。虽然这些查询可以返回正确的答案,他们将需要解密的所有行。大桌子的时候,问题就变得突出。
选择a.name,decrypt_char(a.ssn)
从EMP,empproject B
哪里
decrypt_char(a.ssn)= decrypt_char(b.ssn)
和b.project = 'uddi项目;
此查询需要每排emp表的解密和每个the'uddi project'rows的empproject表进行连接。
选择项目
从empproject
在decrypt_char(SSN)= '480-93-7558;
此查询需要,在empproject表的每一行被解密。
结语
在这篇文章中,我们展示了如何在IBM DB2通用数据库的加密功能,加密敏感数据提供了一种简单的
方法。这些功能可以用来实现列级加密的列和行。设计和实现的过程中,开发商应该看一些重要的性能相关的问题。数据加密增加了一个新的可用
工具隐藏私有数据,甚至对管理者来说,它可以发挥
作用的秘密。