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




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

GRANT EXECUTE ON DBMS_OBFUSCATION_TOOLKIT TO [유저명];

GRANT EXECUTE ON DBMS_CRYPTO TO [유저명];




2. 패키지 생성 스크립트


Head Script

CREATE OR REPLACE PACKAGE [유저명].CRYPTO_AES256

IS

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

암호화

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

FUNCTION ENC_AES ( input_string IN VARCHAR2

) RETURN VARCHAR2;


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

복호화

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

FUNCTION DEC_AES ( encrypted_raw IN VARCHAR2

) RETURN VARCHAR2;

END CRYPTO_AES256;

/




Body Script

CREATE OR REPLACE PACKAGE BODY [유저명].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');

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

-- ORA-06502: PL/SQL: numeric or value error: hex to raw conversion error
decrypted_raw := DBMS_CRYPTO.DECRYPT
(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;

/





각자 원하는 키코드(32byte) 부분을 수정하면 해당 키로만 복호화 할 수 있는 암호화 문자열이 생성됩니다.

만약 다음과 같은 에러가 발생될시 조치방법

PACKAGE BODY [유저명].CRYPTO_AES256

On line: 7

PLS-00323: 부프로그램 또는 'ENC_AES' 커서는 패키지 지정에 정의되고 패키지 본체에 나타나야합니다




Body Script를 긁어서 프로그램 코드를 직접제거하고, Head에 들어가는 형식으로 직접 수정 합니다.

그리고 Head생성 후 Body 생성..

Head와 Body에 문자열이든 어떤것이든 형식이 일치하지 않는다는 에러입니다.



+ Recent posts