dm7存储加密

透明加密

在透明加密中,密钥生成、密钥管理和加解密过程由数据库管理系统自动完成,用户不

可见。透明加密的目的主要是保证存储在数据文件中的敏感数据的安全,并不能保护合法用

户的个人私密数据。系统内置了常用的 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

更多内容请访问

达梦数据库 - 新一代大型通用关系型数据库 | 达梦云适配中心

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值