Oracle-数据库加解密函数(AES加解密示例)

授权

1
2
3
4
5
6
7
8
9
10
su - oracle2 --切换用户oracle2 

sqlplus / as sysdba --无用户/口令登陆数据库(以sysdba用户)

alter session set container = HR92DEV; --oracle12c的新特性, 把会话设置到hr92dev这个库。默认是cdb容器

grant execute on sys.dbms_crypto to SYSADM; -- 给SYSADM用户授权 sys.dbms_crypto 系统标准加密包

grant execute on sys.utl_i18n to SYSADM; --给SYSADM用户授权 sys.utl_i18n 系统标准加密包

Pl/Sql Developer开发工具创建加密函数

直接在工具中新建SQL窗口,然后粘贴一下以下代码,F8运行,不报错表示创建成功;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
-- 加密函数
CREATE OR REPLACE FUNCTION FUN_ENCRYPTION128C(
V_STR VARCHAR2 ,
V_KEY VARCHAR2
)
RETURN VARCHAR2
AS
V_KEY_RAW RAW(24) ;
V_STR_RAW RAW(2000) ;
V_RETURN_STR VARCHAR2(2000) ;
V_TYPE PLS_INTEGER ;
BEGIN
V_KEY_RAW := UTL_I18N.STRING_TO_RAW(V_KEY,'UTF8') ;
V_STR_RAW := UTL_I18N.STRING_TO_RAW(V_STR,'UTF8') ;
V_TYPE := DBMS_CRYPTO.ENCRYPT_AES128 + DBMS_CRYPTO.CHAIN_ECB + DBMS_CRYPTO.PAD_PKCS5 ;
V_STR_RAW := DBMS_CRYPTO.ENCRYPT(SRC => V_STR_RAW , typ => V_TYPE, key => V_KEY_RAW) ;
V_RETURN_STR := RAWTOHEX(V_STR_RAW);
RETURN V_RETURN_STR ;
END;
/

-- 解密函数
CREATE OR REPLACE FUNCTION FUN_DECRYPTION128C(
V_STR VARCHAR2 ,
V_KEY VARCHAR2
)
RETURN VARCHAR2
AS
V_KEY_RAW RAW(24) ;
V_STR_RAW RAW(2000) ;
V_RETURN_STR VARCHAR2(2000) ;
V_TYPE PLS_INTEGER ;
BEGIN
V_KEY_RAW := UTL_I18N.STRING_TO_RAW(V_KEY,'UTF8') ;
V_STR_RAW := HEXTORAW(V_STR);
V_TYPE := DBMS_CRYPTO.ENCRYPT_AES128 + DBMS_CRYPTO.CHAIN_ECB + DBMS_CRYPTO.PAD_PKCS5 ;
V_STR_RAW := DBMS_CRYPTO.DECRYPT(SRC => V_STR_RAW , typ => V_TYPE, key => V_KEY_RAW ) ;
V_RETURN_STR := UTL_I18N.RAW_TO_CHAR(V_STR_RAW,'UTF8');
RETURN V_RETURN_STR ;
END;
/

函数使用

1
2
3
4
5
6
7
8
9
10
-- 加密后进行base64转码
SELECT utl_raw.cast_to_varchar2(utl_encode.base64_encode(FUN_ENCRYPTION128C('200','aaBB:BaseDC.6%==')))
FROM DUAL;
--加密结果: 98Zh1TyZU3HxT7XFZ6WfhA==

--base64转码后解密
SELECT FUN_DECRYPTION128C(utl_encode.base64_decode(utl_raw.cast_to_raw('98Zh1TyZU3HxT7XFZ6WfhA==')),
'aaBB:BaseDC.6%==')
FROM DUAL;
--解密结果 200

注意

两个函数之间的 ”/“ 不能少,否则只能创建第一个函数。AES的key必须是16位

Oracle官方文档关于oracle中加密的函数包说明:Oracle加密官方文档

如果需要更换为其他的加密模式,根据官方提供的几种选择更改加密规则即可。