내용 목차
본 장에서는 DBMS_OBFUSCATION_TOOLKIT 패키지의 기본 개념과 패키지 내의 프러시저와 함수를 사용하는 방법을 설명한다.
DBMS_OBFUSCATION_TOOLKIT은 데이터를 암호화(encryption)하고 복호화(decryption)하는 패키지이다. 이 패키지에서는 데이터의 암호화 및 복호화를 위해 DES(Data Encryption Standard) 또는 3DES(Triple DES) 알고리즘을 이용한다.
DES와 3DES 알고리즘은 대칭 키(symmetric key)를 사용하는 알고리즘이다.
이러한 대칭 키를 사용하는 암호화 알고리즘에서는 키를 안전하게 관리하는 것이 무엇보다 중요하다.
암호화 알고리즘에서 키를 관리하는 방법은 다음과 같다.
데이터베이스에 키를 저장하는 방법
특정 테이블의 컬럼에 키를 저장하는 방법이다. 이때 키를 저장하는 테이블은 암호화된 데이터 컬럼과 같은 테이블일 수도 있고, 다른 테이블일 수도 있다. 같은 테이블에 키를 저장하는 경우에는 해당 테이블 전체에 대한 액세스 특권을 부여하는 대신 뷰 또는 tbPSM 프로그램 등을 통하여 해당 테이블에 액세스해야 한다.
운영체제 파일에 저장하는 방법
키를 파일에 저장하고, 데이터베이스 내에서 tbPSM 프로그램 등을 통하여 운영체제 파일로부터 키를 읽어 데이터를 암호화하거나 복호화하는 방법이다. 이때 키를 저장하는 운영체제 파일은 패스워드 파일과 같이 다른 사람이 직접 액세스할 수 없도록 보안을 유지해야 한다.
사용자가 키를 직접 입력하는 방법
사용자 또는 애플리케이션 프로그램 내에서 필요할 때마다 키를 데이터베이스로 전송하여 암호화 및 복호화를 수행하는 방법이다. 이 방법은 사용자가 키를 항상 암기하고 있거나 애플리케이션 프로그램의 소스 내에 키가 포함되어 있어야 한다. 또한, 키는 네트워크를 통하여 데이터베이스 서버로 전달되므로, 네트워크 보안에도 유의해야 한다.
본 절에서는 DBMS_OBFUSCATION_TOOLKIT 패키지에서 제공하는 프러시저와 함수를 알파벳 순으로 설명한다.
3DES 알고리즘을 이용하여 암호화된 데이터를 복호화하는 프러시저와 함수이다. 주어진 암호화된 데이터에 대하여 두 번 또는 세 번의 DES 복호화를 수행할 수 있다.
복호화를 위해 주어진 키에 대해 복호화를 두 번 수행한다면 16bytes(128bits), 세 번을 수행한다면 24bytes(192bits)이어야 하며, 그렇지 않으면 예외 상황이 발생한다. 디폴트는 두 번의 DES 복호화를 수행한다. 암호화된 데이터와 같은 횟수만큼 DES 알고리즘을 수행해야 한다.
DES3DECRYPT 프러시저와 함수의 세부 내용은 다음과 같다.
프로토타입
프러시저
DBMS_OBFUSCATION_TOOLKIT.DES3DECRYPT ( input IN RAW, key IN RAW, decrypted_data OUT RAW, which IN PLS_INTEGER DEFAULT 0, iv IN RAW DEFAULT NULL );
DBMS_OBFUSCATION_TOOLKIT.DES3DECRYPT ( input_string IN VARCHAR2, key_string IN VARCHAR2, decrypted_string OUT VARCHAR2, which IN PLS_INTEGER DEFAULT 0, iv_string IN VARCHAR2 DEFAULT NULL );
함수
DBMS_OBFUSCATION_TOOLKIT.DES3DECRYPT ( input IN RAW, key IN RAW, which IN PLS_INTEGER DEFAULT 0, iv IN RAW DEFAULT NULL ) RETURN RAW;
DBMS_OBFUSCATION_TOOLKIT.DES3DECRYPT ( input_string IN VARCHAR2, key_string IN VARCHAR2, which IN PLS_INTEGER DEFAULT 0, iv_string IN VARCHAR2 DEFAULT NULL ) RETURN VARCHAR2;
파라미터
파라미터 | 설명 |
---|---|
input, input_string | 복호화할 데이터이다. |
key | 복호화하기 위해 주어진 키 값이다. |
decrypted_data | 복호화된 결과 데이터이다. |
which |
|
iv | 초기화 벡터이다. |
예외 상황
예외 상황 | 설명 |
---|---|
INVALID_ARGUMENT | 파라미터 중 하나라도 NULL인 경우이다. |
INVALID_INPUT | input_data의 길이가 8의 배수가 아닌 경우이다. |
KEY_TOO_SHORT | 키 값의 길이가 8보다 작은 경우이다. |
INVALID_DES_MODE | which 값이 0 또는 1이 아닌 경우이다. |
예제
DECLARE data RAW(256); key RAW(16); encrypted_data RAW(256); decrypted_data RAW(256); BEGIN data := '0102030405AE030D0123456789ABCDEF'; key := '0A123B8E002CD3FF01DE2389A4567BCF'; DBMS_OBFUSCATION_TOOLKIT.DES3Encrypt(input => data, key => key, encrypted_data => encrypted_data); data := encrypted_data; DBMS_OBFUSCATION_TOOLKIT.DES3Decrypt(input => data, key => key, decrypted_data => decrypted_data); END;
3DES 알고리즘을 이용하여 데이터를 암호화하는 프러시저와 함수이다. 주어진 데이터에 대하여 두 번 또는 세 번의 DES 암호화를 수행할 수 있다.
암호화를 위해 주어진 키에 대해 암호화를 두 번을 수행한다면 16bytes(128bits), 세 번을 수행한다면 24bytes(192bits)이어야 하며, 그렇지 않으면 예외 상황이 발생한다. 디폴트는 두 번의 DES 암호화를 수행한다.
DES3ENCRYPT 프러시저와 함수의 세부 내용은 다음과 같다.
프로토타입
프러시저
DBMS_OBFUSCATION_TOOLKIT.DES3ENCRYPT ( input IN RAW, key IN RAW, encrypted_data OUT RAW, which IN PLS_INTEGER DEFAULT 0, iv IN RAW DEFAULT NULL );
DBMS_OBFUSCATION_TOOLKIT.DES3ENCRYPT ( input_string IN VARCHAR2, key_string IN VARCHAR2, encrypted_string OUT VARCHAR2, which IN PLS_INTEGER DEFAULT 0, iv_string IN VARCHAR2 DEFAULT NULL );
함수
DBMS_OBFUSCATION_TOOLKIT.DES3ENCRYPT ( input IN RAW, key IN RAW, which IN PLS_INTEGER DEFAULT 0, iv IN RAW DEFAULT NULL ) RETURN RAW;
DBMS_OBFUSCATION_TOOLKIT.DES3ENCRYPT ( input_string IN VARCHAR2, key_string IN VARCHAR2, which IN PLS_INTEGER DEFAULT 0, iv_string IN VARCHAR2 DEFAULT NULL ) RETURN VARCHAR2;
파라미터
파라미터 | 설명 |
---|---|
input, input_string | 암호화할 데이터이다. |
key | 암호화하기 위해 주어진 키 값이다. |
encrypted_data | 암호화된 결과 데이터이다. |
which |
|
iv | 초기화 벡터이다. |
예외 상황
예외 상황 | 설명 |
---|---|
INVALID_ARGUMENT | 파라미터 중 하나라도 NULL인 경우이다. |
INVALID_INPUT | input_data의 길이가 8의 배수가 아닌 경우이다. |
KEY_TOO_SHORT | 키 값의 길이가 8보다 작은 경우이다. |
INVALID_DES_MODE | which 값이 0 또는 1이 아닌 경우이다. |
예제
DECLARE data RAW(256); key RAW(16); encrypted_data RAW(256); decrypted_data RAW(256); BEGIN data := '0102030405AE030D0123456789ABCDEF'; key := '0A123B8E002CD3FF01DE2389A4567BCF'; DBMS_OBFUSCATION_TOOLKIT.DES3Encrypt(input => data, key => key, encrypted_data => encrypted_data); data := encrypted_data; DBMS_OBFUSCATION_TOOLKIT.DES3Decrypt(input => data, key => key, decrypted_data => decrypted_data); END;
임의의 값을 입력 값으로 받아 DES3 알고리즘을 위한 키를 생성하는 프러시저와 함수이다.
DES3GETKEY 프러시저와 함수의 세부 내용은 다음과 같다.
프로토타입
프러시저
DBMS_OBFUSCATION_TOOLKIT.DES3GETKEY ( which IN PLS_INTEGER DEFAULT 0, seed IN RAW, key OUT RAW );
DBMS_OBFUSCATION_TOOLKIT.DES3GETKEY ( which IN PLS_INTEGER DEFAULT 0, seed_string IN VARCHAR2, key OUT VARCHAR2 );
함수
DBMS_OBFUSCATION_TOOLKIT.DES3GETKEY ( which IN PLS_INTEGER DEFAULT 0, seed IN RAW ) RETURN RAW;
DBMS_OBFUSCATION_TOOLKIT.DES3GETKEY ( which IN PLS_INTEGER DEFAULT 0, seed_string IN VARCHAR2 ) RETURN VARCHAR2;
파라미터
파라미터 | 설명 |
---|---|
which |
|
seed | 80자 이상의 임의의 값이다. |
key | 암호화하기 위해 주어진 키 값이다. |
예외 상황
예외 상황 | 설명 |
---|---|
NO_SEED | seed의 값이 NULL인 경우이다. |
SEED_TOO_SHORT | seed의 길이가 80보다 작은 경우이다. |
INVALID_INPUT | which가 NULL인 경우이다. |
INVALID_DES_MODE | which의 값이 0 또는 1이 아닌 경우이다. |
예제
DECLARE data VARCHAR2(4096); key VARCHAR2(4096); key_seed VARCHAR2(4096); encrypted_data VARCHAR2(4096); decrypted_data VARCHAR2(4096); BEGIN data := '0102030405AE030D'; key_seed := '1234567890'||'1234567890'||'1234567890'||'1234567890'; key_seed := rpad(key_seed,80); key := dbms_obfuscation_toolkit.DES3GetKey(seed_string => key_seed); DBMS_OBFUSCATION_TOOLKIT.DES3Encrypt(input_string => data, key_string => key, encrypted_string=> encrypted_data); data := encrypted_data; DBMS_OBFUSCATION_TOOLKIT.DES3Decrypt(input_string => data, key_string => key, decrypted_string => decrypted_data); END; /
DES 알고리즘을 이용하여 암호화된 데이터를 복호화하는 프러시저와 함수이다. 복호화를 위해 주어진 키는 반드시 8bytes(64bits)이어야 하며, 그렇지 않으면 예외 상황이 발생한다.
DESDECRYPT 프러시저와 함수의 세부 내용은 다음과 같다.
프로토타입
프러시저
DBMS_OBFUSCATION_TOOLKIT.DESDECRYPT ( input IN RAW, key IN RAW, decrypted_data OUT RAW );
DBMS_OBFUSCATION_TOOLKIT.DESDECRYPT ( input_string IN VARCHAR2, key_string IN VARCHAR2, decrypted_string OUT VARCHAR2 );
함수
DBMS_OBFUSCATION_TOOLKIT.DESDECRYPT ( input IN RAW, key IN RAW ) RETURN RAW;
DBMS_OBFUSCATION_TOOLKIT.DESDECRYPT ( input_string IN VARCHAR2, key_string IN VARCHAR2 ) RETURN VARCHAR2;
파라미터
파라미터 | 설명 |
---|---|
input, input_string | 복호화할 데이터이다. |
key | 복호화하기 위해 주어진 키 값이다. |
decrypted_data | 복호화된 결과 데이터이다. |
예외 상황
예외 상황 | 설명 |
---|---|
INVALID_ARGUMENT | 파라미터 중 하나라도 NULL인 경우이다. |
INVALID_INPUT | input_data의 길이가 8의 배수가 아닌 경우이다. |
KEY_TOO_SHORT | 키 값의 길이가 8보다 작은 경우이다. |
예제
DECLARE data RAW(256); key RAW(16); encrypted_data RAW(256); decrypted_data RAW(256); BEGIN data := '0102030405AE030D'; key := '0A123B8E002CD3FF'; DBMS_OBFUSCATION_TOOLKIT.DESEncrypt(input => data, key => key, encrypted_data => encrypted_data); data := encrypted_data; DBMS_OBFUSCATION_TOOLKIT.DESDecrypt(input => data, key => key, decrypted_data => decrypted_data); END;
DES 알고리즘을 이용하여 데이터를 암호화하는 프러시저와 함수이다. 암호화를 위해 주어진 키는 반드시 8bytes(64bits)이어야 하며, 그렇지 않으면 예외 상황이 발생한다.
DESENCRYPT 프러시저와 함수의 세부 내용은 다음과 같다.
프로토타입
프러시저
DBMS_OBFUSCATION_TOOLKIT.DESENCRYPT ( input IN RAW, key IN RAW, encrypted_data OUT RAW );
DBMS_OBFUSCATION_TOOLKIT.DESENCRYPT ( input_string IN VARCHAR2, key_string IN VARCHAR2, encrypted_string OUT VARCHAR2 );
함수
DBMS_OBFUSCATION_TOOLKIT.DESENCRYPT ( input IN RAW, key IN RAW ) RETURN RAW;
DBMS_OBFUSCATION_TOOLKIT.DESENCRYPT ( input_string IN VARCHAR2, key_string IN VARCHAR2 ) RETURN VARCHAR2;
파라미터
파라미터 | 설명 |
---|---|
input, input_string | 암호화할 데이터이다. |
key | 암호화하기 위해 주어진 키 값이다. |
encrypted_data | 암호화된 결과 데이터이다. |
예외 상황
예외 상황 | 설명 |
---|---|
INVALID_ARGUMENT | 파라미터 중 하나라도 NULL인 경우이다. |
INVALID_INPUT | input_data의 길이가 8의 배수가 아닌 경우이다. |
KEY_TOO_SHORT | 키 값의 길이가 8보다 작은 경우이다. |
예제
DECLARE data RAW(256); key RAW(16); encrypted_data RAW(256); decrypted_data RAW(256); BEGIN data := '0102030405AE030D'; key := '0A123B8E002CD3FF'; DBMS_OBFUSCATION_TOOLKIT.DESEncrypt(input => data, key => key, encrypted_data => encrypted_data); data := encrypted_data; DBMS_OBFUSCATION_TOOLKIT.DESDecrypt(input => data, key => key, decrypted_data => decrypted_data); END;
임의의 값을 입력 값으로 받아 DES 알고리즘을 위한 키를 생성하는 프러시저와 함수이다.
DESGETKEY 프러시저와 함수의 세부 내용은 다음과 같다.
프로토타입
프러시저
DBMS_OBFUSCATION_TOOLKIT.DESGETKEY ( seed IN RAW, key OUT RAW );
DBMS_OBFUSCATION_TOOLKIT.DESGETKEY ( seed_string IN VARCHAR2, key OUT VARCHAR2 );
함수
DBMS_OBFUSCATION_TOOLKIT.DESGETKEY ( seed IN RAW ) RETURN RAW;
DBMS_OBFUSCATION_TOOLKIT.DESGETKEY ( seed_string IN VARCHAR2 ) RETURN VARCHAR2;
파라미터
파라미터 | 설명 |
---|---|
seed | 80자 이상의 임의의 값이다. |
key | 암호화하기 위해 주어진 키 값이다. |
예외 상황
예외 상황 | 설명 |
---|---|
NO_SEED | seed의 값이 NULL인 경우이다. |
SEED_TOO_SHORT | seed의 길이가 80보다 작은 경우이다. |
예제
DECLARE data VARCHAR2(4096); key VARCHAR2(4096); key_seed VARCHAR2(4096); encrypted_data VARCHAR2(4096); decrypted_data VARCHAR2(4096); BEGIN data := '0102030405AE030D'; key_seed := '1234567890'||'1234567890'||'1234567890'||'1234567890'; key_seed := rpad(key_seed,80); key := dbms_obfuscation_toolkit.DESGetKey(seed_string => key_seed); DBMS_OBFUSCATION_TOOLKIT.DESEncrypt(input_string => data, key_string => key, encrypted_string=> encrypted_data); data := encrypted_data; DBMS_OBFUSCATION_TOOLKIT.DESDecrypt(input_string => data, key_string => key, decrypted_string => decrypted_data); END; /
임의의 값을 입력 값으로 받아 MD5 알고리즘의 checksum을 생성하는 함수이다.
프로토타입
프러시저
DBMS_OBFUSCATION_TOOLKIT.MD5 ( input IN RAW, checksum OUT RAW );
DBMS_OBFUSCATION_TOOLKIT.MD5 ( input_string IN VARCHAR2, checksum_string OUT VARCHAR2 );
함수
DBMS_OBFUSCATION_TOOLKIT.MD5 ( input IN RAW ) RETURN RAW;
DBMS_OBFUSCATION_TOOLKIT.MD5 ( input_string IN VARCHAR2 ) RETURN VARCHAR2;
파라미터
파라미터 | 설명 |
---|---|
input | 임의의 암호화할 값이다. |
checksum | input으로부터 구한 checksum 값이다. |
예외 상황
예외 상황 | 설명 |
---|---|
NO_DATA_PASSED | input의 값이 NULL인 경우이다. |