技术开发 频道

加密DB2中的数据值

【IT168 技术文档】
  加密非字符值

  数值和日期/时间数据类型的加密通过强制类型转换得到间接的支持。非字符的 SQL 类型通过强制转换为 "varchar" 或 "char",就可以被加密了。有关强制类型转换的更多信息,请参阅 SQL 参考文档中的 “Casting Between Data Types” 部分。

  例 5:加密和解密 TIMESTAMP 数据时用到的强制类型转换函数。

  -- Create a table to store our encrypted value

  create table etemp (c1 varchar(124) for bit data);

  set encryption password 'next password';

  -- Store encrypted timestamp

  insert into etemp values encrypt(char(CURRENT TIMESTAMP));

  -- Select & decrypt timestamp

  select timestamp(decrypt_char(c1)) from etemp;

  例 6:加密/解密 double 数据。

  set encryption password 'next password';

  insert into etemp values encrypt(char(1.11111002E5));

  select double(decrypt_char(c1)) from etemp;

  性能

  加密,就其本质而言,会使大部分 SQL 语句慢下来。但是如果多加注意,多加判断,还是可以将大量的额外开销降至最低。而且,加密数据对于数据库的设计有着很大的影响。通常,您需要对一个模式中的一些敏感数据元素进行加密,例如社会保险号、信用卡号、病人姓名,等等。而有些数据值就不是那么适于加密了 -- 例如布尔值(true 和 false),或者其他的像整数 1 到 10 这样的小型集合。这些值与列名一起很容易被猜出,因此需要判断加密是否真的有用。

  在某些情况下,对加密的数据创建索引是很好的主意。加密数据的正确匹配及连接将使用您创建的索引。由于加密数据实质上是二进制数据,因此对加密数据进行范围检查时需要扫描表。范围检查需要解密某一列在所有行的值,因此应该避免进行范围检查,至少也应该进行适当的调优。

  下面的场景阐明了我们的讨论。考虑一种常见的主从(master-detail)模式,程序员可以在很多项目中使用这种模式。我们将对雇员的社会保险号(ssn)实现列级加密。在主表 emp 和从表 empProject 中,ssn 将以加密的形式存储。

  -- Define Tables and Indexes for encrypted data

  create table emp (ssn varchar(48) for bit data,

  name varchar(48) );

  create unique index idxEmp on emp ( ssn ) includes (name) ;

  create table empProject( ssn varchar(48) for bit data,

  projectName varchar(48) );

  create index idxEmpPrj on empProject ( ssn );

  -- Add some data

  set encryption password = 'ssnPassWord';

  insert into emp values (encrypt('480-93-7558'),'Super Programmer');

  insert into emp values (encrypt('567-23-2678'),'Novice Programmer');

  insert into empProject values (encrypt('480-93-7558'),'UDDI Project');

  insert into empProject values (encrypt('567-23-2678'),'UDDI Project');

  insert into empProject values (encrypt('480-93-7558'),'DB2 UDB Version 10');

  -- Find the programmers working on UDDI select a.name, decrypt_char(a.ssn)

  from emp a, empProject b

  where

  a.ssn = b.ssn

  and b.project ='UDDI Project';

  -- Build a list of the projects that the programmer with ssn

  -- '480-93-7558' is working on

  select projectName

  from empProject

  where ssn = encrypt('480-93-7558');

  
  相对于上面的例子,下面的两个例子是 不应该采用的反面典型。虽然这些查询同样能够返回正确的答案,但是它们会需要为所有行解密 ssn。当表很大的时候,这个问题就会变得突出起来。

  select a.name, decrypt_char(a.ssn)

  from emp a, empProject b

  where

  decrypt_char(a.ssn) = decrypt_char(b.ssn)

  and b.project ='UDDI Project';

  
  该查询会要求解密 emp 表的每一行以及 empProject 表的每个 'UDDI Project' 行,以执行连接。

  select projectName

  from empProject

  where decrypt_char(ssn)= '480-93-7558';

  
  该查询会要求解密 empProject 表中的每一行。

  结束语

  在本文中,我们演示了 IBM DB2 Universal Database 中的加密函数如何提供简单方式来加密敏感数据。这些函数可用来实现列级和行-列级的加密。在设计和实现期间,开发人员应该审视一些重要的性能相关事项。数据加密为隐藏私有数据增添了一种新的可用工具,即使对于管理人员,也能起到保密的作用。

   

0
相关文章