授权
1 2 3 4 5 6 7 8 9 10
| su - oracle2
sqlplus / as sysdba
alter session set container = HR92DEV;
grant execute on sys.dbms_crypto to SYSADM;
grant execute on sys.utl_i18n to SYSADM;
|
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
| SELECT utl_raw.cast_to_varchar2(utl_encode.base64_encode(FUN_ENCRYPTION128C('200','aaBB:BaseDC.6%=='))) FROM DUAL;
SELECT FUN_DECRYPTION128C(utl_encode.base64_decode(utl_raw.cast_to_raw('98Zh1TyZU3HxT7XFZ6WfhA==')), 'aaBB:BaseDC.6%==') FROM DUAL;
|
注意
两个函数之间的 ”/“ 不能少,否则只能创建第一个函数。AES的key必须是16位
Oracle官方文档关于oracle中加密的函数包说明:Oracle加密官方文档
如果需要更换为其他的加密模式,根据官方提供的几种选择更改加密规则即可。