상세 컨텐츠

본문 제목

DBMS_OBFUSCATION_TOOLKIT 의 암호화/복호화

DataBase/Oracle

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

본문

출처 :  http://blog.naver.com/PostView.nhn?blogId=pky0706&logNo=140136136640




No. 12070

DBMS_OBFUSCATION_TOOLKIT 의 암호화/복호화
=====================================================



Purpose
-------
Oracle 8i Release2 (8.1.6) 부터 향상된 보안 기능으로 DBMS_OBFUSCATION_TOOLKIT 을 
사용한 암호화 복호화 기능에 대해 알아보자.



Explanation
-----------
이 기능은 DB 내에 저장되는 컬럼을 plain 문장이 아닌 암호화된 문장을 저장할 수 있게 한다. 
만약 신용카드 번호나 패스워드 등 안전하게 보호해야 할 정보일 경우 이 기능을 사용하면 안전하게 
정보를 저장할 수 있다. 기존에는 암호화 기능을 사용하려면 3rd party의 제품이 필요했으나, 
8.1.6 이후로는 DB 내에 이 기능을 포함시켰다. 



1. DBMS_OBFUSCATION_TOOLKIT 

DBMS_OBFUSCATION_TOOLKIT 을 사용하여 Data를 암호화/복호화한다.

이 패키지에는 4개의 프로시져가 있다.
- VARCHAR2와 RAW Data를 암호화하는 2개의 프로시져
- VARCHAR2와 RAW Data를 복호화하는 2개의 프로시져



2. 설치

1) SYS 로 접속 후 dbmsobtk.sql과 prvtobtk.plb를 순서대로 실행
2) grant execute on dbms_obfuscation_toolkit to public

이 function에서 일반적으로 2개의 파라미터가 필요하나데, 하나는 암호화되거나 
복호화되는 데이타이고, 다른 하나는 암호화 알고리즘에서 사용되는 암호화 키이다.



3. DES (Data Encryption Standard)

DES 알고리즘은 64bit의 캐릭터를 사용하여 알파벳 한 글자 단위로 위치를 바꾸는 방식이며 
19 단계를 거치게 된다. 복호화시 사용되는 패스워드는 암호화에 사용된 패스워드와 같으며, 
그 역순을 따르게 된다. 입력 데이타는 8 캐릭터의 블럭으로 나뉘어져 각각 암호화 되며, 
dbms_obfuscation_toolki 에서 사용가능한 알고리즘이다.



4. 제약사항

1) Data 는 DES (Data Encryption Standard) 에 의한 비밀키 암호화만 가능하며, 
복호화시에도 동일한 키를 사용해야만 복호화가 가능하다.

2) 56 bit의 키를 사용한 암호화만 가능하다. (나머지 8bit는 검사용)

3) Double encryption은 지원하지 않으며, 암호화된 Data를 재암호화하려고 하면 
ORA-28233 : "double encryption not supported" 에러가 발생한다.

4) 암호화 하려는 data가 8 bytes 배수(8,16,... bytes)이어야 한다. 

이 제약사항들은 버젼 업그레이드에 따라 향상될 계획이며, 좀 더 강력한 보안 기능을 제공하게 될 것이다. 
주의 사항 중 하나는 암호화/복호화 작업은 CPU 자원을 많이 사용하며, 시스템 가용 상황에 따라 적절한 
계획을 세워야 할 것이다.



5. 관련 ORACLE error

1) ORA error 28231 "Invalid input to Obfuscation toolkit" 
- input data, key값이 NULL일 경우 발생 

2) ORA error 28232 "Invalid input size for Obfuscation toolkit" 
- input data가 8 bytes 배수가 아닐 경우 발생 

3) ORA error 28233 "Double encryption not supported by DESEncrypt in Obfuscation toolkit" 
- encrypt data를 다시 encrypt경우 발생




예제)
1) encrypt/decrypt에 이용할 FUNCTION을 만든다. 
(만약 input string이 8 bytes 배수가 아니면 패딩을 한다) 

--------------------------------------------------------

CREATE OR REPLACE PACKAGE CryptString AS 
FUNCTION encrypt( Str VARCHAR2, hash VARCHAR2 ) RETURN VARCHAR2; 
FUNCTION decrypt( xCrypt VARCHAR2, hash VARCHAR2 ) RETURN VARCHAR2; 
END CryptString; 


CREATE OR REPLACE PACKAGE BODY CryptString AS 
crypted_string VARCHAR2(2000); 

FUNCTION encrypt( Str VARCHAR2, hash VARCHAR2 ) RETURN VARCHAR2 AS 
pieces_of_eight INTEGER := ((FLOOR(LENGTH(Str)/8 + .9)) * 8); 
BEGIN 
dbms_obfuscation_toolkit.DESEncrypt( 
       input_string => RPAD( Str, pieces_of_eight ), 
       key_string => RPAD(hash,16,'#'), 
       encrypted_string => crypted_string ); 
RETURN crypted_string; 
END; 

FUNCTION decrypt( xCrypt VARCHAR2, hash VARCHAR2 ) RETURN VARCHAR2 AS 
BEGIN 
dbms_obfuscation_toolkit.DESDecrypt( 
        input_string => xCrypt, 
        key_string => RPAD(hash,16,'#'), 
        decrypted_string => crypted_string ); 
RETURN trim(crypted_string); 
END; 

END CryptString; 




2) Encrypt하여 데이터 입력 

drop table encrypt_table; 
create table encrypt_table( id number, passwd varchar(50) ); 

insert into encrypt_table values( 1, CryptString.encrypt('tigerofkorea', 'encrypt1')); 
insert into encrypt_table values( 2, CryptString.encrypt('tigerofkorea', 'encrypt2'));



3) Decrypt하여 데이터 조회 

select id, passwd from encrypt_table where passwd = 'tigerofkorea'; 
no rows selected 
-> 물론 Decrypt하지 않으면 암호화된 데이터와 비교된다. 

SQL> select id, dump(passwd) passwd from encrypt_table; 

ID PASSWD 
---------------- 
1 Typ=1 Len=16: 223,79,183,178,249,189,4,217,180,170,20,123,4,155,82,28
2 Typ=1 Len=16: 74,157,14,15,147,238,66,139,164,31,250,168,7,105,138,14

-> 저장장치에 Encrypt된 값으로 저장된다. 

select id, CryptString.decrypt(passwd, 'encrypt1') passwd from encrypt_table 
where CryptString.decrypt(passwd, 'encrypt1') = 'tigerofkorea'; 

ID PASSWD 
--------------- 
1 tigerofkorea

select id, CryptString.decrypt(passwd, 'encrypt2') passwd from encrypt_table 
where CryptString.decrypt(passwd, 'encrypt2') = 'tigerofkorea';

ID PASSWD 
---------------- 
2 tigerofkorea

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

테이블 권한주기  (0) 2013.05.30
ORACLE 트리거 샘플  (0) 2013.05.30
DBMS_CRYPTO를 이용한 암호화/복호화  (0) 2013.05.24
컬럼이름으로 테이블 검색  (0) 2013.05.23
SELECT 로 UPDATE 하기  (0) 2013.05.23

관련글 더보기