상세 컨텐츠

본문 제목

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

DataBase/Oracle

by 탑~! 2013. 5. 24. 22:42

본문

출처 :  http://blog.naver.com/catchbug?Redirect=Log&logNo=20130039354




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. 테스트

SELECT ENCRYPTION_AES.ENC_AES('123456789012345678901234567890123456789012345678901234567890') AA FROM DUAL;


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




 



'DataBase > Oracle' 카테고리의 다른 글

ORACLE 트리거 샘플  (0) 2013.05.30
DBMS_OBFUSCATION_TOOLKIT 의 암호화/복호화  (0) 2013.05.24
컬럼이름으로 테이블 검색  (0) 2013.05.23
SELECT 로 UPDATE 하기  (0) 2013.05.23
테이블 초기 크기 계산법  (0) 2013.05.23

관련글 더보기