【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;
相关推荐
瓜牛_gn35 分钟前
mysql特性
数据库·mysql
奶糖趣多多2 小时前
Redis知识点
数据库·redis·缓存
CoderIsArt3 小时前
Redis的三种模式:主从模式,哨兵与集群模式
数据库·redis·缓存
师太,答应老衲吧5 小时前
SQL实战训练之,力扣:2020. 无流量的帐户数(递归)
数据库·sql·leetcode
Channing Lewis6 小时前
salesforce case可以新建一个roll up 字段,统计出这个case下的email数量吗
数据库·salesforce
毕业设计制作和分享7 小时前
ssm《数据库系统原理》课程平台的设计与实现+vue
前端·数据库·vue.js·oracle·mybatis
ketil277 小时前
Redis - String 字符串
数据库·redis·缓存
Hsu_kk8 小时前
MySQL 批量删除海量数据的几种方法
数据库·mysql
编程学无止境8 小时前
第02章 MySQL环境搭建
数据库·mysql
knight-n8 小时前
MYSQL库的操作
数据库·mysql