본문 바로가기

춤추는 프로그래머/C, C++

오라클 암호화

1. 설 명

☞ Bulletin no : 12036 참고


Oracle 8i Release2(8.1.6)에서는 데이터를 암호화하여 저장할 수 있는 
향상된 기능(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) 권한을 부여 합니다. 

SQL>GRANT execute ON dbms_obfuscation_toolkit TO public;



2. 패키지 실행하기



--> 패키지 선언부 생성

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;
/



3. 실행 예제


1) Encrypt하여 데이터 입력

-- 테스트 테이블을 생성 합니다. 

SQL>create table encrypt_table( id number, passwd varchar(20) );



-- 테스트 데이트럴 입력 합니다. 
-- CryptIT.encrypt(비밀번호, 키값)

SQL>INSERT INTO encrypt_table VALUES( 1, CryptIT.encrypt('1234', 'storm'));
1 개의 행이 만들어졌습니다.


SQL>INSERT INTO encrypt_table VALUES( 2, CryptIT.encrypt('5678', 'oramaster'));
1 개의 행이 만들어졌습니다.



2) Decrypt하여 데이터 조회

--> Decrypt하지 않으면 암호화된 데이터와 비교되서 결과값이 출력되지 않습니다.
SQL> select id, passwd from encrypt_table where passwd = '1234';

선택된 레코드가 없습니다.


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

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할 때 사용한 Key로만 Decrypt할 수 있습니다.

SQL>SELECT id, CryptIT.decrypt(passwd,'storm') passwd
FROM encrypt_table 
WHERE CryptIT.decrypt(passwd,'storm') = '1234';

ID PASSWD
---------- -----------
1 1234


SQL>SELECT id, CryptIT.decrypt(passwd,'oramaster') passwd
FROM encrypt_table 
WHERE CryptIT.decrypt(passwd,'oramaster') = '5678';

ID PASSWD
---------- -----------
2 5678


주의) Table에 접근 권한이 있는 다른 유저도 Key값을 알면 Decrypt할 수 있습니다.



4) 관련 ORA error 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)

'춤추는 프로그래머 > C, C++' 카테고리의 다른 글

[JAVA] Vector 사용법!  (0) 2010.06.15
[HTML] input type 속성  (0) 2010.06.15
JDBC  (0) 2010.06.15
JSP에서!  (0) 2010.06.14
window mobile SDK 6.0  (0) 2010.03.06