본문 바로가기

DB/Oracle

DBMS_CRYPTO를 이용한 암호화/복호화

원문 : http://blog.naver.com/catchbug/20130039354


DMBS_CRYPTO AES256으로 암호화 하기는 별도로 포스팅 되어있습니다.

http://blog.naver.com/catchbug/20130048432

 

1. SYS계정으로 암호화 패키지를 생성할 유저에게 권한을 할당합니다.

 

GRANT EXECUTE ON DBMS_OBFUSCATION_TOOLKIT TO [계정명];

 

GRANT EXECUTE ON DBMS_CRYPTO TO [계정명];

 

2. 권한을 할당한 유저로 접속하여 패키지 생성 Script를 실행합니다.

 

Header 생성 Script

 

CREATE OR REPLACE PACKAGE [계정명].ENCRYPTION_AES

IS

 

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

  암호화

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

 FUNCTION ENC_AES ( INPUT_STRING IN VARCHAR2

 ) RETURN VARCHAR2;

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

  암호화 

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

 

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

  복호화

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

 FUNCTION DEC_AES (  INPUT_STRING IN VARCHAR2

 ) RETURN VARCHAR2;

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

  복호화 

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

 

END ENCRYPTION_AES;

/

 

 

Body 생성 Script

 

CREATE OR REPLACE PACKAGE BODY [계정명].ENCRYPTION_AES

IS

 

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

  암호화

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

 FUNCTION ENC_AES ( INPUT_STRING IN VARCHAR2

 ) RETURN VARCHAR2

 IS

 

    V_ORIGINAL_RAW      RAW(130);        -- 암호화  데이타

    V_KEY_DATA_RAW      RAW(64);        -- 키값

    ENCRYTED_RAW        RAW(320);        -- 암호화  데이타

    CONVERTED_STRING    VARCHAR2(320);   --  변환 데이타

 

    BEGIN

   

        V_ORIGINAL_RAW   := UTL_I18N.STRING_TO_RAW(INPUT_STRING,'AL32UTF8');         -- VARCHAR2 -> RAW 타입으로 변경 (변경 이유는 아래에..)

        V_KEY_DATA_RAW   := UTL_I18N.STRING_TO_RAW('AKDKEKDKFKGKEKSD','AL32UTF8');   -- 키값 RAW 타입으로 변경.

        ENCRYTED_RAW     := DBMS_CRYPTO.ENCRYPT( SRC => V_ORIGINAL_RAW,

                                                    TYP =>DBMS_CRYPTO.ENCRYPT_AES128 +

                                                           DBMS_CRYPTO.CHAIN_CBC+

                                                          DBMS_CRYPTO.PAD_PKCS5,

                                                    KEY => V_KEY_DATA_RAW );

        CONVERTED_STRING := UTL_RAW.cast_to_varchar2(utl_encode.base64_encode(ENCRYTED_RAW) ) ;

 

        -- 중요!!! raw 타입을 base64_encode() 이용하여 encoding  varchar2타입으로 변환해야한다!! 해주지 않으면

        -- ORA-06502: PL/SQL: numeric or value error: hex to raw conversion error 이러한 에러를   있을 것이다.

 

        RETURN CONVERTED_STRING;

       

    END ENC_AES;

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

  암호화 

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

 

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

  복호화

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

 FUNCTION DEC_AES (  INPUT_STRING IN VARCHAR2

 ) RETURN VARCHAR2

 IS

   

    V_KEY_DATA_RAW      RAW(64);        -- 키값

    DECRYPTED_RAW       RAW(320);        -- 복호화 

    CONVERTED_STRING    VARCHAR2(320);   --  변환 데이타

 

    BEGIN

   

        V_KEY_DATA_RAW := UTL_I18N.STRING_TO_RAW('AKDKEKDKFKGKEKSD','AL32UTF8');

        DECRYPTED_RAW :=  DBMS_CRYPTO.DECRYPT( SRC =>utl_encode.base64_decode(utl_raw.cast_to_raw(INPUT_STRING)),

        -- 중요!!! varchar2 타입의 데이타를 raw 타입으로 변환  decoding 해야한다!!해주지 않으면

        -- ORA-06502: PL/SQL: numeric or value error: hex to raw conversion error 이러한 에러를   있을 것이다.

                                                  TYP =>DBMS_CRYPTO.ENCRYPT_AES128 +

                                                         DBMS_CRYPTO.CHAIN_CBC +

                                                         DBMS_CRYPTO.PAD_PKCS5,

                                                  KEY => V_KEY_DATA_RAW);                                                                            

        CONVERTED_STRING :=  UTL_I18N.RAW_TO_CHAR(DECRYPTED_RAW, 'AL32UTF8');  -- RAW -> CHAR 타입으로 변환하여 RETURN

                                        

        RETURN CONVERTED_STRING;

       

    END DEC_AES;

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

  복호화 

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

 

END ENCRYPTION_AES;

/

 

 

3. 테스트

 

SELECTENCRYPTION_AES.ENC_AES('123456789012345678901234567890123456789012345678901234567890')AA FROM DUAL;

 

 

SELECT ENCRYPTION_AES.DEC_AES('IC2hiCNRQKwb6feMvc4PxZfq3xKeb80QrRr/utxFa7Q30BdhgBBRm/ymDbsNg/qHuE9vj5ZqrZExeALTU0oqQA==') FROM DUAL;