Oracle Database TIP
오라클에서의 데이터 암호화 기능 19 4 39,197

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

  암호화 기능을 이용하려면 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 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경우 발생

- 강좌 URL : http://www.gurubee.net/lecture/1200

- 구루비 강좌는 개인의 학습용으로만 사용 할 수 있으며, 다른 웹 페이지에 게재할 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^

- 구루비 강좌는 서비스 제공을 위한 목적이나, 학원 홍보, 수익을 얻기 위한 용도로 사용 할 수 없습니다.

by hski [2005.07.04 14:50:36]
key를 'goodman', pw를 77로하면 5자리로 생성되서 decryption할때 28233에러 나네요.^^;;

by 이영민 [2006.04.25 22:03:23]
패키지 본체에서 length 함수를 쓰면 str 에 한글이 들어가면 문장이 잘려버리는 사태가 벌어집니다.
lengthB 를 사용하세요. 그럼 해결됩니다.

by 초짜 [2006.08.30 15:58:37]
데이터 타입이 varchar2 가 아닌 char 타입인 경우에는
암호화는 되는 데, 복호화에 문제가 있습니다.
패키지가 varchar2에 맞춰져 있어서 그럴텐데요.
혹시 char 타입의 데이터를 암호화/복호화 하려면 어떻게 해야하나요?

by 하록 [2008.06.04 12:21:01]
왠지 nvarchar 도 문제가 생길거 같네요? ㅡㅡ;
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입