对于加密,许多用户深感矛盾:他们既感兴趣,又因意识密钥管理的复杂性而感到慎重,如果处理不当,则会导致设置的效率低下。加密和解密值还会带来相关的性能开销,这使得大部分应用程序架构师不太乐于接受该过程。结果是,很多系统设计根本没有加密,只是构筑了强大的外围防护,如强大的口令和适当的授权方案。 但是,请想象一下如果整个服务器被盗了,甚至只是磁盘被盗,这些磁盘可以装配在具有相同操作系统的服务器上,然后其中的数据将被销毁殆尽。或者有一个的 DBA 品行不端,在日常业务活动中恶意突破了外围防护,然后将您所有重要的客户信息洗劫一空。在这两种情况下,如果所涉及的商业机构是在加利福尼亚州(可能不久之后在美国的其他州),它们在法律上有责任将安全漏洞的情况通知给所有受到影响的客户。中华考试网(www.Examw。com)
' b, r$ H* l1 J, a; w; r 在上述罕见(但确是事实)的情况中,认证方案没有实际意义。这就是为什么对于那些将安全作为头等大事的机构而言,透明数据加密 (TDE) 是一个如此有用的特性;它支持加密,同时将密钥管理的复杂性交给数据库引擎来处理。同时,它允许 DBA 在不必实际看到数据的情况下管理数据库表。
3 E V' j: Y" x z: B9 z 在 Oracle 数据库 10g 第 2 版中使用 TDE 时,可以随时地对表中的一列或多列进行加密;只需将列定义为加密形式即可,不用编写代码。请记住,加密需要使用密钥和算法对输入值进行加密。TDE 为特定的表生成单独的密钥。这种方法方便了密钥管理却也更易被他们窃取,所以数据库提供了另一种密钥 — 万能密钥 — ,它可以在数据库级别上设置。表密钥是利用万能密钥进行加密的,要获得表密钥就需要这个万能密钥。因此,对列进行解密时需要万能密钥和表密钥。. i2 ~' r8 @2 J9 S2 }) x5 v
万能密钥存储在数据库外一个称为“钱夹”的地方 — 默认位置在 $ORACLE_BASE/admin/$ORACLE_SID/wallet。在概念上,它类似于下图。8 D6 E+ I2 ?" E& |; X c1 Q( E: X
. ]4 X( U2 M$ G: C5 S* o 在配置 TDE 之后 — 或者更明确地说是配置了钱夹和万能密钥之后 — 您可以使用它来保护数据值。要为表的一列加密,需要使用以下 SQL:2 D& N: z" P3 X# T# s5 n
以下是代码片段:
2 g8 Q0 h2 X' q7 u# O H5 j' B
0 p* s9 `* G* T: r2 z0 i3 ycreate table accounts # s' U) ]) t; l8 h, D- f, W1 s/ j# a
(
$ A& j* C: y; o1 t7 u acc_no number not null,
. ~" N: O/ A5 y first_name varchar2(30) not null, 5 i: ]7 k* L0 `, g
last_name varchar2(30) not null, 1 k9 O, S" G! K0 L: F' l4 P0 @
SSN varchar2(9) ENCRYPT USING 'AES128',
+ ^# N/ e/ I% G/ P8 M, G acc_type varchar2(1) not null, : M: l6 l& [* J- }7 t- ?; c: v( U
folio_id number ENCRYPT USING 'AES128', 0 u) W# H$ x' r: G9 M' ]8 U. U
sub_acc_type varchar2(30), + O: S3 @% r( W0 t* o. E. g
acc_open_dt date not null,
' O) o4 n! `6 i8 G D q acc_mod_dt date, 7 d+ b9 f' K) ^6 E4 @1 m
acc_mgr_id number
+ u3 N& E! p( D* G: N& ~& h )
+ r1 H, x& Y" X- |2 K) [0 X" G* \1 x6 \
9 f% ?( ]# u8 P# ~ |
在这里,您在列 SSN 和 FOLIO_ID 上使用了 TDE,它们现在以加密方式存储在表本身。但是,当用户从表中选择时,她看到以明文表示的数据,因为在检索过程中已经完成了解密。如果磁盘被盗,则包含在表段中的信息仍然保持加密状态。盗窃者需要表密钥才能看到加密的值,但是要获得表密钥,他需要万能密钥,而万能密钥存储在外部,因此无法获得。
! L5 b+ K( W1 { 注意列 SSN 和 FOLIO_ID 后面的子句,这些子句指定 ENCRYPT 使用 128 位高级加密标准。! s! g1 n2 \* T# X6 B0 o
数据库拥有预先配置的钱夹。要设置钱夹口令,可使用命令:6 L8 E: t- ]( ~$ p5 X
以下是代码片段:# U6 j2 }$ O" \& O% O
2 `7 `+ i' x0 f7 ^
alter system set encryption key authenticated BY "topSecret";& k/ H+ s/ Y# t3 x
2 V- r/ @3 t ]. G 如果还未创建钱夹,该命令将先创建钱夹,然后将口令设置为“topSecret”(区分大小写)。然后您就可以开始在表的创建和更改期间将加密用于列定义。4 U4 @) a; I1 b$ I8 e
为外部表加密
N/ K' V5 U3 |4 o; J. z8 ~! ^" Y/ t7 N& W 在以上示例中,我使用散列表为列加密。您还可以在外部表上使用 TDE。例如,如果您希望生成一个包含 ACCOUNTS 的数据的转储文件,以便发送到不同的地点,则可以使用简单的 ENCRYPT 子句。
$ ^0 T- Q& L7 c, }8 b/ d1 |0 u" l3 Wcreate table account_ext 2 k. _3 c1 @0 u5 y& T7 }6 _
organization external
; d/ ^1 _2 ?$ T: }/ E: x# F. C! G (
6 j" W7 a- f) ~6 O! y, P type oracle_datapump
: C/ C; P O! X: t. l1 c- l$ F( w default directory dump_dir " n g2 F; J4 c9 X, ~
location ('accounts_1_ext.dmp', : f- H7 ~9 o0 Y4 n1 T
'accounts_2_ext.dmp',
- P5 @ v: I+ S2 t7 Q 'accounts_3_ext.dmp',
" _7 f- r/ D) p6 ] 'accounts_4_ext.dmp')
' b! V8 f, g% c5 o# x6 I* G7 _ )
( r' x3 W2 {2 ]9 X0 k5 c parallel 4 % e9 t$ t2 O+ y, f0 l7 q
as / b( ~2 D: e! o( x/ P
select
; J4 z/ v1 Y$ q3 j; E. D/ S ACC_NO, % r5 L" ^% \8 z( o {$ x
FIRST_NAME, 7 `' n, D: L1 K* P3 K& m" l
LAST_NAME, # k: R9 |2 L* ^& d
SSN ENCRYPT IDENTIFIED BY "topSecret",
* _# h4 S. s( W/ G4 `+ D ACC_TYPE, . B. w4 a$ x; m% J( t
FOLIO_ID ENCRYPT IDENTIFIED BY "topSecret",
+ s5 h/ Z% c- D' O0 A2 u/ N/ p4 K SUB_ACC_TYPE, 8 _' z& y" F: g! c6 }; K
ACC_OPEN_DT, ' E9 P7 c$ f1 I0 r C3 l
ACC_MOD_DT 8 U+ Y# E5 x( x( E8 t
from accounts;
- m) K4 p. j; i, V0 s! c9 K( r6 J# l0 t
在文件 accounts_*_ext.dmp 中,SSN 和 FOLIO_ID 的值不会是明文,而是加密形式。如果您希望使用这些文件作为外部表,则必须提供 topSecret 作为口令以读取这些文件。 |