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;
'오라클 > 패키지(시스템관리)' 카테고리의 다른 글
[ 권한 및 시노님 ] 시스템공통으로 사용할 패키지에 대한 권한 및 시노님을 부여합니다. (0) | 2024.04.12 |
---|---|
[ 프로파일 ] sys_profile_api 패키지를 생성합니다. (0) | 2024.04.12 |
[ 국가 ] sys_country_api 패키지를 생성합니다. (0) | 2024.04.12 |
[ 로그인 세션정보 관리 ] sys_login_api 패키지를 생성합니다. (0) | 2024.04.12 |