经验之谈:使用Oracle的TDE特性加密

来源:Oracle认证    发布时间:2012-11-12    Oracle认证视频    评论


  SQL> -- Remove existing synthetic data
  SQL> TRUNCATE TABLE app_001.transactions;
  Table truncated.
  SQL> -- Disable encryption of the credit card column
  SQL> ALTER TABLE app_001.transactions
  2 MODIFY (credit_card DECRYPT);
  Table altered.
  SQL> -- Load new synthetic data
  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.
  SQL> -- Time how long it takes to encrypt credit card data
  SQL> -- with corresponding indexes in place
  SQL> SET TIMING ON;
  SQL> ALTER TABLE app_001.transactions
  2 MODIFY (credit_card ENCRYPT NO SALT);
  Table altered.
  Elapsed: 00:02:27.18
  SQL> SET TIMING OFF;
  SQL> -- Remove existing synthetic data
  SQL> TRUNCATE TABLE app_001.transactions;
  Table truncated.
  SQL> -- Drop all indexes that correspond to the credit card column
  SQL> DROP INDEX app_001.transactions_ndx1;
  Index dropped.
  SQL> -- Disable encryption of the credit card column
  SQL> ALTER TABLE app_001.transactions
  2 MODIFY (credit_card DECRYPT);
  Table altered.
  SQL> -- Load new synthetic data
  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.
  SQL> -- Time how long it takes to:
  SQL> -- 1. Encrypt credit card data without corresponding indexes in place
  SQL> -- 2. Recreate corresponding indexes
  SQL> SET TIMING ON;
  SQL> ALTER TABLE app_001.transactions
  2 MODIFY (credit_card ENCRYPT NO SALT);
  Table altered.
  Elapsed: 00:01:15.48
  SQL> CREATE INDEX app_001.transactions_ndx1
  2 ON app_001.transactions(credit_card)
  3 TABLESPACE indx_001
  4 PARALLEL 2
  5 NOLOGGING;
  Index created.
  Elapsed: 00:00:02.98
  SQL> SET TIMING OFF;
  列表 2 要快速执行对现有数据进行加密的过程,只需在对其进行加密之前删除列的底层索引,然后再重建索引。
  注:本文的模拟环境中使用了 CREATE INDEX 语句。在实际的设置中,可考虑使用 Oracle 数据库的 D
  BMS_METADATA 实用程序包来生成 CREATE INDEX 语句,您可以使用这些语句在完成数据加密之后重新创建索引。
  总之,在列加密之后重建索引的新策略可留出更多时间来处理整个过程中最具挑战性的问题,这将在下一部分中进行说明。
  删除未加密数据的虚副本
  Oracle 和底层主机操作系统使用优化的算法来更新数据块中的数据,目的是最大程度地减少降低性能的磁盘 I/O。在对现有列数据进行加密的特定情况下,通常发生的一件事是 Oracle 将加密的列数据写入到新数据块并且只是将之前未加密的值占用的空间标记为未使用。换句话说,Oracle 不会尝试清除较旧的未加密数据。只要所讨论的系统持续遇到大量更新活动,您就有理由确信当重用块空间时 Oracle 将最终覆盖较旧的未加密数据。但是考虑到我的客户正在准备进行合规性审计,我必须确保在加密过程之后立即擦除未加密的敏感数据。
  进行了很多研究之后,我在 Oracle 技术网上发现了一个 FAQ 以及一个网志,该网志确认这一特定问题并提供了有关解决该问题的一些基本想法。一般的想法是将包含之前未加密数据的所有段移动到新的表空间(以及数据文件),然后使用一个操作系统实用程序删除旧数据文件。但该做法听起来容易,做起来难。事实是,在安全删除旧表空间及其数据文件之前,您很有可能需要移动大量段以及包含敏感数据的段。
  为了使这一可能费时费力且易于出错的过程自动进行,我将一些脚本放在一起,以帮助我构建完成这一切所需的 DDL 语句。这里,我要向 Tom Kyte 表示谢意,因为此处的一些工作是修改我在 Asktom 站点找到的内容查询。列表 3 显示了我使用的整个过程的一个示例。
  Enter password:
  Connected.
  SQL> -- Create new tablespaces for data and index segments
  SQL> CREATE TABLESPACE data_002 DATAFILE SIZE 1G;
  Tablespace created.
  SQL> CREATE TABLESPACE indx_002 DATAFILE SIZE 500M;
  Tablespace created.
  SQL> -- Generate a script to move existing segments to new tablespaces
  SQL> COL ORDER_COL1 NOPRINT;
  SQL> COL ORDER_COL2 NOPRINT;
  SQL> SET HEADING OFF;
  SQL> SET VERIFY OFF;
  SQL> SET ECHO OFF;
  SQL> SELECT DECODE( segment_type, ’TABLE’ , segment_name, table_name ) order_col1,
  2 DECODE( segment_type, ’TABLE’, 1, 2 ) order_col2,
  3 ’ALTER ’ || segment_type || ’ ’ || LOWER(owner) || ’.’ || LOWER(segment_name) ||
  4 DECODE( segment_type, ’TABLE’, ’ MOVE ’, ’ REBUILD ’ ) ||
  5 ’TABLESPACE ’ || LOWER(DECODE( segment_type, ’TABLE’ , ’&&NEW_DATA_TBS’ , ’&&NEW_INDX_TBS’ )) || ’;’
  6 FROM dba_segments,
  7 (SELECT table_name, index_name FROM dba_indexes WHERE tablespace_name = UPPER(’&&OLD_INDX_TBS’))
  8 WHERE segment_type in ( ’TABLE’, ’INDEX’ )
  9 AND segment_name = index_name (+)
  10 AND tablespace_name IN (UPPER(’&&OLD_DATA_TBS’), UPPER(’&&OLD_INDX_TBS’))
  11 AND owner = UPPER(’&&OWNER’)
  12 ORDER BY 1, 2;

视频学习

我考网版权与免责声明

① 凡本网注明稿件来源为"原创"的所有文字、图片和音视频稿件,版权均属本网所有。任何媒体、网站或个人转载、链接转贴或以其他方式复制发表时必须注明"稿件来源:我考网",违者本网将依法追究责任;

② 本网部分稿件来源于网络,任何单位或个人认为我考网发布的内容可能涉嫌侵犯其合法权益,应该及时向我考网书面反馈,并提供身份证明、权属证明及详细侵权情况证明,我考网在收到上述法律文件后,将会尽快移除被控侵权内容。

最近更新

社区交流

考试问答