본문 바로가기

study_IT/기타

Oracle에서 데이터 암호화 및 복호화 구현하기

728x90
반응형

이번 포스트에서는 Oracle 데이터베이스에서 데이터를 안전하게 암호화하고, 필요할 때 이를 복호화하는 방법에 대해 알아보겠습니다. 데이터의 보안은 데이터베이스 응용프로그램에서 매우 중요합니다. Oracle 데이터베이스에서는 DBMS_CRYPTO 및 DBMS_OBFUSCATION_TOOLKIT 패키지를 사용하여 간단하게 데이터를 암호화하고 복호화할 수 있습니다.

 

0. system 계정에서 두 파일 실행

ORACLE_HOME\RDBMS\ADMIN\dbmsobtk.sql
ORACLE_HOME\RDBMS\ADMIN\prvtobtk.plb

 

1. 암호화 함수 및 패키지 생성

먼저, 데이터를 암호화하기 위한 패키지를 생성합니다. 

입력값을 받아 암호화하는 `pkg_crypto` 패키지와, 

DBMS_OBFUSCATION_TOOLKIT 패키지를 사용하여 

암호화하는 `f_Encrypt` 함수, 복호화하는 `f_Decrypt` 함수를 정의합니다.

-- 패키지 생성
CREATE OR REPLACE PACKAGE pkg_crypto

IS

    FUNCTION encrypt ( input_string IN VARCHAR2 ) RETURN RAW;

    FUNCTION decrypt ( input_string IN VARCHAR2 ) RETURN VARCHAR2;

END pkg_crypto;
/
-- 패키지 본문 생성
CREATE OR REPLACE PACKAGE BODY pkg_crypto

IS

    SQLERRMSG   VARCHAR2(255);

    SQLERRCDE   NUMBER;

 

    FUNCTION encrypt (input_string IN VARCHAR2 )

     RETURN RAW

    IS

   

        key_data_raw        RAW(64);

        converted_raw       RAW(64);

        encrypted_raw       RAW(64);

 

    BEGIN


        converted_raw := UTL_I18N.STRING_TO_RAW(input_string , 'AL32UTF8');

        key_data_raw  := UTL_I18N.STRING_TO_RAW(  '12345678' , 'AL32UTF8');


        encrypted_raw := DBMS_CRYPTO.ENCRYPT(  src => converted_raw ,

                                               typ => DBMS_CRYPTO.DES_CBC_PKCS5 ,

                                               key => key_data_raw ,

                                               iv =>  NULL);

       

        RETURN encrypted_raw;

    END encrypt;

 

    FUNCTION decrypt (input_string IN VARCHAR2 )

     RETURN VARCHAR2

    IS

        converted_string    VARCHAR2(64);

        key_data_raw        RAW(64);

        decrypted_raw       VARCHAR2(64);

 

    BEGIN

 

        key_data_raw     := UTL_I18N.STRING_TO_RAW(  '12345678' , 'AL32UTF8');

       

        decrypted_raw := DBMS_CRYPTO.DECRYPT( src => input_string ,

                                              typ => DBMS_CRYPTO.DES_CBC_PKCS5 ,

                                              key => key_data_raw ,

                                              iv =>  NULL);

        converted_string := UTL_I18N.RAW_TO_CHAR(decrypted_raw, 'AL32UTF8');

 

        RETURN converted_string;

    END decrypt ;

END pkg_crypto;

/
-- 사용자 권한 부여
GRANT EXECUTE ON DBMS_CRYPTO TO SCOTT;
GRANT EXECUTE ON DBMS_OBFUSCATION_TOOLKIT TO SCOTT;
-- 사용자계정에서 암호화 함수 생성
CREATE OR REPLACE FUNCTION f_Encrypt (p_Input_str  in varchar2) RETURN VARCHAR2
AS
 v_Input_len number := ROUND(LENGTH(p_Input_str)/8+0.5)*8;
 v_Encrypted_str varchar2(2000) := null;
 v_Key varchar2(16) := 'abcdefgh12345678';
BEGIN
   DBMS_OBFUSCATION_TOOLKIT.DESENcrypt(input_string => RPAD(p_Input_str,
                                       v_Input_len),
                                       key_string => v_Key,
                                       encrypted_string =>v_Encrypted_str);

   RETURN v_Encrypted_str;
END;
-- 사용자 계정에서 복호화 함수 생성
CREATE OR REPLACE FUNCTION f_Decrypt (p_Encrypted_str in varchar2) RETURN VARCHAR2
AS
 v_Key varchar2(16) := 'abcdefgh12345678';
 v_Decrypted_str varchar2(2000);
BEGIN
   DBMS_OBFUSCATION_TOOLKIT.DESDecrypt(input_string => p_Encrypted_str, 
                                     key_string => v_Key,
                                     decrypted_string => v_Decrypted_str);

   RETURN trim(v_Decrypted_str);
END;
/



2. 데이터 암호화 및 테스트

이제 위에서 정의한 함수와 패키지를 사용하여 데이터를 암호화하고 복호화할 수 있습니다.

-- 데이터 암호화 테이블 생성
CREATE TABLE ENC_TEST (ID VARCHAR2(30), PWD VARCHAR2(30));

-- 데이터 암호화 및 삽입
INSERT INTO ENC_TEST (ID, PWD) VALUES ('AAA', f_Encrypt('11223344AABB'));
INSERT INTO ENC_TEST (ID, PWD) VALUES ('BBB', f_Encrypt('QWER1232'));
COMMIT;

-- 암호화된 데이터 조회
SELECT * FROM ENC_TEST;

-- 데이터 복호화 및 조회
SELECT ID, f_Decrypt(PWD) FROM ENC_TEST;


이제 데이터베이스에 저장된 데이터는 암호화되어 안전하게 보호됩니다. 복호화가 필요한 경우에는 정의한 복호화 함수를 사용하여 데이터를 원래 형태로 복구할 수 있습니다.

728x90
반응형