이번에는 복호화 함수를 만들어 보자.
입력
/* 9. 복호화 함수 **************************************************************************************************************************/
FUNCTION fn_decrypt ( prw_encrypt IN RAW )
RETURN VARCHAR2
IS
vs_return VARCHAR2(100);
v_key_raw RAW(32747); -- 암호화 키
encryption_type PLS_INTEGER; -- 암호화 슈트
decrypted_raw RAW (2000); -- 복호화 데이터
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로 이루어진 패딩
-- 매개변수로 들어온 RAW 타입 데이터를 다시 복호화 ( 암호화했던 키와 암호화 슈트는 동일하게 사용해야 한다. )
decrypted_raw := DBMS_CRYPTO.DECRYPT ( src => prw_encrypt,
typ => encryption_type,
key => v_key_raw
);
-- 복호화된 RAW 타입 데이터를 UTL_I18N.RAW_TO_CHAR를 사용해 다시 VARCHAR2로 변환
vs_return := UTL_I18N.RAW_TO_CHAR (decrypted_raw, 'AL32UTF8');
RETURN vs_return;
END fn_decrypt;
결과
PACKAGE BODY MY_UTIL_PKG이(가) 컴파일되었습니다.
성공적으로 컴파일이 되었으니 암호화 함수를 테스트하자. 이전에 사용했던 ch19_user 테이블에 전화번호 컬럼을 추가해 보자.
입력
ALTER TABLE ch19_userADD phone_number RAW(2000);
결과
table CH19_USER이(가) 변경되었습니다.
전화번호를 fn_encrypt 함수의 매개변수로 받아 암호화한 다음 이 결과를 위 테이블의 전화번호 컬럼에 저장해 보자.
입력
BEGIN
-- 홍길동의 전화번호를 암호화한 뒤 저장한다.
UPDATE ch19_user
SET phone_number = my_util_pkg.fn_encrypt('010-0000-0001')
WHERE user_id = 'gdhong';
COMMIT;
END;
결과
익명 블록이 완료되었습니다.
ch19_user 테이블을 조회해 제대로 암호화됐는지 확인해 보자.
입력
SELECT *
FROM ch19_user;
결과
전화번호가 암호화되어 저장된 것을 알 수 있다. 이번에는 거꾸로 저장된 전화번호를 복호화해 보자.
입력
DECLARE
v_raw RAW(2000);
vs_phone_number VARCHAR2(50);
BEGIN
-- 홍길동의 전화번호를 가져온다.
SELECT phone_number
INTO v_raw
FROM ch19_user
WHERE user_id = 'gdhong';
-- RAW 타입의 전화번호를 복호화 함수에 넣어 원래 문자형태의 전화번호를 얻는다.
vs_phone_number := my_util_pkg.fn_decrypt(v_raw);
DBMS_OUTPUT.PUT_LINE('전화번호 : ' || vs_phone_number);
END;
결과
전화번호 : 010-0000-0001