by 구루비 암호화 복호화 DBMS_OBFUSCATION_TOOLKIT ENCRYPTION DECRYPTION DBMSOBTK.SQL [2002.02.28]
Oracle 8i Release2(8.1.6)에서는 데이터를 암호화하여 저장할 수 있는 향상된 기능(DES Encryption)을 제공 한다.
즉 신용카드번호, 패스워드 등 보안이 필요한 데이터를 암호화된 형태로 저장하여기존의 3rd Party Tool이나, Application Logic으로 구현하던 암호화 정책을 데이터베이스 차원에서 구현할 수 있도록 해준다.
암호화 기능을 이용하려면 DBMS_OBFUSCATION_TOOLKIT을 이용해야 한다.
이 패키지는 VARCHAR2 타입을 Encrypt/Decrypt할 수 있는 2개의 프로시져와 RAW 타입을 Encrypt/Decrypt할 수 있는 2개의 프로시져 이렇게 4개의 프로시져로 이루어져 있다.
DBMS_OBFUSCATION_TOOLKIT을 이용하기 위해서는 SYS 사용자에서 아래의 스크립트를 실행 시켜야 한다.
-- 스크립트 실행 SQL> @$ORACLE_HOME/rdbms/admin/dbmsobtk.sql SQL> @$ORACLE_HOME/rdbms/admin/prvtobtk.plb -- 권한 부여 SQL> GRANT execute ON dbms_obfuscation_toolkit TO public;
-- 패키지 선언부 생성 SQL> CREATE OR REPLACE PACKAGE CryptIT AS FUNCTION encrypt( Str VARCHAR2, hash VARCHAR2 ) RETURN VARCHAR2; FUNCTION decrypt( xCrypt VARCHAR2, hash VARCHAR2 ) RETURN VARCHAR2; END CryptIT; / -- 패키지 본체 생성 SQL> 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; /
-- Encrypt하여 데이터 입력 예제 -- 테스트 테이블을 생성 SQL> CREATE TABLE encrypt_table( id number, passwd VARCHAR(20) ); -- 테스트 데이트럴 입력. -- CryptIT.encrypt(비밀번호, 키값) SQL> INSERT INTO encrypt_table VALUES( 1, CryptIT.encrypt('1234', 'storm')); SQL> INSERT INTO encrypt_table VALUES( 2, CryptIT.encrypt('5678', 'oramaster')); SQL> COMMIT; -- 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
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경우 발생
- 강좌 URL : http://www.gurubee.net/lecture/1200
- 구루비 강좌는 개인의 학습용으로만 사용 할 수 있으며, 다른 웹 페이지에 게재할 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^
- 구루비 강좌는 서비스 제공을 위한 목적이나, 학원 홍보, 수익을 얻기 위한 용도로 사용 할 수 없습니다.