【PB续命02】感觉比较乱,整理一下,封装一个Oracle的包,把加密和解密放在一起,包名为BLM_CRYPTO
1 包头
create or replace package blm_crypto is
/*
-- Author : GROMS
-- Created : 2023-10-20 17:24:25
-- Purpose : 加密与解密工具包
-- Public type declarations
type <TypeName> is <Datatype>;
-- Public constant declarations
<ConstantName> constant <Datatype> := <Value>;
-- Public variable declarations
<VariableName> <Datatype>;
-- Public function and procedure declarations
function <FunctionName>(<Parameter> <Datatype>) return <Datatype>;
*/
--MD5加密 ==============================================================================
function md5(plaintext varchar2 ) return varchar2;
/*MD5()应用示例
select blm_crypto.md5('5217') from dual
--加密后结果:5A7B238BA0F6502E5D6BE14424B20DED
*/
--Aes+Base64 加密 ======================================================================
FUNCTION EnAes64(as_ysj IN VARCHAR2,as_key In Varchar2) RETURN VARCHAR2;
--Aes+Base64 解密
FUNCTION DeAes64(as_ysj IN VARCHAR2, as_key IN VARCHAR2) RETURN VARCHAR2;
/*Aes应用示例,密钥只能是16位
select blm_crypto.enaes64('白龙马5217','blma5217blma5217') from dual;
--加密后的结果:mV4aaEnbaEllRvpH5WSiyw==
select blm_crypto.deaes64('mV4aaEnbaEllRvpH5WSiyw==','blma5217blma5217') from dual;
--解密后的结果:白龙马5217
*/
--Aes192加密 ============================================================================
FUNCTION ENAES192( V_STR VARCHAR2 , V_KEY VARCHAR2) RETURN VARCHAR2;
--Aes192解密
FUNCTION DEAES192(V_STR VARCHAR2 , V_KEY VARCHAR2) RETURN VARCHAR2;
/*Aes192应用示例,密钥只能是24位
select blm_crypto.enaes192('白龙马5217','blma5217blma5217blma5217') from dual;
--加密后的结果:347F4960FA347FE45F91B97B72114F76
select blm_crypto.deaes192('347F4960FA347FE45F91B97B72114F76','blma5217blma5217blma5217') from dual;
--解密后的结果:白龙马5217
*/
--DES加密字符串 ==========================================================================
function ENDES_STRING(input8x in varchar2,key8x in varchar2) return varchar2;
--DES解密字符串
function DEDES_STRING(encrypted_str in varchar2,key8x in varchar2) return varchar2 ;
/*DES应用示例,加密/解密字符串 ,DES加解密算法的明文和密钥长度必须为8的倍数
select blm_crypto.endes_string('BLMa5217','blma5217') from dual;
--加密后的结果:D8BB696289F6177F
select blm_crypto.dedes_string('D8BB696289F6177F','blma5217') from dual;
--解密后的结果:BLMa5217
*/
--DES加密RAW,RAW 是一种可变长度的数据类型,在不同平台上传输时,传送的都是二进制信息,即使字符集不同也不需要转换。
function ENDES_RAW(input8x in varchar2,key8x in varchar2) return varchar2 ;
--DES解密RAW
function DEDES_RAW(encrypted_raw in varchar2,key8x in varchar2) return varchar2 ;
/*DES应用示例,加密/解密RAW ,DES加解密算法的明文和密钥长度必须为8的倍数
select blm_crypto.endes_raw('BLMa5217','blma5217') from dual;
--加密后的结果:D8BB696289F6177F
select blm_crypto.dedes_raw('D8BB696289F6177F','blma5217') from dual;
--解密后的结果:BLMa5217
*/
end blm_crypto;
2 包体
create or replace package body blm_crypto is
/*
-- Private type declarations
type <TypeName> is <Datatype>;
-- Private constant declarations
<ConstantName> constant <Datatype> := <Value>;
-- Private variable declarations
<VariableName> <Datatype>;
-- Function and procedure implementations
function <FunctionName>(<Parameter> <Datatype>) return <Datatype> is
<LocalVariable> <Datatype>;
begin
<Statement>;
return(<Result>);
end;
*/
--MD5加密函数
function md5(plaintext varchar2 ) return varchar2
as --md5加密函数
begin
return utl_raw.cast_to_raw(DBMS_OBFUSCATION_TOOLKIT.MD5(INPUT_STRING => plaintext)) ;
end;
--Aes+Base64 加密
FUNCTION EnAes64(as_ysj IN VARCHAR2,as_key In Varchar2) RETURN VARCHAR2
IS
encrypted_raw RAW (2000); -- 储存加密后的字节
key_bytes_raw RAW (16); -- 储存秘钥 128比特 (16位)
-- 我这里的Aes加解密方式为: AES/ECB/PKCS5Padding , 自己可自由组合,如:AES/ECB/PKCS5Padding等等
encryption_type PLS_INTEGER := DBMS_CRYPTO.ENCRYPT_AES + DBMS_CRYPTO.CHAIN_ECB + DBMS_CRYPTO.PAD_PKCS5 ;
iv_raw RAW (16); -- 向量
BEGIN
-- 秘钥
key_bytes_raw := UTL_I18N.STRING_TO_RAW(as_key,'AL32UTF8'); -- DBMS_CRYPTO.RANDOMBYTES (num_key_bytes);
-- 向量
iv_raw := UTL_I18N.STRING_TO_RAW('9iuj87y2hbi5wxl1','AL32UTF8'); -- DBMS_CRYPTO.RANDOMBYTES (16);
-- 加密过程
encrypted_raw := DBMS_CRYPTO.ENCRYPT
(
src => UTL_I18N.STRING_TO_RAW (as_ysj, 'AL32UTF8'),
typ => encryption_type,
key => key_bytes_raw,
iv => iv_raw
);
-- Bas64加密,如果只要aes,不需要base64,则此步注释跳过即可
encrypted_raw := utl_encode.base64_encode(r => encrypted_raw);
return UTL_I18N.RAW_TO_CHAR (encrypted_raw, 'AL32UTF8');
END;
--Aes+Base64 解密
FUNCTION DeAes64(as_ysj IN VARCHAR2, as_key IN VARCHAR2) RETURN VARCHAR2
IS
decrypted_raw RAW (2000); -- 储存解密后的字节
key_bytes_raw RAW (16); -- 储存秘钥 128比特 (16位)
-- 我这里的Aes加解密方式为: AES/ECB/PKCS5Padding , 自己可自由组合,如:AES/ECB/PKCS5Padding等等
encryption_type PLS_INTEGER := DBMS_CRYPTO.ENCRYPT_AES + DBMS_CRYPTO.CHAIN_ECB + DBMS_CRYPTO.PAD_PKCS5 ;
iv_raw RAW (16); -- 向量
temp varchar2(1000); -- 临时,AES加密并Base64后的结果
BEGIN
-- 秘钥
key_bytes_raw := UTL_I18N.STRING_TO_RAW( as_key,'AL32UTF8'); -- DBMS_CRYPTO.RANDOMBYTES (num_key_bytes);
-- 向量
iv_raw := UTL_I18N.STRING_TO_RAW('9iuj87y2hbi5wxl1','AL32UTF8'); -- DBMS_CRYPTO.RANDOMBYTES (16);
-- 将加密后字符串转为row
decrypted_raw := utl_raw.cast_to_raw(c => as_ysj);
-- Base64解密, 如果源字符串仅aes加密,没有base64编码,则此步注释跳过即可
decrypted_raw := utl_encode.base64_decode(r => decrypted_raw);
-- Aes解密
decrypted_raw := DBMS_CRYPTO.DECRYPT
(
src => decrypted_raw,
typ => encryption_type,
key => key_bytes_raw,
iv => iv_raw
);
temp := UTL_I18N.RAW_TO_CHAR (decrypted_raw, 'AL32UTF8');
RETURN temp;
END;
--Aes192加密,密钥为24位
FUNCTION ENAES192( 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_AES192+DBMS_CRYPTO.CHAIN_CBC+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;
--Aes192解密,密钥为24位
FUNCTION DEAES192(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_AES192+DBMS_CRYPTO.CHAIN_CBC+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;
--DES加密字符串
function ENDES_STRING(input8x in varchar2,key8x in varchar2) return varchar2
is
RetuenResult varchar2(4000);
encrypted_str VARCHAR2(4000);
begin
--input_string 和 key_string 的长度必须是8的倍数
dbms_obfuscation_toolkit.desencrypt(input_string => input8x, key_string => key8x, encrypted_string => encrypted_str);
RetuenResult := utl_raw.cast_to_raw(encrypted_str);
return(RetuenResult);
end;
--DES解密字符串
function DEDES_STRING(encrypted_str in varchar2,key8x in varchar2) return varchar2
is
-- encrypted_str为FN_ENDES_STRING()的返回值
-- key_string 的长度必须是8的倍数
RetuenResult varchar2(4000);
decrypted_str VARCHAR2(4000);
begin
dbms_obfuscation_toolkit.desdecrypt(
input_string => utl_raw.cast_to_varchar2(encrypted_str),
key_string => key8x,
decrypted_string => decrypted_str);
RetuenResult := decrypted_str;
return(RetuenResult);
end;
--DES加密RAW,
function ENDES_RAW(input8x in varchar2,key8x in varchar2) return varchar2
is
--input8x 和 key8x 的长度必须是8的倍数
RetuenResult varchar2(4000);
encrypted_raw RAW(4000);
begin
dbms_obfuscation_toolkit.desencrypt
(input => utl_raw.cast_to_raw(input8x),
key => utl_raw.cast_to_raw(key8x),
encrypted_data => encrypted_raw);
RetuenResult := rawtohex(encrypted_raw);
return(RetuenResult);
end ;
--DES解密RAW
function DEDES_RAW(encrypted_raw in varchar2,key8x in varchar2) return varchar2
is
-- encrypted_raw 为FN_ENDES_RAW()的返回值
-- key8x 的长度必须是8的倍数
RetuenResult varchar2(4000);
decrypted_raw RAW(4000);
begin
dbms_obfuscation_toolkit.desdecrypt
(input => encrypted_raw,
key => utl_raw.cast_to_raw(key8x),
decrypted_data => decrypted_raw);
RetuenResult := utl_raw.cast_to_varchar2(decrypted_raw);
return(RetuenResult);
end ;
end blm_crypto;