KingbaseES 函数与存储过程内容加密

说明:

数据库系统使用过程中,有些业务功能在特殊的安全级别情况下,需要对数据库中的函数和存储过程进行加密存储,以保证数据库函数和过程的代码安全性。KingbaseES 数据库,提供了DBMS_DDL扩展插件功能,帮助对数据库中的函数和存储过程进行加密存储。

ddms_ddl扩展介绍:

DBMS_DDL是KingbaseES的一个扩展插件,主要用于创建一个PL/SQL函数、过程。DBMS_DDL系统自带扩展,不需要单独创建。
DBMS_DDL拓展插件不支持PG模式。

ddms_ddl扩展:

DBMS_DDL拓展插件内容:

test=# \dx+ dbms_ddl 
  对象用于扩展 "dbms_ddl"
         对象描述          
---------------------------
 function wrapped(varchar)
 package dbms_ddl
(2 行记录)
DBMS_DDL.WRAP

只加密不执行语句。函数WRAP以CREATE [ OR REPLACE ]语句作为输入,指定创建PL/SQL函数、过程。并返回CREATE [ OR REPLACE ]后面语句的加密语句。

语法格式:

DBMS_DDL.WRAP(ddl VARCHAR2)RETURN VARCHAR2;

参数说明:

ddl:指定用于创建一个PL/SQL包体、函数、过程的CREATE [ OR REPLACE ]语句。

返回值:

返回32k字节以内已加密的字符串。

DBMS_DDL.CREATE_WRAPPED

加密并执行语句。

语法格式

DBMS_DDL.CREATE_WRAPPED(ddl VARCHAR2);

参数说明:

ddl:指定用于创建一个PL/SQL函数、过程的CREATE [ OR REPLACE ]语句。

ddms_ddl示例:

DBMS_DDL.WRAP加密函数体
test=# select dbms_ddl.wrap(
test(#  q'[
test'#  CREATE PROCEDURE getValue(pid int) AS
test'#  BEGIN
test'#      select now();
test'#  RAISE NOTICE 'pid=%',pid;
test'#  END ;
test'#  ]');
                             wrap
--------------------------------------------------------------
                                                             +
  CREATE PROCEDURE getValue(pid int) AS WRAPPED              +
 Ysyb9n+AUBSMPkhTULtxOjaiiiMoxXYtRVnTlW2f1dJa/DnOklEoLqQyyouJ+
 2oiVpC/nz/w26eThsPQr5juu3g==                                +
 END;
(1 row)
test=#  select dbms_ddl.wrap(
test(#  q'[
test'#  CREATE FUNCTION getName(pid int) RETURN VARCHAR2 AS
test'#  DECLARE
test'#      nam varchar(10);
test'#  BEGIN
test'#  SELECT 'return='|| to_char(pid) INTO nam FROM dual;
test'#  RETURN nam;
test'#  EXCEPTION
test'#      WHEN no_data_found THEN
test'#        RETURN 'NOFUOUND';
test'#      WHEN OTHERS THEN
test'#        RETURN 'OTHERS';
test'#  END ;
test'#  ]');
                             wrap                             
--------------------------------------------------------------
                                                             +
 CREATE FUNCTION getname(pid int) RETURN VARCHAR2 AS WRAPPED +
 jLdZaVH1HEkWXnhly2vcpWdyh1HhWuG91+ijKCp4cjvAE17MFcj9Meti/eJ9+
 P7Giz2aysfFssGzKIYFokBykv1teJ7WJ8/dcoUpWFMgcjJT1slOzvIETLAtJ+
 RgIhuXS7UcvJA+And0M7wAqPIcO+hGDVGtrobdjyWEsjj67x6/J/UArN8fy6+
 4Kno4qUsLY8Dw7W+BSbAa3Ton60ynUemm6EtjlhQuqucXQVJsFtL1A9LU4vN+
 3NlmM1eD0QLZbi7T166n7crOcK4iZcBm3bhVqJbJMrHlfO1y8s+mCGEUIZw=+
 END;
(1 行记录)

DBMS_DDL.CREATE_WRAPPED加密并执行函数体
test=# CALL dbms_ddl.CREATE_WRAPPED(
test(# q'[
test'# CREATE PROCEDURE getValue(pid int) AS 
test'# BEGIN 
test'#     select now();
test'# RAISE NOTICE 'pid=%',pid;
test'# END ;
test'# ]');
CALL
test=# \sf getValue
CREATE OR REPLACE PROCEDURE public.getvalue(pid integer)
AS WRAPPED
w5K/gWuBfiREAZ+LBYFLtu01ayNoHgqoSDf9ZtsG+KuFntIAS2i7Zji6CygE
HViaQ1VF6XfYrvHde1cmY2zxqw==
END
test=# CALL dbms_ddl.CREATE_WRAPPED(
test(# q'[
test'# CREATE FUNCTION getName(pid int) RETURN VARCHAR2 AS 
test'# DECLARE 
test'#     nam varchar(10);
test'# BEGIN 
test'# SELECT 'return='|| to_char(pid) INTO nam FROM dual;
test'# RETURN nam;
test'# EXCEPTION
test'#     WHEN no_data_found THEN
test'#       RETURN 'NOFUOUND';
test'#     WHEN OTHERS THEN
test'#       RETURN 'OTHERS';
test'# END ;
test'# ]');
CALL
test=# \sf getName
CREATE OR REPLACE FUNCTION public.getname(pid integer)
 RETURNS varchar
AS WRAPPED
jLdZaVH1HEkWXnhly2vcpWdyh1HhWuG91+ijKCp4cjvAE17MFcj9Meti/eJ9
P7Giz2aysfFssGzKIYFokBykv1teJ7WJ8/dcoUpWFMgcjJT1slOzvIETLAtJ
RgIhuXS7UcvJA+And0M7wAqPIcO+hGDVGtrobdjyWEsjj67x6/J/UArN8fy6
4Kno4qUsLY8Dw7W+BSbAa3Ton60ynUemm6EtjlhQuqucXQVJsFtL1A9LU4vN
3NlmM1eD0QLZbi7T166n7crOcK4iZcBm3bhVqJbJMrHlfO1y8s+mCGEUIZw=
END

加密函数调用

test=# call getValue(110);
注意:  pid=110
              now              
-------------------------------
 2022-12-10 14:53:03.645849+08
(1 行记录)

CALL
test=# select getName(120);
  getname   
------------
 return=120
(1 行记录)
posted @ 2023-03-02 15:51  KINGBASE研究院  阅读(184)  评论(0编辑  收藏  举报