微波EDA网,见证研发工程师的成长!
首页 > 通信和网络 > 通信网络技术文库 > DB2中的数据值加密

DB2中的数据值加密

时间:01-21 来源:至顶网 点击:
加密非字符值

数值和日期/时间数据类型的加密通过强制类型转换得到间接的支持。非字符的 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 中的加密函数如何提供简单方式来加密敏感数据。这些函数可用来实现列级和行-列级的加密。在设计和实现期间,开发人员应该审视一些重要的性能相关事项。数据加密为隐藏私有数据增添了一种新的可用工具,即使对于管理人员,也能起到保密的作用。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top