透明加密
在透明加密中,密钥生成、密钥管理和加解密过程由数据库管理系统自动完成,用户不
可见。透明加密的目的主要是保证存储在数据文件中的敏感数据的安全,并不能保护合法用
户的个人私密数据。系统内置了常用的 DES,AES,RC4 等类型的加密算法,以此来保护数
据的安全性。
DM 支持的加密算法可通过查询动态视图 V$CIPHERS 得到,表 7.1 列出了 DM 具体支
持的加密和散列算法。
1.1 全库加密
对 DM 数据库进行全库加密需要在初始化数据库时通过 ENCRYPT_NAME 参数指定全库
加密算法,加密密钥由 DM 自动生成。若初始化数据库时不指定 ENCRYPT_NAME 参数,则
不进行全库加密。
指定的全库加密算法可以是 DM 内部支持的加密算法(可通过查询动态视图
V$CIPHERS 得到,也可见表 7.1),也可以是第三方加密算法。
指定全库加密时,在 DM 数据库服务器启动及运行的过程中,需要对处理的所有数据页
通过指定的加密算法和 DM 自动生成的密钥进行加解密处理。如果数据页读入缓存,需要进
行解密后才能使用,在缓存中的数据页进行刷盘时,需要对数据页进行加密后存储到数据文
件中。
1.2 表空间透明加密
DM 支持在创建表空间时指定进行透明加密,语法格式为:
CREATE TABLESPACE <表空间名><数据文件子句>[<数据页缓冲池子句>][<存储加密子句>]
<存储加密子句> ::= ENCRYPT WITH <加密算法>[[BY]<加密密码>
1.3 表列透明加密
DM 支持对表的列进行透明加密,支持建表时设置加密列,以及修改表定义时设置加密
列。存储加密支持所有的列类型,包括大字段类型。用透明加密的方式加密列上的数据时,
在数据库中保存加密该列的密钥,执行 DML 语句的过程中系统能自动获取密钥。
建表或修改表时指定对列进行透明加密的语法格式为:
……
<列定义> ::= <不同类型列定义> [<列定义子句>] [<STORAGE 子句>][<透明存储加密子句>]
<透明存储加密子句> ::= <透明存储加密子句 1>|<透明存储加密子句 2>
<透明存储加密子句 1>::= ENCRYPT [<透明加密用法>]
<透明存储加密子句 2> ::= ENCRYPT <透明加密用法><散列选项>
<透明加密用法> ::= WITH <加密算法> |
WITH <加密算法> AUTO |
AUTO
<加密密码 1> ::= BY <口令>
<加密密码 2> ::= BY WRAPPED „<口令密文>‟
<散列选项> ::= HASH WITH<散列算法> [<加盐选项>]
<加盐选项> ::= [NO] SALT
例如,以下是一些对表列进行透明加密的例子。
CREATE TABLE TEST_ENCRYPT1(C1 INT, C2 INT ENCRYPT);
CREATE TABLE TEST_ENCRYPT2(C1 INT, C2 INT ENCRYPT WITH DES_ECB);
CREATE TABLE TEST_ENCRYPT5(C1 INT, C2 INT ENCRYPT WITH DES_ECB HASH WITH MD5
SALT);
1.4 其他数据库对象加密
DM 还支持对存储过程、存储函数、触发器、包、类、自定义类型等的定义进行加密,
创建时在对象名称后加上“WITH ENCRYPTION ”即可。
例如,创建存储过程 proc_arg,对其定义进行加密。
CREATE OR REPLACE PROCEDURE proc_arg WITH ENCRYPTION(a IN INT, b INT)
AS
BEGIN
a:=0;
b:=A+1;
END;
7.2 半透明加密
在 2.2 节中可以看到,创建用户时可以指定存储加密密钥,这个密钥就是为了进行半
透明加密时使用的。如果在创建用户时并没有指定存储加密密钥,系统也会自动为用户生成
一个默认的加密密钥。
如果在创建表或修改表时指定对表列进行半透明加密,DM 会使用用户的存储加密密钥
对数据进行加密。
建表或修改表时指定对列进半透明加密的语法格式为:
<列定义> ::= <不同类型列定义> [<列定义子句>] [<STORAGE 子句>][<半透明存储加密子句>]
<半透明存储加密子句> ::= ENCRYPT [WITH <加密算法>] MANUAL[<散列选项>]
<散列选项> ::= HASH WITH <散列算法> [<加盐选项>]
<加盐选项> ::= [NO] SALT
例如,以下是一些对表列进行半透明加密的例子。
CREATE TABLE TEST_ENCRYPT6(C1 INT, C2 INT ENCRYPT MANUAL);
CREATE TABLE TEST_ENCRYPT7(C1 INT, C2 INT ENCRYPT WITH DES_ECB MANUAL);
CREATE TABLE TEST_ENCRYPT8(C1 INT, C2 INT ENCRYPT WITH DES_ECB MANUAL HASH
WITH MD5 SALT);
CREATE TABLE TEST_ENCRYPT9(C1 INT, C2 INT ENCRYPT MANUAL HASH WITH MD5 SALT);
7.3 非透明加密
DM 对非透明加密的支持是通过对用户提供加解密接口实现的。用户在使用非透明加密
时,需要提供密钥并调用加解密接口。采用非透明加密可以保证个人私密数据不被包括
DBA 在内的其他人获取。
非透明加密通过用户调用存储加密函数来进行,DM 提供了一系列的存储加密函数,还
提供了一个数据加密包 DBMS_OBFUSCATION_TOOLKIT。本节主要介绍 DM 的存储加密函
数,关于包 DBMS_OBFUSCATION_TOOLKIT 的介绍请参看《DM7 系统包使用手册》的相
关章节。
DM 提供了下列存储加密函数:
1. CFALGORITHMSENCRYPT
CFALGORITHMSENCRYPT(
SRC VARCHAR,
ALGORITHM INT,
KEY VARCHAR
)
参数说明:
SRC 需要被加密的 VARCHAR 类型数据
ALGORITHM 加密算法 ID,不可以为 NULL。加密算法对应的 ID 可通过查询
V$CIPHERS 得到
KEY 采用的密钥,不可以为 NULL
功能说明:
对 VARCHAR 类型的明文进行加密,并返回密文。
返回值:
加密后的密文,数据类型为 VARCHAR
举例说明:
对数据进行加密:
CREATE TABLE enc_001(c1 VARCHAR(200));
INSERT INTO enc_001 VALUES(CFALGORITHMSENCRYPT('tt', 514, '仅供测试使用'));
这样就将加密后的数据存放到表列中。
2. CFALGORITHMSDECRYPT
CFALGORITHMSDECRYPT(
SRC VARCHAR,
ALGORITHM INT,
KEY VARCHAR)
参数说明:
SRC 需要被解密的 VARCHAR 类型密文
ALGORITHM 加密算法 ID,不可以为 NULL。加密算法对应的 ID 可通过查询
V$CIPHERS 得到
KEY 采用的密钥,不可以为 NULL
功能说明:
对密文进行解密,并得到加密前的 VARCHAR 类型明文。
返回值:
解密后的明文,数据类型为 VARCHAR
举例说明:
对数据进行解密:
SELECT CFALGORITHMSDECRYPT(c1, 514, '仅供测试使用') FROM enc_001;
行号 CFALGORITHMSDECRYPT(C1,514,'仅供测试使用')
---------- ------------------------------------------
1 tt
3. SF_ENCRYPT_BINARY
SF_ENCRYPT_BINARY(
SRC VARBINARY,
ALGORITHM INT,
KEY VARCHAR,
IV VARCHAR
)
参数说明:
SRC 需要被加密的 VARBINARY 类型数据
ALGORITHM 加密算法 ID,不可以为 NULL。加密算法对应的 ID 可通过查询
V$CIPHERS 得到
KEY 采用的密钥,不可以为 NULL
IV 采用的初始化矢量,可以为 NULL
功能说明:
对 VARBINARY 类型明文进行加密,并返回密文。
返回值:
加密后的密文,数据类型为 VARBINARY
举例说明:
对数据进行加密:
CREATE TABLE enc_002(c1 VARBINARY(200));
INSERT INTO enc_002 VALUES(SF_ENCRYPT_BINARY(0x12345678EF, 514, '仅供测试使用',
NULL));
这样就将加密后的数据存放到表列中。
4. SF_DECRYPT_TO_BINARY
SF_DECRYPT_TO_BINARY(
SRC VARBINARY,
ALGORITHM INT,
KEY VARCHAR,
IV VARCHAR
)
参数说明:
SRC 需要被解密的 VARBINARY 类型密文
ALGORITHM 加密算法 ID,不可以为 NULL。加密算法对应的 ID 可通过查询
V$CIPHERS 得到
KEY 采用的密钥,不可以为 NULL
IV 采用的初始化矢量,可以为 NULL
功能说明:
对密文进行解密,并得到加密前的 VARBINARY 类型明文。
返回值:
解密后的明文,数据类型为 VARBINARY
举例说明:
对数据进行解密:
SELECT SF_DECRYPT_TO_BINARY(c1, 514, '仅供测试使用',NULL) FROM enc_002;
行号 SF_DECRYPT_TO_BINARY(C1,514,'仅供测试使用',NULL)
---------- ------------------------------------------------
1 0x12345678EF
5. SF_ENCRYPT_CHAR
SF_ENCRYPT_CHAR(
SRC VARCHAR,
ALGORITHM INT,
KEY VARCHAR,
IV VARCHAR
)
参数说明:
SRC 需要被加密的 CHAR/VARCHAR 类型数据
ALGORITHM 加密算法 ID,不可以为 NULL。加密算法对应的 ID 可通过查询
V$CIPHERS 得到
KEY 采用的密钥,不可以为 NULL
IV 采用的初始化矢量,可以为 NULL
功能说明:
对 VARCHAR 类型明文进行加密,并返回密文。
返回值:
加密后的密文,数据类型为 VARBINARY
举例说明:
对数据进行加密:
CREATE TABLE enc_003(c1 VARBINARY(200));
INSERT INTO enc_003 VALUES(SF_ENCRYPT_CHAR('测试数据', 514, '仅供测试使用',NULL));
这样就将加密后的数据存放到表列中。
6. SF_DECRYPT_TO_CHAR
SF_DECRYPT_TO_CHAR(
SRC VARBINARY,
ALGORITHM INT,
KEY VARCHAR,
IV VARCHAR
)
参数说明:
SRC 需要被解密的 VARBINARY 类型数据
ALGORITHM 加密算法 ID,不可以为 NULL。加密算法对应的 ID 可通过查询
V$CIPHERS 得到
KEY 采用的密钥,不可以为 NULL
IV 采用的初始化矢量,可以为 NULL
功能说明:
对密文进行解密,并得到加密前的 VARCHAR 类型明文。
返回值:
解密后的明文,数据类型为 VARCHAR
举例说明:
对数据进行解密:
SELECT SF_DECRYPT_TO_CHAR(c1, 514, '仅供测试使用',NULL) FROM enc_003;
行号 SF_DECRYPT_TO_CHAR(C1,514,'仅供测试使用',NULL)
---------- ----------------------------------------------
1 测试数据
7. SF_ENCRYPT_DATE
SF_ENCRYPT_DATE(
SRC DATE,
ALGORITHM INT,
KEY VARCHAR,
IV VARCHAR
)
参数说明:
SRC 需要被加密的 DATE 类型数据
ALGORITHM 加密算法 ID,不可以为 NULL。加密算法对应的 ID 可通过查询
V$CIPHERS 得到
KEY 采用的密钥,不可以为 NULL
IV 采用的初始化矢量,可以为 NULL
功能说明:
对 DATE 类型明文进行加密,并返回密文。
返回值:
加密后的密文,数据类型为 VARBINARY
举例说明:
对数据进行加密:
CREATE TABLE enc_004(c1 VARBINARY(200));
INSERT INTO enc_004 VALUES(SF_ENCRYPT_DATE(cast('2011-1-1' as date), 514, '仅
供测试使用',NULL));
这样就将加密后的日期类型数据存放到表列中。
8. SF_DECRYPT_TO_DATE
SF_DECRYPT_TO_DATE(
SRC VARBINARY,
ALGORITHM INT,
KEY VARCHAR,
IV VARCHAR
)
参数说明:
SRC 需要被解密的 VARBINARY 类型数据
ALGORITHM 加密算法 ID,不可以为 NULL。加密算法对应的 ID 可通过查询
V$CIPHERS 得到
KEY 采用的密钥,不可以为 NULL
IV 采用的初始化矢量,可以为 NULL
功能说明:
对密文进行解密,并得到加密前的 DATE 类型明文。
返回值:
解密后的明文,数据类型为 DATE
举例说明:
对数据进行解密:
SELECT SF_DECRYPT_TO_DATE(c1, 514, '仅供测试使用',NULL) FROM enc_004;
行号 SF_DECRYPT_TO_DATE(C1,514,'仅供测试使用',NULL)
---------- ----------------------------------------------
1 2011-01-01
9. SF_ENCRYPT_DATETIME
SF_ENCRYPT_DATETIME(
SRC DATETIME,
ALGORITHM INT,
KEY VARCHAR,
IV VARCHAR
)
参数说明:
SRC 需要被加密的 DATETIME 类型数据
ALGORITHM 加密算法 ID,不可以为 NULL。加密算法对应的 ID 可通过查询
V$CIPHERS 得到
KEY 采用的密钥,不可以为 NULL
IV 采用的初始化矢量,可以为 NULL
功能说明:
对 DATETIME 类型明文进行加密,并返回密文。
返回值:
加密后的密文,数据类型为 VARBINARY
举例说明:
对数据进行加密:
CREATE TABLE enc_005(c1 VARBINARY(200));
INSERT INTO enc_005 VALUES(SF_ENCRYPT_DATETIME(cast('2011-12-12 11:11:11' as
datetime), 514, '仅供测试使用',NULL));
这样就将加密后的日期时间类型数据存放到表列中。
10.SF_DECRYPT_TO_DATETIME
SF_DECRYPT_TO_DATETIME(
SRC VARBINARY,
ALGORITHM INT,
KEY VARCHAR,
IV VARCHAR
)
参数说明:
SRC 需要被加密的 DATETIME 类型数据
ALGORITHM 加密算法 ID,不可以为 NULL。加密算法对应的 ID 可通过查询
V$CIPHERS 得到
KEY 采用的密钥,不可以为 NULL
IV 采用的初始化矢量,可以为 NULL
功能说明:
对密文进行解密,并得到加密前的 DATETIME 类型明文。
返回值:
解密后的明文,数据类型为 DATETIME
举例说明:
对数据进行解密:
SELECT SF_DECRYPT_TO_DATETIME (c1, 514, '仅供测试使用',NULL) FROM enc_005;
行号 SF_DECRYPT_TO_DATETIME(C1,514,'仅供测试使用',NULL)
---------- --------------------------------------------------
1 2011-12-12 11:11:11.0
11.SF_ENCRYPT_DEC
SF_ENCRYPT_DEC(
SRC DEC,
ALGORITHM INT,
KEY VARCHAR,
IV VARCHAR
)
参数说明:
SRC 需要被加密的 DEC 类型数据
ALGORITHM 加密算法 ID,不可以为 NULL。加密算法对应的 ID 可通过查询
V$CIPHERS 得到
KEY 采用的密钥,不可以为 NULL
IV 采用的初始化矢量,可以为 NULL
功能说明:
对 DEC 类型明文进行加密,并返回密文。
返回值:
加密后的密文,数据类型为 VARBINARY
举例说明:
对数据进行加密:
CREATE TABLE enc_006(c1 VARBINARY(200));
INSERT INTO enc_006 VALUES(SF_ENCRYPT_DEC(cast('3.1415900000'as dec(15,10)),
514, '仅供测试使用',NULL));
这样就将加密后的 DEC 数据存放到表列中。
12.SF_DECRYPT_TO_DEC
SF_DECRYPT_TO_DEC(
SRC VARBINARY,
ALGORITHM INT,
KEY VARCHAR,
IV VARCHAR
)
参数说明:
SRC 需要被解密的 VARBINARY 类型数据
ALGORITHM 加密算法 ID,不可以为 NULL。加密算法对应的 ID 可通过查询
V$CIPHERS 得到
KEY 采用的密钥,不可以为 NULL
IV 采用的初始化矢量,可以为 NULL
功能说明:
对密文进行解密,并得到加密前的 DEC 类型明文。
返回值:
解密后的明文,数据类型为 DEC
举例说明:
对数据进行解密:
SELECT SF_DECRYPT_TO_DEC(c1, 514, '仅供测试使用',NULL) FROM enc_006;
行号 SF_DECRYPT_TO_DEC(C1,514,'仅供测试使用',NULL)
---------- ---------------------------------------------
1 3.141590000000
13.SF_ENCRYPT_TIME
SF_ENCRYPT_TIME(
SRC TIME,
ALGORITHM INT,
KEY VARCHAR,
IV VARCAHR
)
参数说明:
SRC 需要被加密的 TIME 类型数据
ALGORITHM 加密算法 ID,不可以为 NULL。加密算法对应的 ID 可通过查询
V$CIPHERS 得到
KEY 采用的密钥,不可以为 NULL
IV 采用的初始化矢量,可以为 NULL
功能说明:
对 TIME 类型明文进行加密,并返回密文。
返回值:
加密后的密文,数据类型为 VARBINARY
举例说明:
对数据进行加密:
CREATE TABLE enc_007(c1 VARBINARY(200));
INSERT INTO enc_007 VALUES(SF_ENCRYPT_TIME(cast('12:12:12' as time), 514, '仅
供测试使用',NULL));
这样就将加密后的时间类型数据存放到表列中。
14.SF_DECRYPT_TO_TIME
SF_DECRYPT_TO_TIME(
SRC VARBINARY,
ALGORITHM INT,
KEY VARCHAR,
IV VARCHAR
)
参数说明:
SRC 需要被解密的 VARBINARY 类型数据
ALGORITHM 加密算法 ID,不可以为 NULL。加密算法对应的 ID 可通过查询
V$CIPHERS 得到
KEY 采用的密钥,不可以为 NULL
IV 采用的初始化矢量,可以为 NULL
功能说明:
对密文进行解密,并得到加密前的 TIME 类型明文。
返回值:
解密后的明文,数据类型为 TIME
举例说明:
对数据进行解密:
SELECT SF_DECRYPT_TO_TIME(c1, 514, '仅供测试使用',NULL) FROM enc_007;
行号 SF_DECRYPT_TO_TIME(C1,514,'仅供测试使用',NULL)
---------- ----------------------------------------------
1 12:12:12.0
15.SF_GET_CIPHER_NAME
SF_GET_CIPHER_NAME(
CIPHER_ID IN INT
)
参数说明:
CIPHER_ID 加密算法 ID
功能说明:
根据加密算法 ID,获取加密算法的名称
返回值:
加密算法的名称,最大长度 32767
举例说明:
CREATE TABLE T1(C1 INT ENCRYPT ,C2 INT ENCRYPT );
SELECT ID FROM SYSOBJECTS WHERE NAME = 'T1';
--设返回 1152
SELECT * FROM SYS.SYSCOLCYT WHERE TID = 1152;
--SYSCOLCYT 表中 ENC_ID 列对应的值,即为列的加密类型 ID,此处返回 2050
SELECT SF_GET_CIPHER_NAME(2050);
行号 SF_GET_CIPHER_NAME(2050)
---------- ------------------------
1 AES256_CBC
更多内容请访问