내용 목차
본 장에서는 DBMS_CRYPTO 패키지의 기본 개념과 패키지 내의 프러시저와 함수를 사용하는 방법을 설명한다.
DBMS_CRYPTO은 데이터 암복호화 및 인증 등에 쓰이는 해시 알고리즘을 제공하는 패키지이다. 이 패키지의 암복호화 알고리즘들은 모두 키를 사용하는데, 이와 같이 키를 사용하는 암호화 알고리즘에서는 키를 안전하게 관리하는 것이 무엇보다 중요하다. 암호화 알고리즘에서 키를 관리하는 방법은 DBMS_OBFUSCATION_TOOLKIT을 참고한다.
해시 알고리즘은 임의의 길이의 데이터를 고정길이의 해시값으로 변환한다.
DBMS_CRYPTO은 데이터의 암호화 및 복호화를 위해 DES(Data Encryption Standard), 3DES(Triple DES), AES(Advanced Encryption Standard) 등의 더욱 다양한 알고리즘 및 블록 패딩 방식을 지원하고 있다. DBMS_OBFUSCATION_TOOLKIT보다 많은 종류의 알고리즘을 사용하므로, 이 패키지를 사용할 것을 권장한다.
각 알고리즘, 체인, 패딩 방식은 아래와 같다.
알고리즘
체인(chaining) 방식
패딩(padding) 방식
DBMS_CRYPTO은 임의의 길이의 데이터를 고정 길이의 해시값으로 변환하는데 해시값을 만드는 것은 쉽지만 해시값을 원래의 데이터로 복원하는 일은 지극히 어렵게 함으로써 데이터의 안전성을 보장한다. 데이터 변경 여부 체크 및 암호 인증 등 인증(authentication) 작업에 주로 사용된다.
MD4, MD5, SHA-1, SHA-2를 통해 더욱 다양한 알고리즘 및 블록 패딩 방식을 지원하고 있다. 각 알고리즘은 아래와 같다.
본 절에서는 DBMS_CRYPTO 패키지에서 제공하는 프러시저와 함수를 알파벳 순으로 설명한다.
사용자가 명시한 암호화 알고리즘 및 체인, 패딩 기법을 이용하여 암호화된 데이터를 복호화하는 함수이다.
주어진 알고리즘에 맞는 키의 크기와 블록의 크기를 설정해야 올바르게 동작한다. 알고리즘 각각에 따른 키의 크기와 블록의 크기는 위의 표에 언급되어 있으니 참고한다.
DECRYPT 프러시저와 함수의 세부 내용은 다음과 같다.
프로토타입
DBMS_CRYPTO.DECRYPT ( src IN RAW, cipher_type IN PLS_INTEGER, key IN RAW, init_vector IN RAW DEFAULT NULL ) RETURN RAW;
파라미터
파라미터 | 설명 |
---|---|
src | 복호화할 데이터이다. |
cipher_type | 사용할 암호화 알고리즘, 체인, 패딩 기법이다. |
key | 복호화하기 위해 주어진 키 값이다. |
init_vector | 초기화 벡터이다. NULL이면 0으로 채워진 초기화 벡터를 사용한다. |
반환값
복호화된 데이터이다.
예외 상황
예외 상황 | 설명 |
---|---|
INVALID_ARGUMENT | 파라미터 중 하나라도 NULL인 경우이다. |
INVALID_NTH_ARGUMENT | cipher_type 값이 잘못 설정된 경우이다. |
INVALID_INPUT | input_data의 길이가 8의 배수가 아닌 경우이다. |
KEY_TOO_SHORT | 키 값의 길이가 필요한 크기보다 작은 경우이다. |
예제
DECLARE data RAW(256); key RAW(16); encrypted_data RAW(256); decrypted_data RAW(256); iv RAW(256); BEGIN data := '0102030405AE030D0102030405AE030D'; key := '0A123B8E002CD3FFA021B3E800C23DFF'; iv := '00000000000000000000000000000000'; encrypted_data := DBMS_CRYPTO.ENCRYPT( src => data, cipher_type => DBMS_CRYPTO.ENCRYPT_AES128 + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_PKCS5, key => key, init_vector => iv); encrypted_data := DBMS_CRYPTO.DECRYPT( src => encrypted_data, cipher_type => DBMS_CRYPTO.ENCRYPT_AES128 + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_PKCS5, key => key, init_vector => iv); END;
사용자가 명시한 암호화 알고리즘 및 체인, 패딩 기법을 이용하여 데이터를 암호화하는 함수이다.
주어진 알고리즘에 맞는 키의 크기와 블록의 크기를 설정해야 올바르게 동작한다. 알고리즘 각각에 따른 키의 크기와 블록의 크기는 위의 표에 언급되어 있으니 참고한다.
ENCRYPT 프러시저와 함수의 세부 내용은 다음과 같다.
프로토타입
DBMS_CRYPTO.ENCRYPT ( src IN RAW, cipher_type IN PLS_INTEGER, key IN RAW, init_vector IN RAW DEFAULT NULL ) RETURN RAW;
파라미터
파라미터 | 설명 |
---|---|
src | 암호화할 데이터이다. |
cipher_type | 사용할 암호화 알고리즘, 체인, 패딩 기법이다. |
key | 암호화하기 위해 주어진 키 값이다. |
init_vector | 초기화 벡터이다. NULL이면 0으로 채워진 초기화 벡터를 사용한다. |
반환값
암호화된 데이터이다.
예외 상황
예외 상황 | 설명 |
---|---|
INVALID_ARGUMENT | 파라미터 중 하나라도 NULL인 경우이다. |
INVALID_NTH_ARGUMENT | cipher_type 값이 잘못 설정된 경우이다. |
INVALID_INPUT | ZERO 패딩 방식일 때 input_data의 길이가 블록 크기의 배수가 아닌 경우이다. |
KEY_TOO_SHORT | 키 값의 길이가 필요한 크기보다 작은 경우이다. |
예제
DECLARE data RAW(256); key RAW(16); encrypted_data RAW(256); decrypted_data RAW(256); iv RAW(256); BEGIN data := '0102030405AE030D0102030405AE030D'; key := '0A123B8E002CD3FFA021B3E800C23DFF'; iv := '00000000000000000000000000000000'; encrypted_data := DBMS_CRYPTO.ENCRYPT( src => data, cipher_type => DBMS_CRYPTO.ENCRYPT_AES128 + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_PKCS5, key => key, init_vector => iv); END;
사용자가 명시한 알고리즘을 이용하여 임의의 길이의 데이터를 고정길이의 해시값으로 변환하는 함수이다.
프로토타입
DBMS_CRYPTO.HASH ( src IN RAW, hash_type IN PLS_INTEGER ) RETURN RAW;
DBMS_CRYPTO.HASH ( src IN BLOB, hash_type IN PLS_INTEGER ) RETURN RAW;
DBMS_CRYPTO.HASH ( src IN CLOB, hash_type IN PLS_INTEGER ) RETURN RAW;
파라미터
파라미터 | 설명 |
---|---|
src | 원본 데이터이다. |
hash_type | 사용할 해시 알고리즘이다. 다음은 사용 가능한 해시함수 알고리즘 상수이다. hash_md4 CONSTANT PLS_INTEGER := 1; hash_md5 CONSTANT PLS_INTEGER := 2; hash_sh1 CONSTANT PLS_INTEGER := 3; hash_sh256 CONSTANT PLS_INTEGER := 4; hash_sh384 CONSTANT PLS_INTEGER := 5; hash_sh512 CONSTANT PLS_INTEGER := 6; |
예외 상황
예외 상황 | 설명 |
---|---|
INVALID_ARGUMENT | 파라미터 중 하나라도 NULL인 경우이다. |
INVALID_NTH_ARGUMENT | hash_type 값이 잘못 설정된 경우이다. |
예제
DECLARE input varchar2(100); hash_val raw(20); BEGIN input := 'DBMS_CRYPTO.HASH 테스트'; hash_val := DBMS_CRYPTO.HASH( src => utl_raw.cast_to_raw(input), hash_type => DBMS_CRYPTO.HASH_SH1); END;