DB
PL/SQL 암호화/복호화 프로시저 자바 적용
9400
2023. 2. 15. 11:28
/
SET SERVEROUTPUT ON;
/ (헤더)
CREATE OR REPLACE PACKAGE pkg_crypto
IS
FUNCTION encrypt ( input_string IN VARCHAR2 ) RETURN RAW; --암호화
FUNCTION decrypt ( input_string IN VARCHAR2 ) RETURN VARCHAR2; --암호화 -> 복호화
END pkg_crypto;
/
CREATE OR REPLACE PACKAGE BODY pkg_crypto
IS
-- 에러 발생시에 error code 와 message를 받기 위한 변수 지정.
SQLERRMSG VARCHAR2(255);
SQLERRCDE NUMBER;
FUNCTION encrypt (input_string IN VARCHAR2 )
RETURN RAW
IS
key_data_raw RAW(64);
converted_raw RAW(64);
encrypted_raw RAW(64);
BEGIN
-- 들어온 data 와 암호 키를 각각 RAW 로 변환한다.
converted_raw := UTL_I18N.STRING_TO_RAW(input_string , 'AL32UTF8');
key_data_raw := UTL_I18N.STRING_TO_RAW( '12345678' , 'AL32UTF8');
-- DBMS_CRYPTO.ENCRYPT 로 암호화 하여 encrypted_raw 에 저장.
encrypted_raw := DBMS_CRYPTO.ENCRYPT( src => converted_raw ,
typ => DBMS_CRYPTO.DES_CBC_PKCS5 , -- typ 부분만 변경하면 원하는 알고리즘을 사용할 수 있다. key value byte 가 다 다르니 확인해야 한다.
key => key_data_raw ,
iv => NULL);
RETURN encrypted_raw;
END encrypt;
FUNCTION decrypt (input_string IN VARCHAR2 )
RETURN VARCHAR2
IS
converted_string VARCHAR2(64);
key_data_raw RAW(64);
decrypted_raw VARCHAR2(64);
BEGIN
key_data_raw := UTL_I18N.STRING_TO_RAW( '12345678' , 'AL32UTF8');
decrypted_raw := DBMS_CRYPTO.DECRYPT( src => input_string ,
typ => DBMS_CRYPTO.DES_CBC_PKCS5 ,
key => key_data_raw ,
iv => NULL);
-- DBMS_CRYPTO.DECRYPT 수행 결과 나온 복호화 된 raw data를 varchar2로 변환하면 끝!
converted_string := UTL_I18N.RAW_TO_CHAR(decrypted_raw, 'AL32UTF8');
RETURN converted_string;
END decrypt ;
END pkg_crypto;
/
실행 (암호화)
SELECT pkg_crypto.encrypt('test') from dual;
실행(복호화)
SELECT pkg_crypto.decrypt('A04B686B118AF67B') from dual;
SELECT USER_NO
,USER_PW
,pkg_crypto.encrypt(USER_PW) CRYPTO_PW
FROM MEM;
암호화된 언어로 USER_PW업데이트 하기
UPDATE MEM A
SET A.USER_PW = (
SELECT pkg_crypto.encrypt(USER_PW)
FROM MEM B
WHERE B.USER_NO = A.USER_NO
);
MAPPER XML 변경
<!-- 회원 로그인 -->
<select id="memLogin" parameterType="memVO" resultMap="memMap">
SELECT A.USER_NO, A.USER_ID,
pkg_crypto.decrypt(A.USER_PW) USER_PW , A.USER_NAME, A.COIN, A.REG_DATE, A.UPD_DATE, A.ENABLED,
B.USER_NO, B.AUTH
FROM MEM A LEFT OUTER JOIN MEM_AUTH B
ON(A.USER_NO = B.USER_NO)
WHERE A.USER_ID =#{userId}
</select>