Oracle

데이터베이스 암복호화 - 오라클 DB 컬럼 암호화/복호화 패키지 사용 방법

긋대디 2025. 2. 4. 00:50

오라클에서 특정 컬럼의 값을 암호화 또는 복호화 하는 알고리즘을 적용한 암/복호화 패키지 함수 등록 방법.

먼저, 암호화 패키지를 적용하여야 한다.

1. 암호화 패키지 추가

오라클 계정으로 접속하여

SQLPLUS로 접속하여 실행

오라클이 설치된 경로의 하위에서 아래 패키지 검색하여 실행

@$ORACLE_HOME/rdbms/admin/dbmsobtk.sql

@$ORACLE_HOME/rdbms/admin/prvtobtk.plb

# su - oracle
# sqlplus / as sysdba
SQL> @$ORACLE_HOME/rdbms/admin/dbmsobtk.sql;
SQL> @$ORACLE_HOME/rdbms/admin/prvtobtk.plb;

 

2. 사용자 암호화 패키지 사용 권한 추가

SYSTEM 권한으로 추가 사용자에게 권한 추가

 

GRANT EXECUTE ON DBMS_CRYPTO TO SCOTT;
GRANT EXECUTE ON DBMS_OBFUSCATION_TOOLKIT TO SCOTT;

 

3. 암호화 패키지 생성

패키지 헤더

CREATE OR REPLACE PACKAGE SCOTT.CRYPTO
IS
    output_string VARCHAR2(4000); -- 암호화/복호화된 문자열
    encrypted_raw RAW(2000); -- 암호화된 RAW타입 데이터
    decrypted_raw RAW(2000); -- 복호화된 RAW타입 데이터
    key_string    CHAR(32) := '22080211208021320200008021080214'; -- 32 암호화 임의 키
    key_bytes_raw RAW (32) := UTL_RAW.CAST_TO_RAW(CONVERT(key_string,'AL32UTF8','US7ASCII')); -- 256BIT 암호화 KEY
    
    encryption_type PLS_INTEGER :=
                DBMS_CRYPTO.ENCRYPT_AES256
              + DBMS_CRYPTO.CHAIN_CBC
              + DBMS_CRYPTO.PAD_PKCS5; -- 암호화 알고리즘 선언
    
    decryption_type PLS_INTEGER :=
                DBMS_CRYPTO.ENCRYPT_AES256
              + DBMS_CRYPTO.CHAIN_CBC
              + DBMS_CRYPTO.PAD_PKCS5; -- 복호화 알고리즘 선언

    /***************************************************
    * 암호화
    ***************************************************/
    FUNCTION ENCRYPT_AES(input_string IN VARCHAR2)
    RETURN VARCHAR2;

    /***************************************************
    * 복호화
    ***************************************************/
    FUNCTION DECRYPT_AES(input_string IN VARCHAR2)
    RETURN VARCHAR2;

END CRYPTO;

 

패키지 BODY


CREATE OR REPLACE PACKAGE BODY SCOTT.CRYPTO
IS

    FUNCTION  ENCRYPT_AES(input_string  IN      VARCHAR2)
    RETURN VARCHAR2
    IS
    BEGIN
  
        encrypted_raw := DBMS_CRYPTO.ENCRYPT(
          SRC => UTL_I18N.STRING_TO_RAW(input_string, 'AL32UTF8')
        , TYP => encryption_type
        , KEY => key_bytes_raw
        );
        
        output_string := RAWTOHEX(encrypted_raw);
    
        RETURN output_string;
    
    -- Exception 
    EXCEPTION
      WHEN OTHERS THEN
        DBMS_OUTPUT.ENABLE;
        DBMS_OUTPUT.PUT_LINE('EXCEPTION : ' || SQLERRM);
        DBMS_OUTPUT.DISABLE;
    RETURN '__error__';
    END;


    FUNCTION  DECRYPT_AES(input_string  IN      VARCHAR2)
    RETURN VARCHAR2
    IS
    BEGIN
  
        decrypted_raw := DBMS_CRYPTO.DECRYPT(
          SRC => HEXTORAW(input_string)
        , TYP => decryption_type
        , KEY => key_bytes_raw
        );
        
        output_string := CONVERT(UTL_RAW.CAST_TO_VARCHAR2(decrypted_raw),'US7ASCII','AL32UTF8');
        RETURN output_string;
    
    -- Exception 
    EXCEPTION
      WHEN OTHERS THEN
        DBMS_OUTPUT.ENABLE;
        DBMS_OUTPUT.PUT_LINE('EXCEPTION : ' || SQLERRM);
        DBMS_OUTPUT.DISABLE;
    RETURN '__error__';
    END;

END CRYPTO;
 

 

4. 암호화 테스트

암호화하여 나온 값을 복호화로 테스트

-- 암호화
SELECT CRYPTO.ENCRYPT_AES('TEST1234') FROM DUAL;
-- 복호화
SELECT CRYPTO.DECRYPT_AES('542A9634ECBB8336C73CC28A37E065D8') FROM DUAL;