* DES 소개

Data의 보안을 위한 encryption과 decryption의 방법론이 여러가지 소개 되었다. data가 처리해야 하는 프로세스는 data를 생성 또는 획득하여 이를 저장하거나 전송하는 과정에서의 보안을 위해 이를 Encryption하고, 저장된 data를 읽거나 전송을 받는 프로세스가 이를 다시 Decryption하게 된다.

 

– DES

DES는 1974년 IBM에 의해 제안되었다. data를 주어진 key로 암호화하고, 암호화 된 data(Ciphertext)는 다시 동일한 key를 이용하여 해독 할 수 있는 구조이다. DES는 8 byte의 data를 56bit의 key로  encrypt한다.

 

– Triple DES (DES3)

DES3는 기술력의 발달로 인해 DES가 더 이상 안전하지 않아 짐으로 새로 제시된 표준이다. 실제 DES는 1998년에 나온 DES Cracker로   3일 이내에 해독 되어진다. 전용장비등을 이용할 경우 key를 찾아 내는데 3.5시간이내의 시간이 소요되는 등 더 이상 안전한 방법이 아니다.   DES3는 DES와 크게 다르지 않으며, 192bit의 key를 사용한다.

원리는 다음과 같다.

C = Ek3(Dk2(Ek1(P)))

E is DES Encryption round

D is DES Decryption round

P is the plaintext

C is the ciphertext

즉, 56bit의 키로 encrypt하고, 이를 다시 56bit의 key로 decrypt 해서, 나머지 56bit key로 다시 encrypt한다.

기존의 DES의 56bit의 key보다 192bit key를 사용함으로 key를  generation해서 해독해 내는 것을 보다 어렵게 한다.

 

– Cipher Block Chaining(CBC) and Initialization Vector(IV)

암호화 대상의 data의 이전 8 byte의 내용이 다음 8byte의 암호화 에 영향을 준다. 원리는 다음과 같다.

C = Ek3(Dk2(Ek1(P Xor (PC or IV))))

PC is ciphertext from previous 8 bytes.

IV is Initialization Vector.

만약 encrypt하고자 하는 data가 처음 8 bytes라면 이전에 암호화 한 data가 없음으로 이때는 주어진 8 bytes의 값을 이용하는데 이를 Initialization Vector(IV)라고 한다.

 

* DBMS_OBFUSCATION_TOOLKIT 구조.

 

– Oracle은 Oracle8 8.1.6 이후 버전에서 DBMS_OBFUSCATION_TOOLKIT   package를 통해 DES 기능을 제공하고 있다.

package에서 제공되어지는 procedure와 function은 다음과 같다.

 

DESENCRYPT, DES3ENCRYPT

DESDECRYPT, DES3DECRYPT

 

위에 나열한 이름은 모두 procedure와 function으로, argument에는  RAW와 varchar2로 overload되어있어 필요에 따라 사용 할 수 있다.

 

– 8.1.6은 DES3를 지원하지 않는다.

필요시에는 DES를 이용하여 직접 구현하여야 한다.

 

– argument는 RAW와 VARCHAR2를 모두 사용가능하나 혼용하여 사용할 수 없으며, value는 반드시 8 byte의 배수이어야 한다.

 

– Oracle은 2 key(128bit)과 3 key(192bit) 방식 모두를 지원한다.

 

– Oracle은 IV로 고정된 값인 ‘0123456789ABCDEF’를 사용한다.

 

– key는 반드시 다음에 제시되는 크기로 사용되어져야 한다.

DES  : 64bit(8 bytes)

DES3 : 128bit(16 bytes) or 192bit(24 bytes)

실제 사용되는 56bit(또는 112, 168bit)보다 큰 key를 넘기는 이유는 encrypt, decrypt과정에서 key에서 일부 bit를 버리기 때문이다.

 

– 사용되어지는 key가 필요한 값보다 많을 경우, 필요한 bit 이상은 무시된다. 예를 들어 DES에 9 bytes의 key를 넘기에 되면 9번째 byte는 무시된다.

 

– Oracle은 DBMS_OBFUSCATION_TOOLKIT을 autonomous transaction에 서 사용하는 것을 허용하지 않는다.

 

* Error code 소개.

ORA-28231 : plaintext(input value)가 NULL.

ORA-28232 : plaintext의 길이가 8의 배수가 되지 못하는 경우.

ORA-28233 : plaintext가 아닌 ciphertext가 encrypt시도될 경우.

즉, encrypt한 후 다시 encrypt하려 할 경우 발생.  ORA-28234 : key length가 요구되는 것보다 적다.

 

 

* Sample

==============================================================

-- enc.sql

set serveroutput on

declare

        temp1 raw(2048);

        key1 raw(2048);

        cipher1 raw(2048);

begin

        temp1 := utl_raw.cast_to_raw('abcdefghijklmnop');

        key1 := utl_raw.cast_to_raw('qazxswedcvfrtgbnhyujm,ki');

        dbms_obfuscation_toolkit.des3encrypt(

                input=>temp1,

                key=>key1,

                encrypted_data=>cipher1,

                which=>1      -- 3 key used.

        );

        dbms_output.put_line(

                'INPUT DATA : ['

                || utl_raw.cast_to_varchar2(temp1)

                || ']'

        );

        dbms_output.put_line(

                'OUTPUT(HEX) ['

                || cipher1

                || ']'

        );

end;

/

==============================================================

-- dec.sql

set serveroutput on

declare

        cipher1 raw(2048);

        key1 raw(2048);

        plaintext1 raw(2048);

begin

        cipher1 := hextoraw('A4E7E8FBE8C6A2D79832D8F4214F0D0F');

        key1 := utl_raw.cast_to_raw('qazxswedcvfrtgbnhyujm,ki');

        dbms_obfuscation_toolkit.des3decrypt(

                input=>cipher1,

                key=>key1,

                decrypted_data=>plaintext1,

                which=>1      -- 3 key used.

        );

        dbms_output.put_line(

                'Encrypted DATA : ['

                || cipher1

                || ']'

        );

        dbms_output.put_line(

                'Original data ['

                || utl_raw.cast_to_varchar2(plaintext1)

                || ']'

        );

end;

/

==============================================================

SQL> @enc

INPUT DATA : [abcdefghijklmnop]

OUTPUT(HEX) [A4E7E8FBE8C6A2D79832D8F4214F0D0F]

PL/SQL procedure successfully completed.

SQL> @dec

Encrypted DATA : [A4E7E8FBE8C6A2D79832D8F4214F0D0F]

Original data [abcdefghijklmnop]

PL/SQL procedure successfully completed.

==============================================================

 

* DES 사용에 따른 고려 사항.

– key의 저장 문제.

사실상 encrypt된 data는 key가 노출 될 경우 모든 data가 노출 된 것과 같다. 따라서 key를 어떻게 저장하느냐가 중요한 문제이 다.

만약 PL/SQL을 사용하는 경고, module에 key를 직접 포함 할 경우  DBA권한을 갖는 자는 쉽게 이를 확인 할 수 있어, key의 노출이 쉽다. 따라서 PL/SQL로 작성할 경우 반드시 wrap 처리를 하여  source가 보이지 않도록 할 필요가 있다.

이 외에, 사용자가 필요에 따라 직접 입력하게 하는 방법과, OS의 파일등을 이용하여 저장하여 놓는 방법이 있으며, 모두 장단점이 있다.

 

– 보다 높은 보안을 위해 실제 data 앞에 8 byte의 random text 를 추가하는 방법.

Oracle은 IV를 고정된 값으로 사용하고 있으며, 다른 가변적으로 지정을 할 수 있다하더라도 같은 data를 encrypt하며 항상 같은 ciphertext를 얻을 수 밖에 없다. 이를 악의를 갖고 data를  access하고자 하는 자에게 data의 특성을 추측하게 할 수 있는 요소가 될 수 있다.

따라서 실 data 앞 8 byte를 random data로 추가해서 DES3로 처리 할 경우 같은 data라 하더라도 매 번 다른 ciphertext를 얻을 수 있어, 분석을 어렵게 할 수 있다.

 

* 경고 : ciphertext간의 비호환 문제.

 

– platform간의 ciphertext간의 비 호환.

DBMS_OBFUSCATION_TOOLKIT의 초기 버전에는 CPU의 type에 따라  ciphertext가 서로 호환되지 않는다는 문제점이 발견 되었다. 이로 인해, Solaris box에서 encrypt된 것은 NT에서 decrypt할 경우 엉뚱한 결과가 나올 수 있다.

 

– Oracle Version에 따른 비 호환 (upgrade 포함)

동일 platform이라 하더라도 Oracle8i와 Oracle9i간의 ciphertext는 서로 호환되지 않을 수 있다. 이는 위에서 언급한 장비간 호환 문제를 해결하면서 DES 구현이 Oracle9i에서 변경되어 Oracle8i에서 encrypt된 data가 Oracle9i에서 decrypt 불가능 할 수 있다.

 

– DES의 IV(initialization value) 고정으로 인한 비 호환

Oracle은 IV를 고정된 값으로 사용하고 있어, Oracle이 아닌 3RD party module을 이용하여 IV를 지정하고 encrypt할 경우 decrypt가 불가능 하다. 이 문제로 인해 내부적인 data의 encrypt와 decrypt 는 지장받지 않으나, client 모듈등에서 직접 DES3를 처리 할 경우 호환성이 떨어지게 된다.

이 문제는 9.2.0.2에서 IV를 지원하도록 하여 해결 하였다.

 

* 권고사항 및 주의사항

cipher를 access하는 범주에 따라 실제 DESEncrypt와   DESDecrypt 를 어디서 수행하느냐가 결정되어져야 한다. 예를 들어 data를 access하는 client가 다양하고 모두가 client에게 cipher를 그대로 넘겨주어 client가 직접 이를 decrypt하게 할 것인지, 아니면 data

base내부와 client가 이를 분할 하여 담당 할지가 결정되어져야 한 다. 유일한 module을 두어 encrypt와 decrypt를 담당하도록 하는것 도 하나의 방법이 될 수 있다.

Oracle에서 제공하는 DBMS_OBFUSCATION_TOOLKIT은 8.1.6에 최초 제공되어지고, platform간 및 standard와의 호환성 향상 및 기능의 추가로 인해 버전간의 호환성을 보장 할 수 없다. 따라서, 한  instance내에서만 access되어지는 data로 국한할 필요가 있다.

적용하고자 하는 Oracle version이 Oracle8.1.x인 경우 Oracle9으로 upgrade 할 경우 기존에 저장한 cipher가 호환되지 않을 수 있 음을 염두해야 한다.

 

 

 

* References

– Oracle9i Supplied PL/SQL Packages and Types Reference  (Part No. A96612-01)

– Note 166884.1

– Note 102902.1

@ BUG 1411221

@ BUG 2127974

By haisins

오라클 DBA 박용석 입니다. haisins@gmail.com 으로 문의 주세요.

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다