본문 바로가기
Oracle(DB관련)

오라클 암호화

by xfree302 2010. 4. 22.
반응형

사원들의 패스워드나 혹은 중요한 계좌번호등을 암호화하기 위해 사용할 수 있는 방법입니다.
별도의 암호서버가 없거나, 어플리케이션에서 구현하기 어려운 경우에 사용하면 좋은 방법이죠.
암호화 방법은 DES(Data Encryption Standard) 입니다.  암호를 해독하기 위해서는 암호시 사용했던 Key 를 알아야 하죠.

아래는 실제 암호화해서 보여지는 샘플입니다.

xencrypt 와 encrypt 가 약간 다르죠? 두 가지중 한가지만 사용하셔도 됩니다. 개인적으로는 xencrypt 선호!

역으로 xdecrypt 와 decrypt 를 실행하면 원문을 볼수 있습니다.

SQLWKS> select sys.crypto.encrypt("Test") from dual;
SYS.CRYPTO.ENCRYPT("TEST")                                                     
-------------------------
ㅥPE ?                                                                        
1 행이 선택되었습니다

SQLWKS> select sys.crypto.xencrypt("Test") from dual;
SYS.CRYPTO.XENCRYPT("TEST")                                                    
-------------------------
26CCE98AD6AEC709                                                               
1 행이 선택되었습니다

 

일단 오라클 SYS 유저에서 작업을 해주고 실행권한을 public 으로 grant 해줍니다.
※ 일단 이같은 작업은 DBA 만 할 수 있죠. 어플리케이션 담당자분들은 필요 시 요청하심~

[[ 여기부터 ]]

DBMS_OBFUSCATION_TOOLKIT을 이용하기 위해서는 :
1) SYS 유저로
   @$ORACLE_HOME/rdbms/admin/dbmsobtk.sql
   @$ORACLE_HOME/rdbms/admin/prvtobtk.plb

 ################ 암호화 하는 모듈 #####################

2) 패키지 생성

CREATE OR REPLACE PACKAGE Crypto AS
   FUNCTION xencrypt( Str VARCHAR2 ) RETURN VARCHAR2;
   FUNCTION xdecrypt( xCrypt VARCHAR2 ) RETURN VARCHAR2;
   FUNCTION encrypt( Str VARCHAR2 ) RETURN VARCHAR2;
   FUNCTION decrypt( xCrypt VARCHAR2 ) RETURN VARCHAR2;
END Crypto;
/

CREATE OR REPLACE PACKAGE BODY Crypto AS
   raw_input RAW(128);
   key_string VARCHAR2(16):="keyvalues";
   raw_key RAW(128):=UTL_RAW.CAST_TO_RAW(key_string);
   encrypted_raw RAW(2048);
   decrypted_raw RAW(2048);
   crypted_string VARCHAR2(2000);
   hash VARCHAR2(50);

   FUNCTION encrypt( Str VARCHAR2  ) RETURN VARCHAR2
   AS
   pieces_of_eight INTEGER := ((FLOOR(LENGTHB(Str)/8 +.9))*8);
   BEGIN
      hash :="hashkey";
      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 ) RETURN VARCHAR2
   AS
   BEGIN
      hash :="hashkey";
      dbms_obfuscation_toolkit.DESDecrypt(
               input_string     => xCrypt,
               key_string       => RPAD(hash,8,"#"),
               decrypted_string => crypted_string );
      RETURN trim(crypted_string);
   END;

   FUNCTION xencrypt( Str VARCHAR2  ) RETURN VARCHAR2
   AS
   BEGIN
    raw_input:=UTL_RAW.CAST_TO_RAW(RPAD(Str,FLOOR((LENGTHB(Str)/8+.9))*8));
    dbms_obfuscation_toolkit.DESEncrypt(input => raw_input,key=> raw_key, encrypted_data => encrypted_raw);
    RETURN rawtohex(encrypted_raw);
   END;
   FUNCTION xdecrypt( xCrypt VARCHAR2 ) RETURN VARCHAR2
   AS
   BEGIN
    encrypted_raw:=hextoraw(xCrypt);
    dbms_obfuscation_toolkit.DESDecrypt(input => encrypted_raw,key=> raw_key, decrypted_data => decrypted_raw);
    RETURN UTL_RAW.CAST_TO_VARCHAR2(decrypted_raw);
   END;
END Crypto;
/

3) grant execute on sys.crypto to public;


반응형

'Oracle(DB관련)' 카테고리의 다른 글

the Toad Extension for Eclipse  (0) 2010.10.07
오라클 함수(lead, lag) 이용 게시판 이전글, 다음글  (0) 2010.09.16
숫자함수  (0) 2009.11.04
문자함수  (0) 2009.11.04
날짜함수  (0) 2009.11.04