티스토리 뷰

반응형

CREATE OR REPLACE PACKAGE ENCUTIL


  IS
/*******************************************************************************
PURPOSE  : 평문 문자열을 암호화(Encryption)하는 Function
특기사항 : Oracle 에서 제공하는 AES128 암호화 알고리즘 Package 사용
/******************************************************************************/
    FUNCTION f_ENC
    (
        p_str     VARCHAR2,        -- 평문 입력 문자열
        p_enc_key_str           VARCHAR2         -- 암호화 키
    )
    RETURN RAW;


/*******************************************************************************
PURPOSE  : 암호화된 문자열을 평문으로 복호화(Decryption)하는 Function
특기사항 : Oracle 에서 제공하는 AES128 암호화 알고리즘 Package 사용
/******************************************************************************/
    FUNCTION f_DEC
    (
        p_str     VARCHAR2,        -- 암호화된 입력 문자열
        p_dec_key_str           VARCHAR2         -- 복호화 키
    )
    RETURN VARCHAR2;

/*******************************************************************************
PURPOSE  : 특정DB에서만 암복호화가 이루어지도록 제한
특기사항 : Oracle DBID사용
/******************************************************************************/
    PROCEDURE dCheck;

    FUNCTION TestP
    RETURN VARCHAR2;


END; -- Package spec
/

 

CREATE OR REPLACE PACKAGE BODY ENCUTIL


IS
  iFlag PLS_INTEGER := 0;
/*******************************************************************************
PURPOSE  : 평문 문자열을 암호화(Encryption)하는 Function
특기사항 : Oracle 에서 제공하는 AES128 암호화 알고리즘 Package 사용
/******************************************************************************/
  FUNCTION f_ENC
  (
    p_str       VARCHAR2,        -- 평문 입력 문자열
    p_enc_key_str   VARCHAR2         -- 암호화 키
  )
  RETURN RAW
  IS
   l_type NUMBER := dbms_crypto.ENCRYPT_AES128
    + dbms_crypto.CHAIN_CBC
    + dbms_crypto.PAD_PKCS5;
   l_retval RAW ( 2000 ) ;
   rPrivate_key RAW( 128 );
  BEGIN
 
    IF p_str IS NULL THEN -- NULL은 NULL로 리턴한다.
     RETURN NULL;
    END IF;
   
    IF iFlag = 0 THEN -- DBID를 비교하지 않았으면 먼저 비교한다.
     dCheck;
    END IF;
    IF iFlag = 0 THEN -- DBID가 맞지 않으면 ''를 리턴한다.
     RETURN '';
    END IF;
   
    rPrivate_key := dbms_crypto.hash( p_enc_key_str , 2 ); --128bit로 맞추기 위해
    l_retval := dbms_crypto.encrypt (
      utl_i18n.string_to_RAW ( p_str, 'AL32UTF8' ), l_type, rPrivate_key
     );
    RETURN l_retval;
   
  END f_ENC;
 
/*******************************************************************************
PURPOSE  : 암호화된 문자열을 평문으로 복호화(Decryption)하는 Function
특기사항 : Oracle 에서 제공하는 AES128 암호화 알고리즘 Package 사용
/******************************************************************************/
  FUNCTION f_DEC
  (
 p_str       VARCHAR2,        -- 암호화된 입력 문자열
    p_dec_key_str   VARCHAR2         -- 복호화 키
  )
  RETURN VARCHAR2
  is
   l_decrypt RAW ( 2000 ) ;
   l_type NUMBER := dbms_crypto.ENCRYPT_AES128
    + dbms_crypto.CHAIN_CBC
    + dbms_crypto.PAD_PKCS5;
   rPrivate_key RAW( 128 );
  BEGIN
 
    IF p_str IS NULL THEN -- NULL은 NULL로 리턴한다.
     RETURN NULL;
    END IF;
   
    IF iFlag = 0 THEN -- DBID를 비교하지 않았으면 먼저 비교한다.
     dCheck;
    END IF;
    IF iFlag = 0 THEN -- DBID가 맞지 않으면 ''를 리턴한다.
     RETURN '';
    END IF;
   
    rPrivate_key := dbms_crypto.hash( p_dec_key_str , 2 ); --128bit로 맞추기 위해
    l_decrypt := dbms_crypto.decrypt ( p_str, l_type, rPrivate_key ) ;
                     
    RETURN ( utl_i18n.RAW_to_char ( l_decrypt ) ) ;
   
  END f_DEC;


 
/*******************************************************************************
PURPOSE  : 특정DB에서만 암복호화가 이루어지도록 제한
특기사항 : Oracle DBID사용
/******************************************************************************/
PROCEDURE dCheck AS
  rHash RAW ( 128 ) := '32F5677ED22C730D884D99F615CBB4CE'; --DBID hash
   nDBID   NUMBER;
  BEGIN
  
    SELECT  dbid
    INTO    nDBID
   FROM    v$database;
   IF sys.dbms_crypto.hash( utl_raw.cast_from_number(nDBID),2) = rHash THEN --저장된 DBID hash와 현재 얻은 DBID hash를 비교
    iFlag := 1;
   ELSE
    iFlag := 0;
   END IF;
  END;
                 
  FUNCTION TestP
   RETURN VARCHAR2
  IS
   l_var VARCHAR2(4000);
  BEGIN

  l_var := f_ENC('PORTAL','2DAE49B9205DC3E7');
 
  RETURN f_DEC(l_var,'2DAE49B9205DC3E7');
  EXCEPTION
   WHEN OTHERS THEN
    htp.p(SQLERRM);
  END TestP;
 
END ENCUTIL;
/

 

 


 

반응형
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함