• 金仓数据库KingbaseES安全指南--4 数据访问保护


    4.1. 管理上下文

    4.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;
    

    4.1.2. 上下文的使用

    在KingbaseES中,通过使用dbms_session系统包中的过程来管理上下文。在使用 dbms_session 之前,需要将他添加到 kingbase.conf 文件的 shared_preload_libraries 中,并重启 KingbaseES 数据库:

    shared_preload_libraries = 'dbms_session'
    

    DBMS_SESSION系统包包含的子程序及简介如下表所示:

    表 4.1.3 DBMS_SESSION系统包的子程序

    过程名

    功能

    CLEAR_ALL_CONTEXT 过程

    清理当前会话的指定namespace的所有上下文。

    CLEAR_CONTEXT 过程

    清除namespace中的attribute值。

    LIST_CONTEXT 过程

    返回当前会话所有上下文属性和值。

    SET_CONTEXT 过程

    设置上下文 namespace的属性和值。

    下面通过一个示例演示上下文的使用:

    首先,添加扩展包
    
    create extension dbms_session;
    
    第一步 创建 package:
    CREATE or replace package test_pk as
            procedure set_context(ts_name varchar, key varchar, value varchar);
            procedure set_user_context(ts_name varchar, key varchar, value varchar, username varchar, client_id varchar);
            procedure clear_context(ts_name varchar, client_identifier varchar, key varchar);
            procedure clear_all_context(ts_name varchar);
    end test_pk;
    /
    CREATE or replace package body test_pk as
            procedure set_context(ts_name varchar, key varchar, value varchar) as
                    begin
                            dbms_session.set_context(ts_name, key, value);
                    end;
            procedure set_user_context(ts_name varchar, key varchar, value varchar, username varchar, client_id varchar) as
                    begin
                            dbms_session.set_context(ts_name, key, value, username, client_id);
                    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_pk;
    /
    
    第二步 创建 context
    create or replace context c_user01 using test_pk;
    
    第三步 设置 namespace 的key-value
    call test_pk.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 test_pk.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 test_pk.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 test_pk.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 test_pk.clear_all_context('c_user01');
    select sys_context('c_user01', 'u_k3');
    sys_context
    -------------
    
    (1 行记录)
    

    4.2. 手动加密数据

    KingbaseES支持用户使用加密函数保护敏感数据,并提供了多种加密算法。

    4.2.1. 加密算法

    KingbaseES 提供了典型的加密算法,用户可以使用加密算法存储关键敏感数据。支持的加密算法参见下表。

    表 4.2.11 加密算法

    算法

    内建

    使用 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

    对称

    加密算法使用示例:

    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');
    

    4.2.2. 函数说明

    1. sm3()函数

    参数为: 加密数据。

    1. sm4()函数/rc4()函数

    参数分别为: 加/解密数据; 密钥; 加密/解密标识。

    1. sm4_ex()函数(rc4函数没有ex函数扩展)

    参数分别为: 加/解密数据; 密钥; 加密/解密标识; 填充模式。

    1)填充模式选1, 数据按16字节倍数强制填充,缺m个字节则填充m个字节的m值(m最大值为16)。

    2)填充模式选0,数据按16字节倍数非强制填充0x0, 同sm4。

    4.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);
  • 相关阅读:
    从零开始—仿牛客网讨论社区项目(一)
    Centos安装RabbitMQ,JavaSpring发送RabbitMQ延迟延时消息,JavaSpring消费RabbitMQ消息
    Python上下文管理和with
    QT学习笔记-QT访问各种关系数据库笔记汇总
    C语言操作符详解
    proteus中仿真arduino的水位测试传感器
    vuex学习记录
    Nx C++程序使用spdlog库进行日志存储
    Compose实战-实现一个带下拉加载更多功能的LazyColumn
    python实现假设检验-t检验
  • 原文地址:https://blog.csdn.net/arthemis_14/article/details/126020964