제21장 DBMS_OBFUSCATION_TOOLKIT

내용 목차

21.1. 개요
21.2. 프러시저와 함수
21.2.1. DES3DECRYPT
21.2.2. DES3ENCRYPT
21.2.3. DES3GETKEY
21.2.4. DESDECRYPT
21.2.5. DESENCRYPT
21.2.6. DESGETKEY
21.2.7. MD5

본 장에서는 DBMS_OBFUSCATION_TOOLKIT 패키지의 기본 개념과 패키지 내의 프러시저와 함수를 사용하는 방법을 설명한다.

DBMS_OBFUSCATION_TOOLKIT은 데이터를 암호화(encryption)하고 복호화(decryption)하는 패키지이다. 이 패키지에서는 데이터의 암호화 및 복호화를 위해 DES(Data Encryption Standard) 또는 3DES(Triple DES) 알고리즘을 이용한다. DES와 3DES 알고리즘은 대칭 키(symmetric key)를 사용하는 알고리즘이다.

알고리즘설명
DES

56bits의 키를 사용하는 알고리즘이다. 그동안 널리 사용되어 왔으나 최근에는 보안성이 보장되지 않아 점차 사용 빈도가 줄어들고 있다.

대칭 키를 사용하는 알고리즘이다.

3DES

하나의 데이터에 DES 알고리즘을 두 번 내지 세 번 반복하여 적용하는 알고리즘이다. 각각 112(56 * 2)bits와 168(56 * 3)bits 키를 사용한다. DES 알고리즘과 마찬가지로 대칭 키를 사용하는 알고리즘이다.

다른 대칭 키를 사용하는 알고리즘에 비해 암호화 및 복호화를 하는 시간이 많이 필요하다는 단점이 있다.

이러한 대칭 키를 사용하는 암호화 알고리즘에서는 키를 안전하게 관리하는 것이 무엇보다 중요하다.

암호화 알고리즘에서 키를 관리하는 방법은 다음과 같다.

  • 데이터베이스에 키를 저장하는 방법

    특정 테이블의 컬럼에 키를 저장하는 방법이다. 이때 키를 저장하는 테이블은 암호화된 데이터 컬럼과 같은 테이블일 수도 있고, 다른 테이블일 수도 있다. 같은 테이블에 키를 저장하는 경우에는 해당 테이블 전체에 대한 액세스 특권을 부여하는 대신 뷰 또는 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
    • 0이면 DES 복호화를 2번 수행한다.

    • 1이면 DES 복호화를 3번 수행한다.

    iv초기화 벡터이다.
  • 예외 상황

    예외 상황설명
    INVALID_ARGUMENT파라미터 중 하나라도 NULL인 경우이다.
    INVALID_INPUTinput_data의 길이가 8의 배수가 아닌 경우이다.
    KEY_TOO_SHORT키 값의 길이가 8보다 작은 경우이다.
    INVALID_DES_MODEwhich 값이 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
    • 0이면 DES 암호화를 2번 수행한다.

    • 1이면 DES 암호화를 3번 수행한다.

    iv초기화 벡터이다.
  • 예외 상황

    예외 상황설명
    INVALID_ARGUMENT파라미터 중 하나라도 NULL인 경우이다.
    INVALID_INPUTinput_data의 길이가 8의 배수가 아닌 경우이다.
    KEY_TOO_SHORT키 값의 길이가 8보다 작은 경우이다.
    INVALID_DES_MODEwhich 값이 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
    • 0이면 DES 복호화를 2번 수행한다.

    • 1이면 DES 복호화를 3번 수행한다.

    seed80자 이상의 임의의 값이다.
    key암호화하기 위해 주어진 키 값이다.
  • 예외 상황

    예외 상황설명
    NO_SEEDseed의 값이 NULL인 경우이다.
    SEED_TOO_SHORTseed의 길이가 80보다 작은 경우이다.
    INVALID_INPUTwhich가 NULL인 경우이다.
    INVALID_DES_MODEwhich의 값이 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_INPUTinput_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_INPUTinput_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;