4,511,602 th visitor since 2017.2.1 ( Today : 2169 )
Programming
No. 492
Name. swindler
Subject. Oracle Obfuscation Toolkit (DES 암호화)
Main Cate. Oracle
Sub Cate.
Date. 2008-11-03 11:38
Hit. 4985 (210.182.190.136)
File.
개 요

=========

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)


[바로가기 링크] : http://coolx.net/cboard/develop/492



Name
Password
Comment
Copyright © 1999-2017, swindler. All rights reserved. 367,611 visitor ( 1999.1.8-2004.5.26 ), 2,405,771 ( -2017.01.31)

  2HLAB   2HLAB_Blog   RedToolBox   Omil   Omil_Blog