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>