【PB续命04】借用Oracle的加密解密续命

【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;
相关推荐
fredinators9 小时前
数据库flask访问
数据库·oracle·flask
向葭奔赴♡9 小时前
Spring Boot 分模块:从数据库到前端接口
数据库·spring boot·后端
JosieBook10 小时前
【数据库】时序数据库选型指南:在大数据与工业4.0时代,为何 Apache IoTDB 成为智慧之选?
大数据·数据库·时序数据库
程序员三明治10 小时前
详解Redis锁误删、原子性难题及Redisson加锁底层原理、WatchDog续约机制
java·数据库·redis·分布式锁·redisson·watchdog·看门狗
chenzhou__10 小时前
MYSQL学习笔记(个人)(第十五天)
linux·数据库·笔记·学习·mysql
一只自律的鸡11 小时前
【MySQL】第二章 基本的SELECT语句
数据库·mysql
liliangcsdn12 小时前
如何使用python创建和维护sqlite3数据库
数据库·sqlite
TDengine (老段)18 小时前
TDengine 数学函数 DEGRESS 用户手册
大数据·数据库·sql·物联网·时序数据库·iot·tdengine
TDengine (老段)18 小时前
TDengine 数学函数 GREATEST 用户手册
大数据·数据库·物联网·时序数据库·iot·tdengine·涛思数据
安当加密19 小时前
云原生时代的数据库字段加密:在微服务与 Kubernetes 中实现合规与敏捷的统一
数据库·微服务·云原生