| 首页 考试吧论坛 Exam8视线 考试商城 网络课程 模拟考试 考友录 实用文档 求职招聘 论文下载 | ||
| 2011中考 | 2011高考 | 2012考研 | 考研培训 | 在职研 | 自学考试 | 成人高考 | 法律硕士 | MBA考试 MPA考试 | 中科院 |
||
| 四六级 | 职称英语 | 商务英语 | 公共英语 | 托福 | 雅思 | 专四专八 | 口译笔译 | 博思 | GRE GMAT 新概念英语 | 成人英语三级 | 申硕英语 | 攻硕英语 | 职称日语 | 日语学习 | 法语 | 德语 | 韩语 |
||
| 计算机等级考试 | 软件水平考试 | 职称计算机 | 微软认证 | 思科认证 | Oracle认证 | Linux认证 华为认证 | Java认证 |
||
| 公务员 | 报关员 | 银行从业资格 | 证券从业资格 | 期货从业资格 | 司法考试 | 法律顾问 | 导游资格 报检员 | 教师资格 | 社会工作者 | 外销员 | 国际商务师 | 跟单员 | 单证员 | 物流师 | 价格鉴证师 人力资源 | 管理咨询师考试 | 秘书资格 | 心理咨询师考试 | 出版专业资格 | 广告师职业水平 驾驶员 | 网络编辑 |
||
| 卫生资格 | 执业医师 | 执业药师 | 执业护士 | ||
| 会计从业资格考试(会计证) | 经济师 | 会计职称 | 注册会计师 | 审计师 | 注册税务师 注册资产评估师 | 高级会计师 | ACCA | 统计师 | 精算师 | 理财规划师 | 国际内审师 |
||
| 一级建造师 | 二级建造师 | 造价工程师 | 造价员 | 咨询工程师 | 监理工程师 | 安全工程师 质量工程师 | 物业管理师 | 招标师 | 结构工程师 | 建筑师 | 房地产估价师 | 土地估价师 | 岩土师 设备监理师 | 房地产经纪人 | 投资项目管理师 | 土地登记代理人 | 环境影响评价师 | 环保工程师 城市规划师 | 公路监理师 | 公路造价师 | 安全评价师 | 电气工程师 | 注册测绘师 | 注册计量师 |
||
| 缤纷校园 | 实用文档 | 英语学习 | 作文大全 | 求职招聘 | 论文下载 | 访谈 | 游戏 | ||
使用作为 Oracle 高级安全选件(版本 10.2 及更高版本)的一部分引入的 Oracle 数据库透明数据加密(TDE),可以有选择地对保留在数据库底层数据文件中的敏感数据库数据以及所有下游文件组件(如联机重做日志、归档重做日志和数据库备份)进行加密。 TDE 的基本目标是保护在这些原始操作系统文件中发现的敏感数据,防止不怀好意的人访问磁盘或备份磁带时对这些数据进行窥探,然后尝试还原数据库或扫描原始操作系统文件中的数据,如个人可识别信息或信用卡信息。
作为我的咨询惯例的一部分,我已经实施 TDE 多次。但是,在其中一个最近的合约之前,我一直使用 TDE 对现有表中的新列或属于全新表的列进行加密。在这两种情况下使用 TDE 非常简单,因为目标列为空,因此由于缺乏数据和现有应用程序相关性而不会涉及较大的风险。
我最近实施 TDE 的体验有所不同。我帮助一家大型公司对一个已超过一百万行的表中的现有列进行加密。还有一个依赖于列的关键任务应用程序,因此,您可以设想一下,在开始工作之前有很多重要的事情要考虑。在 Internet 上搜索可提供经验的类似情形之后,我发现只有几个优秀的资源可以帮助我。
本文概述了我在通过使用 TDE 对现有数据进行加密的过程中总结出的经验教训。如果您尝试对现有列数据使用 TDE,我希望此处提供的信息可帮助您迅速有效地开展类似工作。
确定可能的限制
研究客户的系统时,我做的第一件事情就是查找与目标列有关的将禁止我们对列加密的数据模型特征,或者查找可能对现有操作产生负面影响的有关列的事项。该研究包括查找列索引和完整性约束。
正如 Oracle 文档明确声明,当您想对具有索引的某个列进行加密时,需要了解很多限制条件。Oracle 不允许对具有位图索引的列进行加密,这与我们的情况没有密切关系。但是,目标列具有多个普通的(B 树)索引。尽管 Oracle 允许对具有普通索引的列进行加密,但是 Oracle 禁止对索引列进行“salt 处理”加密。Salt 处理通过在加密之前向数据添加随机字符串来提高重复数据的安全性,因此窃贼使用模式匹配识别技术更加难于破解加密的数据。总而言之,经过这个最初的分析之后,我们会遇到一种情况,那就是我们可以对列进行加密,但不能进行 salt 处理。
对列索引进行分析后,我本可以到此为止,但是我想回答的下一个问题是“使用这些索引合适吗?”我的思考过程是这样:如果索引没有用,那么我会将其删除,从而减少维护索引条目所必需的系统开销,尤其是考虑到加密的额外负担。要判断索引是否有用,我使用 Oracle 数据库的索引监视特性。我发现,实际上索引正处于使用当中,因此我们必须对其继续进行维护。
接下来,我查看了引用完整性约束条件中是否涉及目标列。由于每个表都具有其自己的加密密钥,因此 Oracle 不允许您使用 TDE 对外键关系中涉及的列进行加密。在我们的情况下,引用完整性约束条件中未涉及目标列。
评估性能开销
我的客户询问的第一组问题之一就是“TDE 对我的应用程序的一般性能影响如何?”Oracle 文档中有一小部分论述了一般情况下 TDE 对相关应用程序性能的影响。但是我的客户希望获得一些具体的统计信息,以帮助他们了解 TDE 如何影响日常进行的有严格时间要求的数据加载过程。
为了满足客户需求,我计算了每天在有严格时间要求的过程中插入到目标表中的平均行数。然后,我在客户端的相同沙箱环境中创建了一个类似的测试表和索引,测量在加密目标列前后插入相同数量的行所花费的时间。时间消耗上的差别让我们更好地了解了在该过程中对列数据进行加密所造成的“性能损失”。列表 1 是我如何使用 SQL*Plus 执行该操作的示例。
SQL> CONNECT system
Enter password:
Connected.
SQL> -- Configure Oracle-Managed (Data) Files
SQL> ALTER SYSTEM
2 SET db_create_file_dest = ’/data01/oracle/’
3 SCOPE = MEMORY;
System altered.
SQL> -- Create two new tablespaces for the demo,
SQL> -- one for data segments, one for index segments
SQL> CREATE TABLESPACE data_001
2 DATAFILE SIZE 1G;
Tablespace created.
SQL> CREATE TABLESPACE indx_001
2 DATAFILE SIZE 500M;
Tablespace created.
SQL> -- Create a user for the demo
SQL> CREATE USER app_001 IDENTIFIED BY app
2 DEFAULT TABLESPACE data_001
3 TEMPORARY TABLESPACE temp
4 QUOTA UNLIMITED ON data_001
5 QUOTA UNLIMITED ON indx_001;
User created.
SQL> GRANT CREATE SESSION, CREATE TABLE TO app_001;
Grant succeeded.
SQL> -- Work as the demo user
SQL> CONNECT app_001/app;
Connected.
SQL> -- Create the demo table in the default tablespace
SQL> CREATE TABLE app_001.transactions (
2 trans_id INTEGER
3 CONSTRAINT transactions_pk PRIMARY KEY
4 USING INDEX TABLESPACE indx_001,
5 credit_card INTEGER NOT NULL
6 );
Table created.
SQL> -- Create an index in the INDX_001 tablespace
SQL> CREATE INDEX app_001.transactions_ndx1
2 ON app_001.transactions(credit_card)
3 TABLESPACE indx_001;
Index created.
SQL> -- Time how long it takes to load data in the clear
SQL> SET TIMING ON;
SQL> BEGIN
2 -- AMEX
3 FOR i IN 1 .. 100000 LOOP
4 INSERT INTO app_001.transactions(trans_id, credit_card)
5 VALUES (
6 i,
7 ’34’ || TRUNC(DBMS_RANDOM.VALUE(low=>0, high=>99999999999999))
8 );
9 END LOOP;
10 COMMIT;
11 -- VISA
12 FOR i IN 100001 .. 400000 LOOP
13 INSERT INTO app_001.transactions(trans_id, credit_card)
14 VALUES (
15 i,
16 ’4’ || TRUNC(DBMS_RANDOM.VALUE(low=>0, high=>999999999999999))
17 );
18 END LOOP;
19 COMMIT;
20 -- MASTERCARD
21 FOR i IN 400001 .. 500000 LOOP
22 INSERT INTO app_001.transactions(trans_id, credit_card)
23 VALUES (
24 i,
25 ’54’ || TRUNC(DBMS_RANDOM.VALUE(low=>0, high=>99999999999999))
26 );
27 END LOOP;
28 COMMIT;
29 END;
30 /
PL/SQL procedure successfully completed.
Elapsed: 00:00:56.14
SQL> SET TIMING OFF;
SQL> -- Remove existing synthetic data
SQL> TRUNCATE TABLE app_001.transactions;
Table truncated.
SQL> -- Enable encryption of the credit card column
SQL> ALTER TABLE app_001.transactions
2 MODIFY (credit_card ENCRYPT NO SALT);
Table altered.
SQL> -- Time how long it takes to load encrypted data
SQL> SET TIMING ON;
SQL> BEGIN
2 -- AMEX
3 FOR i IN 1 .. 100000 LOOP
4 INSERT INTO app_001.transactions(trans_id, credit_card)
5 VALUES (
6 i,
7 ’34’ || TRUNC(DBMS_RANDOM.VALUE(low=>0, high=>99999999999999))
8 );
9 END LOOP;
10 COMMIT;
11 -- VISA
12 FOR i IN 100001 .. 400000 LOOP
13 INSERT INTO app_001.transactions(trans_id, credit_card)
14 VALUES (
15 i,
16 ’4’ || TRUNC(DBMS_RANDOM.VALUE(low=>0, high=>999999999999999))
17 );
18 END LOOP;
19 COMMIT;
20 -- MASTERCARD
21 FOR i IN 400001 .. 500000 LOOP
22 INSERT INTO app_001.transactions(trans_id, credit_card)
23 VALUES (
24 i,
25 ’54’ || TRUNC(DBMS_RANDOM.VALUE(low=>0, high=>99999999999999))
26 );
27 END LOOP;
28 COMMIT;
29 END;
30 /
PL/SQL procedure successfully completed.
Elapsed: 00:01:16.31
SQL> SET TIMING OFF;
相关推荐:Oracle 认证的专家之见