KingbaseES中的数据访问保护
1.1. 管理上下文¶
1.1.1. 关于上下文¶
在KingbaseES中,CONTEXT上下文是指一组应用程序定义的属性,用于验证和保护应用程序。
使用 CREATE CONTEXT 语句为context创建namespace标签,将namespace与用来设置context的包相关联。可以使用 DBMS_SESSION.SET_CONTEXT 程序在关联包中设置context的属性值key-value。
namespace中的key-value只允许会话级访问,即只有设置其属性值的会话才可以访问该值, 其他会话访问该属性值都为空。系统视图sys_context包含数据库上下文所有信息。
例如:创建一个名为context_test的context,关联包为package_test:
CREATE CONTEXT context_test USING package_test;
1.1.2. 上下文的使用¶
在KingbaseES中,通过使用dbms_session系统包中的过程来管理上下文。在使用 dbms_session 之前,需要将他添加到 kingbase.conf 文件的 shared_preload_libraries 中,并重启 KingbaseES 数据库:
shared_preload_libraries = 'dbms_session'
详情参见插件 dbms_session 。
DBMS_SESSION系统包包含的子程序及简介如下表所示:
过程名 | 功能 |
---|---|
CLEAR_ALL_CONTEXT 过程 | 清理当前会话的指定namespace的所有上下文。 |
CLEAR_CONTEXT 过程 | 清除namespace中的attribute值。 |
LIST_CONTEXT 过程 | 返回当前会话所有上下文属性和值。 |
SET_CONTEXT 过程 | 设置上下文 namespace的属性和值。 |
下面通过一个示例演示上下文的使用:
-
创建 package
CREATE EXTENSION dbms_session; set ora_input_emptystr_isnull=off; create schema context_schema1; grant usage on schema context_schema1 to public; grant all on schema context_schema1 to public; create or replace context context1 using context_schema1.test_package; \set SQLTERM / CREATE OR REPLACE PACKAGE context_schema1.test_package as procedure set_context(ts_name varchar, key varchar, value varchar); procedure clear_context(ts_name varchar,client_identifier varchar, key varchar); procedure clear_all_context(ts_name varchar); end test_package; / CREATE or replace PACKAGE BODY context_schema1.test_package as procedure set_context(ts_name varchar, key varchar, value varchar) as begin dbms_session.set_context(ts_name, key,value); end; procedure clear_context(ts_name varchar,client_identifier varchar, key varchar) as begin dbms_session.clear_context(ts_name,client_identifier, key); end; procedure clear_all_context(ts_name varchar) as begin dbms_session.clear_all_context(ts_name); end; end test_package; / \set SQLTERM ;
-
创建 context
create or replace context c_user01 using context_schema1.test_package;
-
设置 namespace 的key-value
call context_schema1.test_package.set_context('c_user01', 'u_k2', 'u_v2');
-
查询
select sys_context('c_user01', 'u_k2'); SYS_CONTEXT('C_USER01','U_K2') --------------------------------------------------- u_v2
-
修改u_k2的值并查询
call context_schema1.test_package.set_context('c_user01', 'u_k2', 'u_v2222'); Select sys_context('c_user01', 'u_k2'); SYS_CONTEXT('C_USER01','U_K2') --------------------------------------------------- u_v2222
-
增加新的属性值u_k3并查询
call context_schema1.test_package.set_context('c_user01', 'u_k3', 'u_v3'); select sys_context('c_user01', 'u_k3'); SYS_CONTEXT('C_USER01','U_K3') ------------------------------------------------- u_v3
-
清除上下文c_user01属性u_k2的值并再次查询
call context_schema1.test_package.clear_context('c_user01', null,'u_k2'); select sys_context('c_user01', 'u_k2'); sys_context ------------- (1 行记录) select sys_context('c_user01', 'u_k3'); sys_context ------------- u_v3 (1 行记录)
-
清除上下文c_user01
call context_schema1.test_package.clear_all_context('c_user01'); select sys_context('c_user01', 'u_k3'); sys_context ------------- (1 行记录)
1.2. 手动加密数据¶
KingbaseES支持用户使用加密函数保护敏感数据,并提供了多种加密算法。
4.2.1. 加密算法¶
KingbaseES 提供了典型的加密算法,用户可以使用加密算法存储关键敏感数据。支持的加密算法参见下表:
算法 | 内建 | 使用 OpenSSL | 加密算法类型 |
---|---|---|---|
MD5 | yes | yes | 摘要 |
SHA1 | yes | yes | 摘要 |
SHA224/256/384/512 | yes (注意 a) | yes | 摘要 |
Blowfish | yes | yes (注意 c) | 对称 |
AES | yes | yes | 对称 |
DES/3DES/CAST5 | no | no | 对称 |
SM3 | yes | no | 摘要 |
SM4 | yes | yes | 对称 |
RC4 | yes | yes | 对称 |
注意
-
SHA2算法是在版本 0.9.8 时被加入到 OpenSSL 的。
-
OpenSSL 支持的任何摘要算法都是自动选取的。这对于使用密码来说是不可能的,因为需要被显式地支持。
-
AES从版本0.9.7 就开始被包括在 OpenSSL中。
加密算法使用示例:
SELECT encode(digest('abc', 'md5'), 'hex'); SELECT encode(digest('abc', 'sha1'), 'hex'); SELECT encode(digest('abc', 'sha224'), 'hex'); SELECT encode(digest('abc', 'sha384'), 'hex'); SELECT encode(digest('abc', 'sha512'), 'hex'); SELECT encode(encrypt('Lets try a longer message.', '0123456789', 'bf'), 'hex'); SELECT encode(encrypt('Lets try a longer message.', '0123456789', 'aes'), 'hex'); SELECT encode(encrypt('Lets try a longer message.', '01234567', 'des'), 'hex'); SELECT encode(encrypt('Lets try a longer message.', '0123456789012345678901', '3des'), 'hex'); SELECT encode(encrypt('Lets try a longer message.', '0123456789', 'cast5'), 'hex');
1.2.2. 加密函数说明¶
-
sm3()函数
参数为: 加密数据。
-
sm4()函数/rc4()函数
参数分别为: 加/解密数据、密钥、加密/解密标识。
-
sm4_ex()函数(rc4函数没有ex函数扩展)
参数分别为: 加/解密数据、密钥、加密/解密标识、填充模式。填充模式如下:
1)填充模式选1, 数据按16字节倍数强制填充,缺m个字节则填充m个字节的m值(m最大值为16)。
2)填充模式选0,数据按16字节倍数非强制填充0x0, 同sm4。
1.2.3. 加密函数使用示例¶
create extension kbcrypto; set bytea_output to escape; -- 1. sm3()函数 select sm3('123456abcdef'); -- 2. sm4()函数/rc4()函数 -- 加密: select sm4('123456abcdef','0123456789ABCDEF',0); select rc4('123456abcdef','0123456789ABCDEF',0); -- 解密 select sm4(sm4('123456abcdef','0123456789ABCDEF',0), '0123456789ABCDEF',1); select rc4(rc4('123456abcdef','0123456789ABCDEF',0), '0123456789ABCDEF',1); -- 3. sm4_ex()函数(rc4函数没有ex函数扩展) -- 1)填充模式选1 -- 加密: select sm4_ex('123456abcdef','0123456789ABCDEF',0,1); -- 解密 select sm4_ex(sm4_ex('123456abcdef','0123456789ABCDEF',0,1), '0123456789ABCDEF',1,1); -- 2) 填充模式选0 -- 加密 select sm4_ex('123456abcdef','0123456789ABCDEF',0,0); -- 解密 select sm4_ex(sm4_ex('123456abcdef','0123456789ABCDEF',0,0), '0123456789ABCDEF',1,0);