DB2中的数据值加密

DB2中的数据值加密
点评:多年来,数据库已经能够防止未经授权的人看到的数据,这通常是通过数据库管理权限和特权来实现的。在当前的环境下,用于存储数据的保密性的需求日益增长,这就意味着即使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通用数据库的加密功能,加密敏感数据提供了一种简单的方法。这些功能可以用来实现列级加密的列和行。设计和实现的过程中,开发商应该看一些重要的性能相关的问题。数据加密增加了一个新的可用工具隐藏私有数据,甚至对管理者来说,它可以发挥作用的秘密。

免责声明:本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕。
相关文章
返回顶部