데이터 암호화
마지막으로 만들어볼 프로그램은 이 장 전반부에서 배웠던 데이터를 암호화하는 프로그램이다. 데이터 암호화는 바로 직전에 사용했던 MAC 함수와는 달리 암호화 알고리즘을 사용해 암호화하고 복호화를 수행해야 한다. 따라서 이번에도 암호화와 복호화를 담당하는 2개의 함수를 만들 것이다.
암호화 함수에서 256비트 키를 사용한 AES 암호화 방식을 사용하려고 하는데, 이를 위해서는 암호화 키로 직전에 사용했던 ch19_wrap_pkg.pv_key_string를 사용할 수 없다. 이 패키지 상수 값이 256비트가 아니기 때문이다. 따라서 다음과 같이 새로운 암호화 키를 다시 만들어 보자.
입력
DECLARE
vv_ddl VARCHAR2(1000); -- 패키지 소스를 저장하는 변수
BEGIN
-- 패키지 소스를 vv_ddl에 설정
vv_ddl := 'CREATE OR REPLACE PACKAGE ch19_wrap_pkg IS
pv_key_string CONSTANT VARCHAR2(30) := ''OracleKey'';
key_bytes_raw CONSTANT RAW(32) := ''1181C249F0F9C3343E8FF2BCCF370D3C9F70E973531DEC1C5066B54F27A507DB'';
END ch19_wrap_pkg;';
-- CREATE_WRAPPED 프로시저를 사용하면 패키지 소스를 숨기는 것과 동시에 컴파일도 수행한다.
DBMS_DDL.CREATE_WRAPPED ( vv_ddl );
EXCEPTION WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(SQLERRM);
END ;
결과
익명 블록이 완료되었습니다.
key_bytes_raw 상수 값에 저장된 값은 DBMS_CRYPTO.RANDOMBYTES 함수를 사용해 만든 값이다. 이제 암호화 함수를 만들어 보자.
입력
CREATE OR REPLACE PACKAGE BODY my_util_pkg IS
...
...
/* 8. 암호화 함수 **************************************************************************************************************************/
FUNCTION fn_encrypt ( ps_input_string IN VARCHAR2 )
RETURN RAW
IS
encrypted_raw RAW(32747);
v_key_raw RAW(32747); -- 암호화 키
encryption_type PLS_INTEGER; -- 암호화 슈트
BEGIN
-- 암호화 키 값을 가져온다.
v_key_raw := ch19_wrap_pkg.key_bytes_raw;
-- 암호화 슈트 설정
encryption_type := DBMS_CRYPTO.ENCRYPT_AES256 + -- 256비트 키를 사용한 AES 암호화
DBMS_CRYPTO.CHAIN_CBC + -- CBC 모드
DBMS_CRYPTO.PAD_PKCS5; -- PKCS5로 이루어진 패딩
-- ENCRYPT 함수로 암호화를 한다. 매개변수로 들어온 문자열을 UTL_I18N.STRING_TO_RAW를 사용해 RAW 타입으로 변환한다.
encrypted_raw := DBMS_CRYPTO.ENCRYPT ( src => UTL_I18N.STRING_TO_RAW (ps_input_string, 'AL32UTF8'),
typ => encryption_type,
key => v_key_raw
);
RETURN encrypted_raw;
END fn_encrypt;
결과
PACKAGE BODY MY_UTIL_PKG이(가) 컴파일되었습니다.