제7장 DBMS_CRYPTO

내용 목차

7.1. 개요
7.2. 암호화/복호화 알고리즘 및 체인, 패딩
7.3. 해시 알고리즘
7.4. 프러시저와 함수
7.4.1. DECRYPT
7.4.2. ENCRYPT
7.4.3. HASH
7.4.4. MAC
7.4.5. RANDOMBYTES

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

DBMS_CRYPTO은 데이터 암복호화 및 인증 등에 쓰이는 해시 알고리즘을 제공하는 패키지이다. 이 패키지의 암복호화 알고리즘들은 모두 키를 사용하는데, 이와 같이 키를 사용하는 암호화 알고리즘에서는 키를 안전하게 관리하는 것이 무엇보다 중요하다. 암호화 알고리즘에서 키를 관리하는 방법은 DBMS_OBFUSCATION_TOOLKIT을 참고한다.

해시 알고리즘은 임의의 길이의 데이터를 고정길이의 해시값으로 변환한다.

DBMS_CRYPTO은 데이터의 암호화 및 복호화를 위해 DES(Data Encryption Standard), 3DES(Triple DES), AES(Advanced Encryption Standard) 등의 더욱 다양한 알고리즘 및 블록 패딩 방식을 지원하고 있다. DBMS_OBFUSCATION_TOOLKIT보다 많은 종류의 알고리즘을 사용하므로, 이 패키지를 사용할 것을 권장한다.

각 알고리즘, 체인, 패딩 방식은 아래와 같다.

  • 알고리즘

    알고리즘설명
    DES64bits의 블록 단위로 나누어 각각을 56bits의 키를 사용하는 알고리즘이다. 그동안 널리 사용되어 왔으나 최근에는 보안성이 보장되지 않아 점차 사용 빈도가 줄어들고 있다. 대칭 키를 사용하는 알고리즘이다.
    3DES

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

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

    AES128bits의 블록 단위로 나누어 각각을 128, 192 또는 256bits의 키를 사용하는 알고리즘이다. DES 방식보다 강력한 알고리즘으로 설계되었으며, 사실상 암호화 표준으로 자리 잡을 것으로 보인다.
    RC4

    RSA 보안을 위해 로널드 라이베스트가 만든 스트림 암호화 방식으로, 무작위 치환에 기반을 두고 있다. 바이트 단위 연산을 하기 때문에 비트 단위 연산을 하는 다른 스트림 암호화에 비해 속도가 빠르다.

    SSL/TLS(Secure Sockets Layer / Transport Layer Security) 및 무선랜 표준 IEEE 802.11 WEP(Wired Equivalent Privacy) 프로토콜 등에서 사용된다.

    ARIA

    대한민국의 국가보안기술연구소에서 개발한 블록 암호화 알고리즘으로, AES처럼 128bits의 블록 단위로 나누어 각각을 128, 192 또는 256bits의 키를 사용한다.

    Involutional SPN 구조를 갖기 때문에 경량 환경 및 하드웨어 구현에 최적화되어 있다.

  • 체인(chaining) 방식

    체인 방식설명
    ECB(Electronic Codebook)각 원본 데이터 블록들이 각각 별개로 암호화된다.
    CBC(Cipher Block Chaining)

    현재 블록이 바로 앞에 암호화된 블록의 데이터와 XOR 연산을 거친 후 암호화된다.

    ECB 방식에서처럼 동일한 원본이 있을 경우 동일한 암호문이 생성되는 위험을 방지하기 위함이다.

    CFB(Cipher-Feedback)

    CBC와 유사하지만, 비트 단위로 암호화하면서 쉬프트시키는 방식으로, 스트림 암호화 방식에 가깝다.

    그러므로 블록 크기보다 작은 단위의 데이터의 암호화도 가능해진다.

    OFB(Output-Feedback)

    블록 암호가 동기화된 스트림 암호처럼 동작하게 한다.

    CFB와 유사하지만, 다음 블록을 위한 키배열 조합에 있어서 현재 블록의 암호문이 영향을 끼치지 않으므로, 현재 블록 암호화에서 오류가 발생해도 다음 블록에 영향을 끼치지 않는 장점이 있다.

  • 패딩(padding) 방식

    패딩 방식설명
    PKCS5PKCS #5(Password-Based Cryptography Standard) 표준에 따르는 패딩 방식이다.
    NONE패딩을 사용하지 않는다. 이러할 경우 데이터가 단위 블록의 크기(128bits)의 배수가 아니면 암호화가 불가능하여 에러를 리턴하므로, 반드시 데이터의 크기를 확인해야 한다.
    ZERO마지막 블록의 남는 바이트들을 0으로 채운다. 문자열과 같이 0의 값으로 끝을 체크하는 데이터에만 사용해야 한다.

DBMS_CRYPTO은 임의의 길이의 데이터를 고정 길이의 해시값으로 변환하는데, 해시값을 만드는 것은 쉽지만, 해시값을 원래의 데이터로 복원하는 일은 지극히 어렵게 함으로써, 데이터의 안전성을 보장한다.

데이터 변경 여부 체크 및 암호 인증 등 인증(authentication) 작업에 주로 사용된다.

MD4, MD5, SHA-1, SHA-2을 통해 더욱 다양한 알고리즘 및 블록 패딩 방식을 지원하고 있다. 각 알고리즘은 아래와 같다.

알고리즘설명
MD5(Message Digest 5)

입력 데이터(길이에 상관없는 하나의 메시지)로부터 128bits 메시지 축약을 만듦으로써 데이터 무결성을 검증하는 데 사용되는 알고리즘이다.

MD4의 확장판인데, MD4에 비해 속도가 빠르지는 않지만, 데이터 보안성에 있어 더 많은 확신을 제공한다.

MD4(Message Digest 4)MD4는 MD5의 초기 버전으로서, 입력 데이터(길이에 상관없는 하나의 메시지)로부터 128bits 메시지 축약을 만듦으로써 데이터 무결성을 검증하는데 사용되는 알고리즘이다.
SHA-1(Secure Hash Algorithm 1)

SHA는 미국 NIST에 의해 개발된 SHS(Secure Hash Standard) 내에 정의된 알고리즘으로, 길이 264bits 이하의 메시지를 160bits 길이의 축약된 메시지로 만들어낸다.

MD5보다는 다소 느리지만, 대규모 메시지 요약들이 폭력적 충돌 및 도치 공격을 받을 때 좀 더 안전하게 지켜준다.

SHA-2(Secure Hash Algorithm 2)

SHA-2는 SHA-1을 대체하는 해시 암호이다.

해시 함수에서 사용하는 byte 수에 따라, SHA-224, SHA-256, SHA-384, SHA-512이 있고, Tibero에서는 SHA-256, SHA-384, SHA-512을 지원한다.

본 절에서는 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;
    • 프러시저

      DBMS_CRYPTO.DECRYPT
      (
          dst                 IN OUT NOCOPY   BLOB,
          src                 IN              BLOB,
          cipher_type         IN              PLS_INTEGER,
          key                 IN              RAW,
          init_vector         IN              RAW          DEFAULT NULL
      );
      DBMS_CRYPTO.DECRYPT
      (
          dst                 IN OUT NOCOPY   CLOB,  
          src                 IN              BLOB,  
          cipher_type         IN              PLS_INTEGER,
          key                 IN              RAW,
          init_vector         IN              RAW          DEFAULT NULL
      );
  • 파라미터

    파라미터설명
    dst복호화된 데이터이다.
    src복호화할 데이터이다.
    cipher_type사용할 암호화 알고리즘, 체인, 패딩 기법이다.
    key복호화하기 위해 주어진 키 값이다.
    init_vector초기화 벡터이다. NULL이면 0으로 채워진 초기화 벡터를 사용한다.
  • 반환값

    복호화된 데이터이다.

  • 예외 상황

    예외 상황설명
    INVALID_ARGUMENT파라미터 중 하나라도 NULL인 경우이다.
    INVALID_NTH_ARGUMENTcipher_type 값이 잘못 설정된 경우이다.
    INVALID_INPUTinput_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;
      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;
    • 프러시저

      DBMS_CRYPTO.ENCRYPT
      (
          dst                 IN OUT NOCOPY   BLOB,
          src                 IN              BLOB,
          cipher_type         IN              PLS_INTEGER,
          key                 IN              RAW,
          init_vector         IN              RAW          DEFAULT NULL
      );
      DBMS_CRYPTO.ENCRYPT
      (
          dst                 IN OUT NOCOPY   BLOB,
          src                 IN              CLOB,
          cipher_type         IN              PLS_INTEGER,
          key                 IN              RAW,
          init_vector         IN              RAW          DEFAULT NULL
      );
  • 파라미터

    • 함수

      파라미터설명
      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;
    • 프러시저

      파라미터설명
      dst암호화된 데이터이다.
      src암호화할 데이터이다.
      cipher_type사용할 암호화 알고리즘, 체인, 패딩 기법이다.
      key암호화하기 위해 주어진 키 값이다.
      init_vector초기화 벡터이다. NULL이면 0으로 채워진 초기화 벡터를 사용한다.
  • 반환값

    암호화된 데이터이다.

  • 예외 상황

    예외 상황설명
    INVALID_ARGUMENT파라미터 중 하나라도 NULL인 경우이다.
    INVALID_NTH_ARGUMENTcipher_type 값이 잘못 설정된 경우이다.
    INVALID_INPUTZERO 패딩 방식일 때 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;