Oracle PL/SQL Triple DES (DES3) 加密與解密

Oracle PL/SQL 對於資料的加解密, 提供多種方式, 以下介紹 Triple DES (DES3) 加解密 :

 DES3 加密
DBMS_OBFUSCATION_TOOLKIT.DES3Encrypt( input => '要加密的資料'
                                    , key => '加密金鑰'
                                    );

參數,
input: 長度要是 8 的倍數,若不足 8 的倍數,則用空白補足.
key: 長度最少要 16 碼以上; 不同的 Key,加密結果將會不同.

傳回值型態: raw

傳回值型態若要 varchar2, 則再用 utl_raw.cast_to_varchar2 轉換成字串.

其中, input、key、傳回值均為 raw 的 16 進位字串型態,
所以, input、key 字串可利用 utl_raw.cast_to_raw 來轉換為 16 進位資料.

 DES3 解密
DBMS_OBFUSCATION_TOOLKIT.DES3Decrypt( input => '要解密的資料' 
                                    , key => '解密金鑰'
                                    );

參數,
input: 用 DesEncrypt 加密的資料.
key: 長度最少要 16 碼以上; 不同的 Key,解密結果將會不同.

傳回值型態: raw

傳回值型態若要 varchar2, 則再用 utl_raw.cast_to_varchar2 轉換成字串.

其中, input、key、傳回值均為 raw 的 16 進位字串型態,
所以, input、key 字串可利用 utl_raw.cast_to_raw 來轉換為 16 進位資料.

 範例
declare
  v_data    varchar2(100) := 'TOMKUO  ';           -- 資料為 8 的倍數, 不足用空白補足
  v_key     varchar2(100) := 'abcdefgh        ';   -- 資料最好要 16 個以上
  v_encrypt varchar2(250);
  v_decrypt varchar2(250);
begin
  -- 加密
  v_encrypt := dbms_obfuscation_toolkit.DES3Encrypt( input => utl_raw.cast_to_raw(v_data) -- 需轉換成 16 進位
                                                   , key => utl_raw.cast_to_raw(v_key)    -- 需轉換成 16 進位
                                                   );
  
  dbms_output.put_line( v_data || ' 用 Key: ' || v_key || ' 加密, 結果 : ' || v_encrypt );
  
  
  -- 用相同 Key 解密
  v_decrypt := dbms_obfuscation_toolkit.DES3Decrypt( input => v_encrypt
                                                   , key => utl_raw.cast_to_raw(v_key)
                                                   );
  
  dbms_output.put_line( v_encrypt || ' 用 Key: ' || v_key || ' 解密, 結果 : ' || utl_raw.cast_to_varchar2(v_decrypt) );
  
  -- 用不同 Key 解密
  v_decrypt := dbms_obfuscation_toolkit.DESDecrypt( input => v_encrypt
                                                  , key => utl_raw.cast_to_raw('12345678        ')
                                                  );
  
  dbms_output.put_line( v_encrypt || ' 用 Key: ' || '12345678        ' || ' 解密, 結果 : ' || utl_raw.cast_to_varchar2(v_decrypt) );
end;

/*
輸出結果 :
TOMKUO   用 Key: abcdefgh         加密, 結果 : 7C85C3FAA88A4EC1
7C85C3FAA88A4EC1 用 Key: abcdefgh         解密, 結果 : TOMKUO  
7C85C3FAA88A4EC1 用 Key: 12345678         解密, 結果 : �� 4, �/
*/


天聖經:神的心不僅在神的聖言當中,也在神所創造的萬物之中,天涯海角每一處都有神的心
Related Posts Plugin for WordPress, Blogger...