a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 132|回复: 2

[其他] Oracle认证:使用Oracle的TDE特性加密(2)

[复制链接]
发表于 2012-8-4 13:41:06 | 显示全部楼层 |阅读模式
SQL> -- Remove existing synthetic data
3 M6 G$ r0 X# w! s- c2 X  SQL> TRUNCATE TABLE app_001.transactions;
, y5 r" T, O+ b3 _1 y  Table truncated.. P+ `. s4 E7 N! _+ y0 l3 T
  SQL> -- Disable encryption of the credit card column8 o6 Q+ p  \$ D) _8 n& P
  SQL> ALTER TABLE app_001.transactions
/ G" Z, y: J! ~6 v  2 MODIFY (credit_card DECRYPT);
5 J, @: y! [6 V9 \. ?  Table altered." V' d+ ~* \  L/ D! _7 j0 K
  SQL> -- Load new synthetic data
, A( x7 W2 y) r) m. P3 i; p) }0 p  SQL> BEGIN
$ E0 _+ ^* O& `6 E, c2 x  2 -- AMEX7 |+ `" G5 C% o  x3 g1 C
  3 FOR i IN 1 .. 100000 LOOP
' W# r- m. W( u0 i) H% S  4 INSERT INTO app_001.transactions(trans_id, credit_card)
# g* H  x# N( t  5 VALUES (. O) N7 |2 d9 r2 R5 S
  6 i,* t/ S8 M/ z+ w9 l
  7 ’34’ || TRUNC(DBMS_RANDOM.VALUE(low=>0, high=>99999999999999))
# R* g* g/ O$ L! r, s* H  8 );
8 X. d  D7 h! Q8 ?" ]  9 END LOOP;
8 n1 F! m. B2 e9 r; o: i+ r! T  10 COMMIT;$ f+ [  R: G4 t; H2 q" f
  11 -- VISA, n  I' D  C* s: A
  12 FOR i IN 100001 .. 400000 LOOP
5 `9 a% ]) Y8 }. D6 B  13 INSERT INTO app_001.transactions(trans_id, credit_card)% U) Z( d; g( J  e! o
  14 VALUES (# R: `, v" h0 p! \- X9 V2 s
  15 i,
( w& ]; }9 M" j; B; c$ w# g1 s  16 ’4’ || TRUNC(DBMS_RANDOM.VALUE(low=>0, high=>999999999999999)), |, W' R2 o- P9 F
  17 );: R3 q$ a" W% R' ?7 p3 T
  18 END LOOP;
7 ?3 y7 N7 Z& ~* D5 X0 G  19 COMMIT;+ ?- v; A8 z4 f) a6 o9 N( p
  20 -- MASTERCARD
- ~! P, Q& ~4 F; k# ]7 H  21 FOR i IN 400001 .. 500000 LOOP; B% R. ^- b+ F0 b, a/ a
  22 INSERT INTO app_001.transactions(trans_id, credit_card)
$ H" r0 z, A& x1 r  H  23 VALUES (, ^7 _5 g! s& `1 E- e! x
  24 i,: l4 t, g3 P9 a. \3 `$ Q; o
  25 ’54’ || TRUNC(DBMS_RANDOM.VALUE(low=>0, high=>99999999999999))
& e( Y' U; {" V( V- }  26 );8 `/ J  Y% p+ u2 {# }  ?& C6 i
  27 END LOOP;
# I$ Z8 a# k7 E3 s6 k$ y  28 COMMIT;
0 t" Z6 k( x1 ^% G  29 END;
' b' o0 s6 r: {/ h9 Z& l* E  30 /" H" a% a& e2 ~
  PL/SQL procedure successfully completed.
5 q3 U4 B# \: G% y/ f1 M9 a  SQL> -- Time how long it takes to encrypt credit card data
  o* D# ^4 I2 N- U  SQL> -- with corresponding indexes in place
. r+ m- M) I$ h$ V  SQL> SET TIMING ON;
9 i$ V# f7 n, O- i- l6 T5 {  F  SQL> ALTER TABLE app_001.transactions
) {) N# W+ O' ~' F( _# D& Q; ?  2 MODIFY (credit_card ENCRYPT NO SALT);! o9 o1 a  g6 v$ \) h1 f
  Table altered.9 [* R! f' _# r3 |' I
  Elapsed: 00:02:27.18
1 Y: v! O6 f5 y& V9 N% k/ `) I  SQL> SET TIMING OFF;+ w, M6 j3 c% s# z/ e
  SQL> -- Remove existing synthetic data
% I: \2 q, u* p7 E- e+ t  SQL> TRUNCATE TABLE app_001.transactions;" T! L. W" U+ ?& ?8 U7 l: R
  Table truncated.3 C& R# u8 j- }! @% R3 K& q
  SQL> -- Drop all indexes that correspond to the credit card column
, h% z9 O" b! U" }/ [) H# ?  SQL> DROP INDEX app_001.transactions_ndx1;
# ~' s! q1 l3 V+ @# J* l, _+ c  Index dropped.; E7 B! L/ E% h4 J' M- z% ?$ m3 i5 ?6 W
  SQL> -- Disable encryption of the credit card column! F# ~* q7 j) b/ f" D
  SQL> ALTER TABLE app_001.transactions
0 B* K, D1 G, J" g/ y) L3 A
: N+ w6 G' g* S( o! [+ N  2 MODIFY (credit_card DECRYPT);
回复

使用道具 举报

 楼主| 发表于 2012-8-4 13:41:07 | 显示全部楼层

Oracle认证:使用Oracle的TDE特性加密(2)

</p>  Table altered.+ b3 l  a: B6 S
  SQL> -- Load new synthetic data) {- p8 g, m1 u! G
  SQL> BEGIN! ^6 u9 G9 r7 C. o) ?5 b0 z8 u
  2 -- AMEX/ r0 @7 G0 ?- p- c5 [- Q1 d5 }
  3 FOR i IN 1 .. 100000 LOOP
5 v: z* V) c3 C2 N; H& Y5 ]  4 INSERT INTO app_001.transactions(trans_id, credit_card)
( U2 \0 f. {# n  5 VALUES (
% C: l4 u2 p: v+ j# J0 L" u  6 i,
$ Q. B9 P2 S2 u4 ~& m  7 ’34’ || TRUNC(DBMS_RANDOM.VALUE(low=>0, high=>99999999999999))  o. A8 \8 H$ [8 p2 z: Q+ S
  8 );
1 }7 F/ x6 ], j  9 END LOOP;& Y& h, a0 O+ g' H, o' m2 _
  10 COMMIT;3 w) W. B2 L" l3 G1 L0 C* }
  11 -- VISA6 q6 s- [) H6 _1 \3 r
  12 FOR i IN 100001 .. 400000 LOOP
5 l4 H, R( h: M0 e1 }  13 INSERT INTO app_001.transactions(trans_id, credit_card)
5 l* t5 K# m& ~& K, X  14 VALUES (
% `8 ]- g  Y8 \. B/ [  Z  15 i,
$ r/ }' C; }0 a. `  16 ’4’ || TRUNC(DBMS_RANDOM.VALUE(low=>0, high=>999999999999999))0 J; j5 H% S+ p' Z$ B8 b
  17 );
1 a; c0 j4 z1 @  18 END LOOP;
7 W$ O& {  o+ \  19 COMMIT;
- a- ]4 d% s, C: m( ]  20 -- MASTERCARD
9 A" o8 t+ ~/ C* e2 F  21 FOR i IN 400001 .. 500000 LOOP& f( t8 I1 Z+ s" s1 A6 ], q
  22 INSERT INTO app_001.transactions(trans_id, credit_card)6 t. p. v1 c( w  `( B) n" \  S
  23 VALUES (  m. v) a3 q4 _# _" Y5 D# {
  24 i,0 g* ~- w  l5 G" \2 v
  25 ’54’ || TRUNC(DBMS_RANDOM.VALUE(low=>0, high=>99999999999999)): B" ~/ e' @# |' j
  26 );
2 |; G9 Q: p9 n* p2 d  27 END LOOP;
# H8 w* S  r+ V# E" f+ D" a+ {* U; R  28 COMMIT;4 L% L4 m) f8 N. _& q* P
  29 END;$ l6 E/ u3 ~/ {* k2 }: ~
  30 /3 p( g* g# f; G1 W' R8 T; c
  PL/SQL procedure successfully completed.
0 v+ g/ L1 Z: [; q  SQL> -- Time how long it takes to:
! L& E" `6 k/ }: e3 f. |0 ~  SQL> -- 1. Encrypt credit card data without corresponding indexes in place2 k% b  _& @, Y/ y8 F4 y
  SQL> -- 2. Recreate corresponding indexes. S' {; ~# E: |  Y4 y
  SQL> SET TIMING ON;5 Y$ P# {* A  I3 ]
  SQL> ALTER TABLE app_001.transactions8 K0 I$ r  l1 ]2 q5 D
  2 MODIFY (credit_card ENCRYPT NO SALT);
( I5 c3 L8 @: q/ o$ {) ^# Y/ x5 v8 I  Table altered.
" J8 y# i# R1 @  Elapsed: 00:01:15.487 ^1 q$ c0 i, j+ i
  SQL> CREATE INDEX app_001.transactions_ndx13 C( d" A+ W6 F
  2 ON app_001.transactions(credit_card)' z3 f2 v! f1 ?, C
  3 TABLESPACE indx_0018 s* [3 Y; ?4 O3 u8 {$ A1 L
  4 PARALLEL 2$ `* F& i2 _0 A2 C
  5 NOLOGGING;' C# V* O" c) @' t8 H* l
  Index created.% C; S3 }4 i( q2 r
  Elapsed: 00:00:02.98
+ p4 r: S  B4 f8 W' E* s8 [  E0 I  ?- m" @& ]" x/ Y" {
  SQL> SET TIMING OFF;
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-8-4 13:41:08 | 显示全部楼层

Oracle认证:使用Oracle的TDE特性加密(2)

</p>  列表 2 要快速执行对现稀有据进行加密的过程,只需在对其进行加密之前删除列的底层索引,然后再重建索引。
, N2 ?1 N, d+ H1 a8 z  注:本文的模拟情形中使用了 CREATE INDEX 语句。在现实的设置中,可考虑使用 Oracle 数据库的 D
1 \; y2 c- _2 f1 I0 S- `  BMS_METADATA 适用轨范包来生成 CREATE INDEX 语句,您可以使用这些语句在完成数据加密之后从头建树索引。
. F9 i$ r7 s( }4 J# z, }1 ~* ?  总之,在列加密之后重建索引的新策略可留出更多时刻来措置整个过程中最具挑战性的问题,这将不才一部门中进行声名。& a# Y8 h4 y* V% [
  删除未加密数据的虚副本- n* F* Y( B7 I6 x% d3 L
  Oracle 和底层主机操作系统使用优化的算法来更新数据块中的数据,目的是最大水平地削减降低机能的磁盘 I/O。在对现有列数据进行加密的特定情形下,凡是发生的一件事是 Oracle 将加密的列数据写入到新数据块而且只是将之前未加密的置魅占用的空间标识表记标趾稳绱使用。换句话说,Oracle 不会考试考试断根较旧的未加密数据。只要所谈判的系统持续碰着大量更新勾当,您就有理由确信当重用块空间时 Oracle 将最终笼盖较旧的未加密数据。可是考虑到我的客户正在筹备进行合规性审计,我必需确保在加密过程之后当即擦除未加密的敏感数据。
: \* Q4 A3 C, S9 D( P. z  进行了良多研究之后,我在 Oracle 手艺网上发现了一个 FAQ 以及一个网志,该网志确认这一特定问题并供给了有关解决该问题的一些根基设法。一般的设法是将包含之前未加密数据的所有段移动到新的表空间(以及数据文件),然后使用一个操作系统适用轨范删除旧数据文件。但该做法听起来轻易,做起来难。事实是,在平安删除旧表空间及其数据文件之前,您很有可能需要移动大量段以及包含敏感数据的段。6 ]! K, J! V; I  X
  为了使这一可能否时吃力且易于犯错的过程自动进行,我将一些剧本放在一路,以辅佐我构建完成这一切所需的 DDL 语句。这里,我要向 Tom Kyte 暗示谢意,因为此处的一些工作是改削我在 Asktom 站点找到的内容发芽。列表 3 显示了我使用的整个过程的一个示例。& X3 Q6 c' R2 u# m$ X" h
  Enter password:* |) ~* J& A. }0 A
  Connected.
5 _# Z# w  s5 _$ [  SQL> -- Create new tablespaces for data and index segments# Y% n% g% A& d- f6 N
  SQL> CREATE TABLESPACE data_002 DATAFILE SIZE 1G;
+ v3 W) X/ h4 }/ S; x9 h  Tablespace created.7 }7 j1 h' ?8 f
  SQL> CREATE TABLESPACE indx_002 DATAFILE SIZE 500M;4 P. }* S! x. D" g% @; ^% w
  Tablespace created.
, T) p9 u' t2 ]% O' m5 `  SQL> -- Generate a script to move existing segments to new tablespaces" n6 J. _4 P5 ^, V" @
  SQL> COL ORDER_COL1 NOPRINT;
$ Z) ~  _' m6 o6 x; m5 u  SQL> COL ORDER_COL2 NOPRINT;
7 E; |9 y0 y- A; j  SQL> SET HEADING OFF;* o4 s1 Z6 V9 T
  SQL> SET VERIFY OFF;- T" ^, n3 I! b* C+ c& C' Y7 ]
  SQL> SET ECHO OFF;: q' c( k. Q4 c* _
  SQL> SELECT DECODE( segment_type, ’TABLE’ , segment_name, table_name ) order_col1,: T5 q# {8 U6 ^
  2 DECODE( segment_type, ’TABLE’, 1, 2 ) order_col2,( E9 s9 }- z  A4 {  |# {8 U
  3 ’ALTER ’ || segment_type || ’ ’ || LOWER(owner) || ’.’ || LOWER(segment_name) ||0 ^( r- ?0 H& F! h- s) P
  4 DECODE( segment_type, ’TABLE’, ’ MOVE ’, ’ REBUILD ’ ) ||+ e' q* H/ t7 s% G: \6 L
  5 ’TABLESPACE ’ || LOWER(DECODE( segment_type, ’TABLE’ , ’&&NEW_DATA_TBS’ , ’&&NEW_INDX_TBS’ )) || ’;’3 V% `; k9 `7 H" D( c( O
  6 FROM dba_segments,  u1 k. T- k% i4 [) M
  7 (SELECT table_name, index_name FROM dba_indexes WHERE tablespace_name = UPPER(’&&OLD_INDX_TBS’))
- S# q# C  J8 F/ x  8 WHERE segment_type in ( ’TABLE’, ’INDEX’ )  W& F) j' a, E; C; A
  9 AND segment_name = index_name (+)
- n+ |) Q$ b6 p) D$ y  10 AND tablespace_name IN (UPPER(’&&OLD_DATA_TBS’), UPPER(’&&OLD_INDX_TBS’))& p2 T3 S2 F8 p4 `  @. ^' z
  11 AND owner = UPPER(’&&OWNER’)
7 b2 l" A" ?! z  p  12 ORDER BY 1, 2;
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-5-4 15:20 , Processed in 0.256476 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表