您的位置 首页 FPGA

DB2中的数据值加密

本文将描述这些 SQL 函数,并给出一些关于如何使用这些加密函数的例子。我们还将讨论在关系数据库中使用加密数据的设计和性能相关事项。

多年来,数据库现已可以阻挠未经授权的人看到其间的数据,这一般是经过数据库管理器中的特权和权限来完成的。在当时的环境下,对存储数据的保密的需求日益增长。这意味着即便 DBA 对表中的数据有彻底的拜访权限,可是表中或许还有数据具有者不期望任何其他人看到的某些信息。特别是关于根据 Web 的运用程序,这一问题就愈加显着了,在这种运用程序中,用户输入的数据(比方信誉卡号)需求保存起来,以备同一用户今后运用该运用程序。一同,用户具有者期望可以保证任何其他人不能拜访这种数据。为了完成这种功用,DB2 内置了一些 SQL 函数,这些函数答应运用程序加密和解密数据。当将数据刺进到数据库中时,可以运用用户供给的加密暗码对其加密。当检索该数据的时分,有必要供给相同的暗码才干解密数据。关于要屡次运用同一个暗码的状况,可以运用一个赋值句子设置 ENCRYPTION PASSWORD 值,并令其在某次衔接期间内有效。

本文将描绘这些 SQL 函数,并给出一些关于怎么运用这些加密函数的比如。咱们还将评论在联系数据库中运用加密数据的规划和功能相关事项。

完成

下面显现了这些新的 SQL 函数的签名。在 DB2 文档的 SQL Reference 部分中有更具体的文档。(为了保证对加密的数据运用正确的数据类型和长度,请必须阅览 SQL Reference 中 ENCRYPT 函数下的“Table Column Definition”部分。)

Encrypt (StringDataToEncrypt, PasswordOrPhrase, PasswordHint)

Decrypt_Char(EncryptedData, PasswordOrPhrase)

GetHint(EncryptedData)

Set Encryption Password

用于对数据加密的算法是一个 RC2 分组暗码(block cipher),它带有一个 128 位的密钥。这个 128 位的密钥是经过音讯摘要从暗码得来的。加密暗码与 DB2 认证无关,仅用于数据的加密和解密。

这儿可以供给一个可选的参数 PasswordHint,这是一个字符串,可以协助用户回忆用于对数据加密的 PasswordOrPhrase。(例如,可以运用 George 作为回忆 Washington的提示。)

列级加密

列级加密(column level encryption)意味着关于一个给定列中的一切值都运用相同的暗码进行加密。这种类型的加密可以在视图中运用,也可以在运用了一个公共暗码的状况下运用。当对一个或多个表中一切的行运用相同的密钥时,ENCRYPTION PASSWORD 专用寄存器将非常有用。

例 1:这个比如运用 ENCRYPTION PASSWORD 值来保存加密暗码。它对雇员的社会保险号进行加密,并以经过加密的方法将其存储在 EMP 表中。

create table emp (ssn varchar(124) for bit data);

set encryption password = Ben123;

insert into emp (ssn) values(encrypt(289-46-8832));

insert into emp (ssn) values(encrypt(222-46-1904));

insert into emp (ssn) values(encrypt(765-23-3221));

select decrypt_char(ssn) from emp;

例 2:这个比如在结合运用视图的状况下运用 ENCRYPTION PASSWORD 值来保存加密暗码。下面的句子声明晰 emp 表的一个视图:

create view clear_ssn (ssn) as select decrypt_char(ssn) from emp;
在运用程序代码中,咱们将 ENCRYPTION PASSWORD 设置为 Ben123,现在可以运用 clear_ssn 视图了。

set encryption password = Ben123;

select ssn from clear_ssn;

行-列(单元格)或 调集-列级加密

行-列(单元格)或 调集-列(Set-Column)级加密意味着在一个加密数据列内运用多个不同的暗码。例如,Web 站点或许需求保存客户信誉卡号(ccn)。在这个数据库中,每个客户可以运用他自己的暗码或短语来加密 ccn。

例 3:Web 运用程序搜集关于客户的用户信息。这种信息包含客户称号(存储在宿主变量 custname中)、信誉卡号(存储在宿主变量 cardnum中)和暗码(存储在宿主变量 userpswd中)。运用程序像下面这样履行客户信息的刺进操作。

insert into customer (ccn, name) values(encrypt(:cardnum, :userpswd), :custname)
当运用程序需求从头显现某客户的信誉卡信息时,客户要输入暗码,相同该暗码也要存储在宿主变量 userpswd 中。之后,可以像下面这样检索该 ccn :

select decrypt_char(ccn, :userpswd) from customer where name = :custname;
例 4:这个比如运用提示来协助客户回忆他们的暗码。这儿运用与例 3 相同的运用程序,该运用程序将提示保存到宿主变量 pswdhint中。假定 userpswd 的值是 Chamonix, pswdhint的值是 Ski Holiday。

insert into customer (ccn, name)

values(encrypt(:cardnum, :userpswd, :pswdhint), :custname)
假如客户恳求关于所运用的暗码的提示,可以运用下面的查询。

select gethint(ccn) into :pswdhint from customer where name = :custname;
pswdhint的值被设置为Ski Holiday。

加密非字符值

数值和日期/时刻数据类型的加密经过强制类型转化得到直接的支撑。非字符的 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 中的加密函数怎么供给简略方法来加密敏感数据。这些函数可用来完成列级和行-列级的加密。在规划和完成期间,开发人员应该审视一些重要的功能相关事项。数据加密为躲藏私有数据增添了一种新的可用东西,即便关于管理人员,也能起到保密的效果。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/fangan/fpga/187615.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部