개 요
=========
Oracle 8i Release2(8.1.6)에서는 데이터를 암호화하여 저장할 수 있는 향상된
기능(DES Encryption)을 제공한다
(Oracle 8i Release3(8.1.7)에서는 Triple DES Encryption)
즉 신용카드번호, 패스워드 등 보안이 필요한 데이터를 암호화된 형태로 저장하여
기존의 3rd Party Tool이나, Application Logic으로 구현하던 암호화 정책을
데이터베이스 차원에서 구현할 수 있도록 해준다.
DBMS_OBFUSCATION_TOOLKIT
========================
암호화 기능을 이용하려면 DBMS_OBFUSCATION_TOOLKIT을 이용해야 한다.
이 패키지는 4개의 프로시져로 이루어져 있다.
- VARCHAR2 타입을 Encrypt/Decrypt할 수 있는 2개의 프로시져
- RAW 타입을 Encrypt/Decrypt할 수 있는 2개의 프로시져
(다른 타입은 지원하지 않으므로 number인 경우는 to_char 이용)
DBMS_OBFUSCATION_TOOLKIT을 이용하기 위해서는 :
1) SYS 유저로
@$ORACLE_HOME/rdbms/admin/dbmsobtk.sql
@$ORACLE_HOME/rdbms/admin/prvtobtk.plb
2) grant execute on dbms_obfuscation_toolkit to public;
제 한 사 항
===========
1) DES(Data Encryption Standard) symmetric key algorithm 방식을 이용.
즉 암호화할 때 이용한 key를 분실했을 경우 데이터를 해독할 방법이 없다.
2) Encrypt하려는 data가 8 bytes 배수(8,16,... bytes)이어야 한다.
3) 미국무부의 암호화기술 수출제한조치에 의해 56-bit key를 사용.
4) 미국무부의 암호화기술 수출제한조치에 의해 한번 암호화된 데이터를
또다시 암호화할 수 없다.
*) 많은 테이블을 Encrypt/decrypt할 경우 CPU 사용량을 증가시킬 수 있다.
사 용 예
========
1) encrypt/decrypt에 이용할 FUNCTION을 만든다.
(만약 input string이 8 bytes 배수가 아니면 패딩을 한다)
- - - - - - - - - - - - - - - Code begins here - - - - - - - - - - - - - - -
CREATE OR REPLACE PACKAGE CryptIT AS
FUNCTION encrypt( Str VARCHAR2,
hash VARCHAR2 ) RETURN VARCHAR2;
FUNCTION decrypt( xCrypt VARCHAR2,
hash VARCHAR2 ) RETURN VARCHAR2;
END CryptIT;
/
CREATE OR REPLACE PACKAGE BODY CryptIT 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,8,'#'),
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,8,'#'),
decrypted_string => crypted_string );
RETURN trim(crypted_string);
END;
END CryptIT;
/
- - - - - - - - - - - - - - - Code ends here - - - - - - - - - - - - - - -
2) Encrypt하여 데이터 입력
drop table encrypt_table;
create table encrypt_table( id number, passwd varchar(10) );
insert into encrypt_table values( 1, CryptIT.encrypt('tiger', 'key_a'));
insert into encrypt_table values( 2, CryptIT.encrypt('tiger', 'key_b'));
3) Decrypt하여 데이터 조회
SQL> select id, passwd from encrypt_table where passwd = 'tiger';
no rows selected
-> 물론 Decrypt하지 않으면 암호화된 데이터와 비교된다.
주의) encrypt된 데이터를 화면에 출력면, terminal emulator가 오작동할 수 있다.
terminal emulator 프로그램 종료 후 다시 시작.
SQL> col passwd format a60
SQL> select id, dump(passwd) passwd from encrypt_table;
ID PASSWD
---------- -------------------------------------------------------------
1 Typ=1 Len=8: 246,27,80,184,227,225,245,31
2 Typ=1 Len=8: 175,231,213,125,85,223,46,133
-> 저장장치에 Encrypt된 값으로 저장된다.
select id, CryptIT.decrypt(passwd,'key_a') passwd
from encrypt_table
where CryptIT.decrypt(passwd,'key_a') = 'tiger';
ID PASSWD
---------- -------------------------------------------------------------
1 tiger
select id, CryptIT.decrypt(passwd,'key_b') passwd
from encrypt_table
where CryptIT.decrypt(passwd,'key_b') = 'tiger';
ID PASSWD
---------- ------------------------------------------------------------
2 tiger
-> Encrypt할 때 사용한 Key로만 Decrypt할 수 있다.
주의) Table에 접근 권한이 있는 다른 유저도 Key값을 알면 Decrypt할 수 있다.
4) 관련 ORA number
ORA error 28231 "Invalid input to Obfuscation toolkit"
- input data, key값이 NULL일 경우 발생
ORA error 28232 "Invalid input size for Obfuscation toolkit"
- input data가 8 bytes 배수가 아닐 경우 발생
ORA error 28233 "Double encryption not supported by DESEncrypt in Obfuscation toolkit"
- encrypt data를 다시 encrypt경우 발생
관 련 자 료
===========
Oracle8i Supplied PL/SQL Packages Reference Release 2 (8.1.6)
'SQL > ORACLE' 카테고리의 다른 글
[Oracle]인터미디어 텍스트 인덱스에 관해서 (0) | 2014.02.12 |
---|---|
[펌] connection failover 설정하기 (0) | 2014.02.12 |
[Oracle]로드 발란싱 구현하기 (0) | 2014.02.12 |
[Oracle]데이터베이스 접속, 시작, 종료하기 (0) | 2014.02.12 |
[Oracle]개발팁 모음 (0) | 2014.02.12 |
[Oracle]ora-00054: 자원이 사용중이고, NOWAIT가 지정되어 있습니다 (0) | 2014.02.12 |
[Oracle]원단위 절삭 trunc함수 (0) | 2014.02.12 |
[oracle]대용량 like 검색, 제목, 내용검색시 빠르게 하는 방법 (0) | 2014.02.12 |