Oracle 암/복호화 (DBMS_CRYPTO) 스크립트


GRANT EXECUTE ON DBMS_OBFUSCATION_TOOLKIT TO system;

 

GRANT EXECUTE ON DBMS_CRYPTO TO system;


create or replace function TYS_Encrypt (input_string VARCHAR2) RETURN RAW

IS

   -- select DBMS_CRYPTO.RANDOMBYTES (num_key_bytes) from dual; --> key_bytes_raw

   encrypted_raw      RAW (2000);             -- stores encrypted binary text

   key_bytes_raw      RAW (32) := HEXTORAW('6E266456572A3E4C79D677BAC5144A645DF911CE07F18AEFF57C3E8560AE1672');  --암호화 키

   encryption_type    PLS_INTEGER := DBMS_CRYPTO.ENCRYPT_AES256 + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_PKCS5;  --암호화 알고리즘

BEGIN

     encrypted_raw := DBMS_CRYPTO.ENCRYPT

      (src => UTL_I18N.STRING_TO_RAW (input_string,  'AL32UTF8'),

       typ => encryption_type,

       key => key_bytes_raw);


   return encrypted_raw;

   

END;

/


[PACKAGE]


CREATE OR REPLACE PACKAGE SCOTT.CRYPTO_AES256

IS

 

/******************************************************************************

  암호화

 ******************************************************************************/

 FUNCTION ENC_AES ( input_string IN VARCHAR2

 ) RETURN VARCHAR2;

 

 

/******************************************************************************

  복호화

 ******************************************************************************/

 FUNCTION DEC_AES (  encrypted_raw IN VARCHAR2

 ) RETURN VARCHAR2;                       

 

END CRYPTO_AES256;

/


CREATE OR REPLACE PACKAGE BODY SCOTT.CRYPTO_AES256

IS

 

/******************************************************************************

  암호화

 ******************************************************************************/

 FUNCTION ENC_AES ( input_string IN VARCHAR2

 ) RETURN VARCHAR2

 IS

   

   encrypted_raw      RAW (2000);             -- 암호화된 RAW타입 데이터

   key_bytes_raw      RAW (32);               -- 암호화 KEY (32RAW => 32Byte => 256bit)

   encryption_type    PLS_INTEGER :=          -- 암호화 알고리즘 선언

                            DBMS_CRYPTO.ENCRYPT_AES256

                          + DBMS_CRYPTO.CHAIN_CBC

                          + DBMS_CRYPTO.PAD_PKCS5;

    BEGIN

      

        key_bytes_raw := UTL_I18N.STRING_TO_RAW('12345678901234567890123456789012', 'AL32UTF8');

        encrypted_raw := DBMS_CRYPTO.ENCRYPT

            (

                src => UTL_I18N.STRING_TO_RAW (input_string,  'AL32UTF8'),

                typ => encryption_type,

                key => key_bytes_raw

            );

      

        -- 에러 방지를 위해 base64_encode로 인코딩 처리..

        -- ORA-06502: PL/SQL: numeric or value error: hex to raw conversion error

        RETURN UTL_RAW.CAST_TO_VARCHAR2(UTL_ENCODE.BASE64_ENCODE(encrypted_raw));

       

    END ENC_AES;

 

 

/******************************************************************************

  복호화

 ******************************************************************************/

 FUNCTION DEC_AES (  encrypted_raw IN VARCHAR2

 ) RETURN VARCHAR2

IS

 

   output_string      VARCHAR2 (200);         -- 복호화된 문자열

   decrypted_raw      RAW (2000);             -- 복호화된 raw타입 데이터

   key_bytes_raw      RAW (32);               -- 256bit 암호화 key

   encryption_type    PLS_INTEGER :=          -- 복호화 알고리즘 선언

                            DBMS_CRYPTO.ENCRYPT_AES256

                          + DBMS_CRYPTO.CHAIN_CBC

                          + DBMS_CRYPTO.PAD_PKCS5;

    BEGIN

   

        key_bytes_raw := UTL_I18N.STRING_TO_RAW('12345678901234567890123456789012', 'AL32UTF8');

        decrypted_raw := DBMS_CRYPTO.DECRYPT

            (

                -- 에러 방지를 위해 base64_decode로 인코딩 처리..

                -- ORA-06502: PL/SQL: numeric or value error: hex to raw conversion error

                src => UTL_ENCODE.BASE64_DECODE(UTL_RAW.CAST_TO_RAW(encrypted_raw)),

                typ => encryption_type,

                key => key_bytes_raw

            );

       output_string := UTL_I18N.RAW_TO_CHAR (decrypted_raw, 'AL32UTF8');

    

       RETURN output_string;

      

    END DEC_AES;                       

 

END CRYPTO_AES256;

/

 


[Funtion]



create FUNCTION ENC_AES ( input_string IN VARCHAR2

 ) RETURN VARCHAR2

 IS

 /******************************************************************************

  암호화

 ******************************************************************************/

   

   encrypted_raw      RAW (2000);             -- 암호화된 RAW타입 데이터

   key_bytes_raw      RAW (32);               -- 암호화 KEY (32RAW => 32Byte => 256bit)

   encryption_type    PLS_INTEGER :=          -- 암호화 알고리즘 선언

                            DBMS_CRYPTO.ENCRYPT_AES256

                          + DBMS_CRYPTO.CHAIN_CBC

                          + DBMS_CRYPTO.PAD_PKCS5;

    BEGIN

      

        key_bytes_raw := UTL_I18N.STRING_TO_RAW('12345678901234567890123456789012', 'AL32UTF8');

        encrypted_raw := DBMS_CRYPTO.ENCRYPT

            (

                src => UTL_I18N.STRING_TO_RAW (input_string,  'AL32UTF8'),

                typ => encryption_type,

                key => key_bytes_raw

            );

      

        -- 에러 방지를 위해 base64_encode로 인코딩 처리..

        -- ORA-06502: PL/SQL: numeric or value error: hex to raw conversion error

        RETURN UTL_RAW.CAST_TO_VARCHAR2(UTL_ENCODE.BASE64_ENCODE(encrypted_raw));

       

    END ENC_AES;

 /

 


 create FUNCTION DEC_AES (  encrypted_raw IN VARCHAR2

 ) RETURN VARCHAR2

IS

 

/******************************************************************************

  복호화

 ******************************************************************************/

   output_string      VARCHAR2 (200);         -- 복호화된 문자열

   decrypted_raw      RAW (2000);             -- 복호화된 raw타입 데이터

   key_bytes_raw      RAW (32);               -- 256bit 암호화 key

   encryption_type    PLS_INTEGER :=          -- 복호화 알고리즘 선언

                            DBMS_CRYPTO.ENCRYPT_AES256

                          + DBMS_CRYPTO.CHAIN_CBC

                          + DBMS_CRYPTO.PAD_PKCS5;

    BEGIN

   

        key_bytes_raw := UTL_I18N.STRING_TO_RAW('12345678901234567890123456789012', 'AL32UTF8');

        decrypted_raw := DBMS_CRYPTO.DECRYPT

            (

                -- 에러 방지를 위해 base64_decode로 인코딩 처리..

                -- ORA-06502: PL/SQL: numeric or value error: hex to raw conversion error

                src => UTL_ENCODE.BASE64_DECODE(UTL_RAW.CAST_TO_RAW(encrypted_raw)),

                typ => encryption_type,

                key => key_bytes_raw

            );

       output_string := UTL_I18N.RAW_TO_CHAR (decrypted_raw, 'AL32UTF8');

    

       RETURN output_string;

      

    END DEC_AES;                       


/


블로그 이미지

운명을바꾸는자

IT와 함께 살아가는 삶

,


DBMS_CRYPTO Package를 이용한 단방향 암호화

   

  • 단방향 암호화란?
    • 고객의 Password와 같이 특정 컬럼에 암호화(ENCRYPTION)하며, 복호화(DESCRIPTION)이 필요 없는 단방향성 암호화 기법이다.
    • 고객의 Password는 암호화만 되며, 고객이 입력한 Password는 암호화 루틴을 거쳐 암호화된 값과 일치 여부를 판별한다. 복호화 과정은 필요 없으며, 있을 필요도 없다.
    • 고객의 Password의 분실 시 복호화 해서 알려주는 것이 아니라 RESET으로 임의의 초기값으로 설정하여 통보한다.

         

  • 단방향 암호화를 위해서는
    • Encryption의 Function은 볼 수 없어야 합니다. ==> wrap으로 처리
    • MASTER KEY는 보안담당자만이 알고 있거나, 한번 설정으로 알 필요가 없어야 한다.
    • 해당 특정 Application(AP서버에 있는 Application만)만 암/복호화를 할 수 있어야 한다. ==> Data Vault이용 (Option)
    • Password를 잊었을 경우는 DBMS_RANDOM을 이용하여 초기화 한 후 고객에게 초기화 Password를 알려 준다.

       

       DBMS_CRYPTO를 위한 암호화 Function

   

해당 Function Scriptwrap를 이용하여 Wrapping

   

Wrapping 된 단방향 암호화 Function – 암호화 로직 Master Key를 알 수 없다.

   

Wrapping 된 단방향 암호화 Function – 암호화 로직 Master Key를 알 수 없다.

블로그 이미지

운명을바꾸는자

IT와 함께 살아가는 삶

,