Transparent Data Encryption

在Oracle10g之前,Oracle虽然提供了类似帐号认证,授权以及审计等机制来保证数据库中的数据安全性,但是这些机制都是Oracle运行状态下提供的。对于最终保存在数据文件中的数据,基本上等于是明文保存的,虽然不同的数据类型在存储到数据文件中的格式有区别,但实际上这些存储格式已经广为人知,也有一些工具能够直接从数据文件中读取数据,比如官方的DUL和网友d.c.b.a开发的AUL等。

一、什么是TDE

10gR2引入的透明数据加密(TDE)特性,允许在不影响应用的情况下,加密最终存储到数据文件中的数据,以防止未经授权的直接读取数据文件获得数据的行为。为防止未经授权的解密访问,TDE将加密密钥存储在数据库外部。

TDE允许对列中的数据存储进行加密处理,并且不需要由最终用户或者应用来管理或者使用密钥来获得解密数据。

TDE特性属于Advanced Security组件。

目前,TDE还不支持以下特性:

  • B*Tree索引之外的其他索引类型
  • 索引范围扫描
  • 大对象如BLOB和CLOB
  • imp/exp工具(但是支持impdp/expdp)
  • 使用其他直接读取数据文件的工具如DUL/AUL

在不能使用TDE的时候,可以考虑使用DBMS_CRYPTO包替代,该包能实现数据的加密后存放,但不能对应用透明,应用在查询加密数据前必须显式解密。

需要注意的是,加密一个已经存在数据的表中的列,会导致全表更新,对于大表进行该操作前需严格的规划和测试。

二、TDE的工作机制

TDE是一种基于密钥的访问控制方式。数据以某种密钥加密存储,在访问时,如果没有解密密钥,则无法获得需要的数据。访问时的解密是自动进行的,对于应用程序完全透明。

当一个表中的一个或者多个列被加密时,需要为这个表分配一个密钥(一个表只需要一个密钥)。系统中所有的密钥在经过服务器中的一个主密钥加密后存储在数据字典中,也就是说,密钥本身也是加密存储的。

而服务器主密钥则存储在数据库外部,使用外部安全机制来保证主密钥的安全控制。这个外部安全机制就是oracle提供的wallet机制。

三、如何使用TDE

要使用透明数据加密特性,用户需要有alter system系统权限,并且拥有有效的oracle wallet密码。如果还没有wallet存在,则下面的SQL语句创建一个,其密码就是指定的password:

alter system set encryption key identitified by password

执行该语句之前,必须保证$ORACLE_HOME/admin/$ORACLE_SID下已经有名叫wallet的目录,否则将出现错误:

NING@ning>alter system set encryption key identified by test;
alter system set encryption key identified by test
*
ERROR at line 1:
ORA-28368: cannot auto-create wallet

以上路径是默认的wallet存放路径,也可以通过在sqlnet.ora文件中设置如下属性更改wallet的路径:

ENCRYPTION_WALLET_LOCATION=
(SOURCE=(METHOD=FILE)(METHOD_DATA=
(DIRECTORY=D:wallet)))

该语句执行后,会打开已经存在的wallet或者新生成一个wallet并打开然后创建主密钥执行成功后就可以创建包含加密列的table了

SYS@ning>create table test(id int, name varchar2(100) encrypt);
create table test(id int, name varchar2(100) encrypt)
*
ERROR at line 1:
ORA-28336: cannot encrypt SYS owned objects

可以看到,sys的对象不能使用加密列

SYS@ning>conn ning/ning
Connected.

NING@ning>create table test(id int, name varchar2(100) encrypt);

Table created.

这样,就创建了一个table,关键字encrypt表示其第二个列为加密列。

NING@ning>insert into test values(1,'a');

1 row created.

NING@ning>select * from test;

ID NAME
---------- ----------------------------------------
1 a

对于应用来说,加密列和普通列没有什么区别。dump出数据的实际存储看看NING@ning>select dbms_rowid.rowid_relative_fno(rowid) fno,
2 dbms_rowid.rowid_block_number(rowid) block#
3 from test;

FNO BLOCK#
---------- ----------
5 34

NING@ning>alter system dump datafile 5 block 34;

System altered.

找到对应的trace文件:
data_block_dump,data header at 0x7e25064
===============
tsiz: 0x1f98
hsiz: 0x14
pbl: 0x07e25064
bdba: 0x01400022
76543210
flag=--------
ntab=1
nrow=1
frre=-1
fsbo=0x14
fseo=0x1f5d
avsp=0x1f49
tosp=0x1f49
0xe:pti[0] nrow=1 ffs=0
0x12:pri[0] ffs=0x1f5d
block_row_dump:
tab 0, row 0, @0x1f5d
tl: 59 fb: --H-FL-- lb: 0x1 cc: 2
col 0: [ 2] c1 02
col 1: [52]
27 8f d5 a5 79 8b cc 69 d1 3f f7 0e ea f7 30 d5 76 28 80 5f ce b1 1c 7d e8
34 10 6a 97 1b 41 e6 9f 48 58 bd 16 b9 ed 2f ef 81 52 35 cf 89 2e 72 12 82
fe 74

end_of_block_dump

可以发现col 1的数据不像没有加密过的数据那样保存了'a'的ASCII值,而是加密后的一长串

的值。我们可以看一个没有加密的同样的表的dump结果:
data_block_dump,data header at 0x7e25064
===============
tsiz: 0x1f98
hsiz: 0x14
pbl: 0x07e25064
bdba: 0x010000ef
76543210
flag=--------
ntab=1
nrow=1
frre=-1
fsbo=0x14
fseo=0x1f90
avsp=0x1f7b
tosp=0x1f7b
0xe:pti[0] nrow=1 ffs=0
0x12:pri[0] ffs=0x1f90
block_row_dump:
tab 0, row 0, @0x1f90
tl: 8 fb: --H-FL-- lb: 0x1 cc: 2
col 0: [ 2] c1 02
col 1: [ 1] 61
end_of_block_dump
End dump data blocks tsn: 4 file#: 4 minblk 239 maxblk 239

col 1的长度由普通表的1字节变成了加密表中的52字节,那么对于加密表,可能需要更多的存储空间,这样,在安全性和性能之间,就需要做一个权衡了。

对于已经存在的普通表,也可以将其中的某些列加密:

alter table table_name modiry (column_name column_type encrypt);

也可以将已经加密的列修改成不加密的状态:

alter table table_name modiry (column_name column_type decrypt);

除了encrypt,加密列还有另外一个属性salt,默认情况下是salt,可以修改成no salt

alter table table_name modiry (column_name column_type encrypt no salt);

只有no salt的加密列上才能创建索引

NING@ning>create index ix_test on test(name);
create index ix_test on test(name)
*
ERROR at line 1:
ORA-28338: cannot encrypt indexed column(s) with salt

NING@ning>alter table test modify(name varchar2(100) encrypt no salt);

Table altered.

NING@ning>create index ix_test on test(name);

Index created.


四、管理TDE

TDE运行期间,必须保证wallet处于open状态,如果wallet被关闭,则加密的数据列将无法访问

NING@ning>alter system set wallet close;

System altered.

NING@ning>select * from test;
select * from test
*
ERROR at line 1:
ORA-28365: wallet is not open

NING@ning>alter system set wallet open;
alter system set wallet open
*
ERROR at line 1:
ORA-28356: invalid open wallet syntax


NING@ning>alter system set wallet open identified by test1;
alter system set wallet open identified by test1
*
ERROR at line 1:
ORA-28353: failed to open wallet


NING@ning>alter system set wallet open identified by test;

System altered.

NING@ning>alter system set wallet open identified by test;
alter system set wallet open identified by test
*
ERROR at line 1:
ORA-28354: wallet already open

NING@ning>select * from test;

ID NAME
---------- ----------------------------------------
1 a

默认情况下,数据库关闭后wallet也会关闭,但是数据库重启启动后wallet不会自动open,需要手动open后才可以访问加密数据。

可以在Oracle wallet manager图形管理工具中设置wallet随数据库启动后自动启动

注意wallet目录下的文件不能丢失,否则将导致加密的数据无法访问

NING@ning>select * from test;
select * from test
*
ERROR at line 1:
ORA-28362: master key not found

如果我们需要重设主密钥,那么就要先将加密数据解密存储,重新生成主密钥,再将已经解密

的数据重新加密。

对于加密的列,我们可以重新修改加密使用的算法:

NING@ning>alter table test rekey using 'AES192';

Table altered.

NING@ning>alter table test rekey using '3DES168';

Table altered.

五、相关视图

v$wallet
dba_encrypted_columns
all_encrypted_columns
user_encrypted_columns

参考文章:
Oracle® Database Advanced Security Administrator's Guide

转自:http://ningoo.itpub.net/post/2149/283468


补充:

有两种类型的Wallet: 加密钱夹和自动打开钱夹

1. 加密钱夹创建

必须指定钱夹位置:默认的位置为$ORACLE_HOME/admin/$ORACLE_SID

或者通过sqlnet.ora文件来指定, 如:

WALLET_LOCATION=(SOURCE=(METHOD=FILE)(METHOD_DATA=(DIRECTORY=/u01/app/oracle/admin/orcl/wallet)))

然后创建钱夹:

SQL> ALTER SYSTEM SET ENCRYPTION KEY IDENTIFIED BY "PASSWORD";

SQL> ALTER SYSTEM SET WALLET OPEN IDENTIFIED BY "PASSWORD";

SQL> ALTER SYSTEM SET WALLET CLOSE;

2. 自动打开钱夹

自动打开钱夹不像加密钱夹那样需要每次先打开再使用,自动钱夹适合与无用户交互的环境如DATA GUARD.

创建自动打开钱夹首先需要创建了加密钱夹,然后执行:

orapki wallet create -wallet  -auto_login

加密钱夹创建文件'ewallet.p12', 自动打开钱夹创建文件'cwallet.sso'.

参考文档: http://www.oracle.com/technology/global/cn/deploy/security/database-security/transparent-data-encryption/tde_faq.html?_template=/ocom/print

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/9466564/viewspace-610629/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/9466564/viewspace-610629/

### Shopee 中 `encrypted_data` 的处理方式 在讨论 Shopee 如何处理加密数据之前,理解透明数据加密(Transparent Data Encryption, TDE)的概念至关重要。TDE 是一种用于保护静态数据的技术,旨在防止未经授权访问存储介质上的敏感信息[^1]。 对于像 Shopee 这样的电子商务平台,在 API 和数据库层面处理 `encrypted_data` 主要涉及以下几个方面: #### 1. 数据库层面上的加密机制 Shopee 可能采用 Oracle Wallet Management 来管理 TDE 密钥。通过这种方式,可以确保即使物理磁盘被盗取,攻击者也无法读取其中的数据,因为这些数据已经被加密,并且解密所需的密钥被安全地保存在一个独立的钱包文件中。 ```sql -- 创建表空间并启用 TDE 加密 CREATE TABLESPACE secure_tablespace DATAFILE 'secure.dbf' SIZE 10M ENCRYPTION USING 'AES256'; ``` #### 2. 应用程序接口中的加密传输 为了保障网络通信的安全性,Shopee 使用 HTTPS 协议来加密客户端与服务器之间的所有交互。这不仅包括用户登录凭证等敏感信息,也涵盖了任何可能包含个人身份信息或其他机密资料的内容。此外,API 请求通常会附加数字证书以验证双方的身份真实性,从而进一步增强安全性[^3]。 ```python import requests response = requests.get('https://api.shopee.com/endpoint', verify='path/to/certfile') print(response.status_code) ``` #### 3. 解密过程概述 当应用程序需要访问已加密的数据时,它必须先向 Oracle 数据库请求相应的解密服务。此操作依赖于预先配置好的钱包管理和权限控制策略。只有经过授权的应用组件才能执行这样的查询动作,而且整个过程中不会暴露原始明文给外部环境。 需要注意的是,具体到 Shopee 平台内部如何实现上述功能细节属于商业秘密范畴,外界无法获取确切的信息。但从行业标准和技术趋势来看,以上描述代表了一种合理的推测模型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值