2016/06/03

Oracle Database DES 加密與解密

Oracle DB 對於資料的加解密, 提供多種方式, 以下介紹 DES 加解密 :

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

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

傳回值型態: raw

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

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

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

參數,
input: 用 DesEncrypt 加密的資料.
key: 長度最少要 8 碼以上; 不同的 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';   -- 資料最好要 8 個以上
  v_encrypt varchar2(250);
  v_decrypt varchar2(250);
begin
  -- 加密
  v_encrypt := dbms_obfuscation_toolkit.DESEncrypt( 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.DESDecrypt( 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 加密, 結果 : 4227EC5A884A5AD3
4227EC5A884A5AD3 用 Key: abcdefgh 解密, 結果 : TOMKUO  
4227EC5A884A5AD3 用 Key: 12345678 解密, 結果 : .�t�M
*/