Oracle Transparent Data Encryption

2010. 3. 30. 15:33Developments

Oracle 10g release 2 이후 부터 Encryption/Decryption 함수에서 Advanced Encryption Standard(AES) 알고리즘을 제공함으로써 128bit, 192bit, 256bit 암호화가 가능하여 DES의 단점을 해결한 강력한 정보 암호화를 지원합니다.

1. 암호화 Package 와 Package 별 암호화 지원범위.
Package Feature DBMS_CRYPTO DBMS_OBFUSCATION_TOOLKIT

Cryptographic algorithms

DES, 3DES, AES, RC4, 3DES_2KEY

DES, 3DES

Padding forms

PKCS5, zeroes

None supported

Block cipher chaining modes

CBC, CFB, ECB, OFB

CBC

Cryptographic hash algorithms

SHA-1

MD5

Keyed hash (MAC) algorithms

HMAC_MD5, HMAC_SH1

None supported

Cryptographic pseudo-random number generator

RAW, NUMBER, BINARY_INTEGER

RAW, VARCHAR2

Database types

RAW, CLOB, BLOB

RAW, VARCHAR2

참고 URL: http://download.oracle.com/docs/cd/B19306_01/network.102/b14266/apdvncrp.htm
 1) DBMS_OBFUSCATION_TOOLKIT
 : Oracle 8i 에서 부터 지원한 암호화 Package로 Algorithms은 DES 를 기본으로 사용하며, 암호화 가능 데이터 형태는 Varchar 만을 지원함.

 2) DBMS_CRYPTO
 : Orcle 10g 부터 지원하는 암호화 Package로 Algorithms을 AES (128,192,256 bit) 까지 지원하며, 암호화 가능 데이터 형태는 Column 과 더불어 Table, Tablespace 암호화 까지 지원함.

2. DBMS_CRYPTO 사용방법.
 1) 암호화
 : encryption_type PLS_INTEGER := DBMS_CRYPTO.ENCRYPT_AES256
                                                + DBMS_CRYPTO.CHAIN_CBC
                                                + DBMS_CRYPTO.PAD_PKCS5;
   DBMS_CRYPTO.ENCRYPT (
       src => UTL_I18N.STRING_TO_RAW (input_string, 'AL32UTF8'),
       typ => encryption_type,
       key => key_bytes_raw
   );
 2) 복호화
 : decrypted_raw := DBMS_CRYPTO.DECRYPT (
       src => encrypted_raw,
       typ => encryption_type,
       key => key_bytes_raw
   );
   output_string := UTL_I18N.RAW_TO_CHAR(decrypted_raw, 'AL32UTF8');

3. DBMS_CRYPTO 설정.
 1) 권한 설정
    sys계정> grant execute on DBMS_CRYPTO to 계정명;
 2) 암호화 시 사용 할 Package SPEC 선언.
    CREATE OR REPLACE PACKAGE cust_crypto IS
        FUNCTION encrypt (
            in_val IN VARCHAR,
            key_val IN VARCHAR
        ) RETURN RAW;
       
        FUNCTION decrypt (
            in_val IN VARCHAR,
            key_val IN VARCHAR
        ) RETURN VARCHAR;
    END cust_crypto;
    /
    
 3) 암호화 시 사용 할 Package BODY 선언.
   CREATE OR REPLACE PACKAGE BODY cust_crypto IS
       FUNCTION encrypt (in_val IN VARCHAR , key_val IN VARCHAR) RETURN RAW IS
           input_raw RAW(1024);
           key_raw RAW(16) := UTL_RAW.CAST_TO_RAW(key_val);
           v_out_raw RAW(1024);

           AES_CBC_PKCS5 CONSTANT PLS_INTEGER := DBMS_CRYPTO.ENCRYPT_AES128
                   + DBMS_CRYPTO.CHAIN_CBC
                   + DBMS_CRYPTO.PAD_PKCS5;
 
           BEGIN
               input_raw := UTL_I18N.STRING_TO_RAW(in_val, 'AL32UTF8');
               v_out_raw := DBMS_CRYPTO.ENCRYPT(
                       src => input_raw,
                       typ => AES_CBC_PKCS5,
                       key => key_raw
               );
           RETURN v_out_raw;
       END encrypt;

       FUNCTION decrypt (in_val IN VARCHAR , key_val IN VARCHAR) RETURN VARCHAR IS
           key_raw RAW(16) := UTL_RAW.CAST_TO_RAW(key_val);
           output_raw RAW(1024);
           v_out_string VARCHAR2(1024);
 
           AES_CBC_PKCS5 CONSTANT PLS_INTEGER := DBMS_CRYPTO.ENCRYPT_AES128
                   + DBMS_CRYPTO.CHAIN_CBC
                   + DBMS_CRYPTO.PAD_PKCS5;
   
           BEGIN
               output_raw := DBMS_CRYPTO.DECRYPT(
                       src => in_val,
                       typ => AES_CBC_PKCS5,
                       key => key_raw
               );
 
               v_out_string := UTL_I18N.RAW_TO_CHAR(output_raw, 'AL32UTF8');
           RETURN v_out_string;
       END decrypt ;
   END cust_crypto;
   /
  compile.

 4) TEST
 - SELECT cust_crypto.encrypt('12345678', '1234567890abcdef') from dual;
 : 결과가 정상 표시되는 경우에 생성이 완료된 것 입니다.