본문 바로가기
  • 노란색 세상은 어디에 있을까?
  • 봄이 오면 여기에 있겠지.
  • 잠시나마 유유자적 하겠네.
오라클/패키지(시스템관리)

[ 암복호화 ] sys_crypto_api 패키지를 생성합니다.

by 태백성 2024. 4. 12.
create or replace package bsys.sys_crypto_api
is
    /* ********************************************************************************************
       * [암복호화-옵션1] 암호화 알고리즘
       * ------------------------------------------------------------------------------------------
       * des: 64 bit의 블록 단위로 나누어 각각을 56 bit의 키를 사용하는 대칭키 알고리즘.
       *      보안성이 보장되지 않아 사용빈도 줄어드는 추세다
       * 3des: des 알고리즘을 2~3번 반복하여 적용한다. 각각 112(562)bit와 168(563)bit 키를 사용하는 대칭키 알고리즘이며
       *       타 대칭키 알고리즘에 비해 암/복호화를 하는 시간이 많이 필요함
       * aes: 128 bit의 블록 단위로 나누어 각각을 128, 192, 혹은 256 bit의 키를 사 용하는 알고리즘
       *      des 방식보다 강력한 알고리즘으로 설계되아 암호화 표준으로 자리 잡음
       * ------------------------------------------------------------------------------------------
       * [암복호화-옵션2] 체인 방식
       * ------------------------------------------------------------------------------------------
       * ecb(electronic codebook): 각 원본 데이터 블록들 각각 별개로 암호화
       * cbc(cipher block chaining): 현재 블록이 바로 앞에 암호화된 블록의 데이터와 xor 연산 후 암호화
       *                             (ecb 방식처럼 동일한 원본이 있을 경우 동일 암호문 생성 방지)
       * cfb(cipher feedback): 비트단위로 암호화하면서 시프트 시키는 방식으로 스트림 암호화 방식에 가깝다
       *                       블록크기보다 작은 단위의 데이터 암호화 가능
       * ofb(output feedback): 블록 암호가 동기화된 스트림 암호처럼 동작하게 함
       *                       cfb와 유사하지만 다음 블록을 위한 키배열 조합에 있어서 현재 블록의 암호문이 영향을 끼치지 않는 장점
       * ------------------------------------------------------------------------------------------
       * [암복호화-옵션3] 패딩 방식
       * ------------------------------------------------------------------------------------------
       * pkcs5: pkcs #5(password-based cryptography standard) 표준 방식
       * none: 패딩 미사용. 데이터가 단위블록의 크기(128bit)의 배수가 아니면 암호화 불가하므로 데이터의 크기를 확인해야 함
       * zero: 마지막 블록의 남는 바이트들을 0으로 채움.문자열과 같이 0의 값으로 끝을 체크하는 데이터에만 사용해야 함
    ******************************************************************************************** */

    -- 고정변수 선언
    c_package_name           constant varchar2(0200) default 'sys_crypto_api';
    c_key_data               constant varchar2(0016) default 'Built1Secure12!@';              -- 암/복호화를 위한 지갑(wallet) 키데이터
    c_key_raw                constant raw(16)        default utl_raw.cast_to_raw(c_key_data); -- 평문 암호화키 raw 타입으로 변환
    c_aes_cbc_pkcs5          constant pls_integer := dbms_crypto.encrypt_aes128               -- aes 알고리즘
                                                   + dbms_crypto.chain_cbc                    -- cbc 체인
                                                   + dbms_crypto.pad_pkcs5;                   -- pkcs5 패딩방식

    -- 프로시저 및 펑션
    function encrypt_f
        (pi_input_string               in     varchar2
        ) return raw;

    function decrypt_f
        (pi_input_string               in     varchar2
        ) return varchar2;

end sys_crypto_api;

 

create or replace package body bsys.sys_crypto_api
    /* ********************************************************************************************
       * 업 무  단 위 : 시스템관리
       * 패   키   지 : bsys.sys_crypto_api
       * 사 용  목 적 : 암호화 및 복호화 패키지
       * 생 성  일 자 : 2023-12-30
       * 생   성   자 : Admin 
       * ------------------------------------------------------------------------------------------
       * @@/ndb/script/700.package/bsys/sys_crypto_api.pdc
       --------------------------------------------------------------------------------------------
       * 수정일자       수정자      수정내역
       --------------------------------------------------------------------------------------------
       * 2023-12-30     Admin       최초 작성
    ******************************************************************************************** */
 is
    /* ********************************************************************************************
       * 사 용  목 적 : 암호화 처리
       * 생 성  일 자 : 2023-12-30
       * 생   성   자 : Admin 
       * ------------------------------------------------------------------------------------------
       * 오라클에서 제공하는 crypto 패키지 추가
       * ------------------------------------------------------------------------------------------
       * sqlplus /nolog
       * conn /as sysdba
       * @c:\web\oracle\product\11.2.0\dbhome_1\rdbms\admin\dbmsobtk.sql;
       * @c:\web\oracle\product\11.2.0\dbhome_1\rdbms\admin\prvtobtk.plb;
       * ------------------------------------------------------------------------------------------

       * ------------------------------------------------------------------------------------------
       * 데이터 암호화를 위한 옵션
       * ------------------------------------------------------------------------------------------
       * select *
       *   from v$option
       *  where upper(parameter) = upper('Transparent Data Encryption');
       * ------------------------------------------------------------------------------------------

       * ------------------------------------------------------------------------------------------
       * 인증서 생성을 위한 폴더 생성
       * 폴더 생성: wallet
       * c:\web\oracle\admin\orcl\wallet
       * ------------------------------------------------------------------------------------------

       * ------------------------------------------------------------------------------------------
       * wallet 폴더 아래 인증서 파일 생성 및 지갑(wallet) 오픈(마스터 키 파일: ewallet.p12)
       * sqlplus /nolog
       * conn /as sysdba
       * 19c: alter session set container=NDB;
       * alter system set encryption key identified by "1234";
       * ------------------------------------------------------------------------------------------

       * ------------------------------------------------------------------------------------------
       * 지갑 폴더 및 오픈내역 조회
       * ------------------------------------------------------------------------------------------
       * select *
       *   from v$encryption_wallet;
       * ------------------------------------------------------------------------------------------

       * ------------------------------------------------------------------------------------------
       * 권한 부여
       * ------------------------------------------------------------------------------------------
       * grant all on sys.dbms_crypto to bsys;
       * ------------------------------------------------------------------------------------------

       * ------------------------------------------------------------------------------------------
       * 인증서 파일 확인
       * ------------------------------------------------------------------------------------------
       * 경로: c:\web\oracle\admin\orcl\wallet
       * 파일: ewallet.p12
       * ------------------------------------------------------------------------------------------

    ******************************************************************************************** */
    function encrypt_f
        (pi_input_string               in     varchar2
        ) return raw
    is
        l_result_value                 raw(4000);
    begin
        begin
            if pi_input_string is null then
                return null;

            -- 암호화 처리
            else
                l_result_value := dbms_crypto.encrypt
                                      (src => utl_i18n.string_to_raw(pi_input_string, 'AL32UTF8') -- 암호화 할 문자열 raw 타입으로 변환
                                      ,typ => c_aes_cbc_pkcs5
                                      ,key => c_key_raw
                                      );

                -- 결과 리턴
                return l_result_value;
            end if;

        exception
            when others then
                return null;
        end;
    end encrypt_f;

    /* ********************************************************************************************
       * 사 용  목 적 : 복호화 처리
       * 생 성  일 자 : 2023-12-30
       * 생   성   자 : Admin 
    ******************************************************************************************** */
    function decrypt_f
        (pi_input_string               in     varchar2
        ) return varchar2
    is
        l_raw                          raw(4000);
        l_result_value                 varchar2(4000);
    begin
        begin
            if pi_input_string is null then
                return null;

            -- 복호화 처리
            else
                l_raw := dbms_crypto.decrypt
                             (src => pi_input_string
                             ,typ => c_aes_cbc_pkcs5
                             ,key => c_key_raw
                             );

                -- raw 형식을 char로 형식으로 변환
                l_result_value := utl_i18n.raw_to_char(l_raw, 'AL32UTF8');

                -- 결과 리턴
                return l_result_value;

            end if;

        exception
            when others then
                return null;
        end;
    end decrypt_f;

end sys_crypto_api;