* 공개키 알고리즘
- 암호화와 복호화에 같은 키를 사용하여 문서를 암호화하고 복호화함
비밀번호 암호화를 위해 기존의
tbl_member 테이블의 pwd 컬럼을 가변길이를 늘이도록 하자.
alter table tbl_member modify (pwd varchar2(100));
1단계
-- sysdba 계정으로 가서 권한 부여
cmd >
콘솔 > sqlplus / as sysdba
GRANT EXECUTE ON DBMS_CRYPTO TO 사용자아이디
ex)
SQL> grant execute on dbms_crypto to macaronics;
2단계
암호화+복호화를 위한 패키지 선언
VARCHAR2:='macaronics@53fs&8!!fz~'
임의로 문자열을 적으면 되고 , 보호와의 키값과 같아야 한다.
CREATE OR REPLACE PACKAGE PACK_ENCRYPTION_DECRYPTION IS FUNCTION FUNC_ENCRYPT -- 암호화를 위한 함수 (V_INPUT_STRING IN VARCHAR2, KEY_DATA IN VARCHAR2:='macaronics@53fs&8!!fz~') RETURN RAW; FUNCTION FUNC_DECRYPT -- 복호화를 위한 함수 (V_INPUT_STRING IN VARCHAR2, KEY_DATA IN VARCHAR2:='macaronics@53fs&8!!fz~') RETURN VARCHAR2; END PACK_ENCRYPTION_DECRYPTION; /
다음과 같이 암호화+복호화를 위한 패키지 선언 되었다. 아직 패키지와 된 것은 아니다.
3단계
FUNC_ENCRYPT 함수의 키값과, FUNC_DECRYPT 함수의 키값을 2단계의 키값과 동일 시한다.
CREATE OR REPLACE PACKAGE BODY PACK_ENCRYPTION_DECRYPTION IS FUNCTION FUNC_ENCRYPT ( V_INPUT_STRING IN VARCHAR2, KEY_DATA IN VARCHAR2 := 'macaronics@53fs&8!!fz~' ) RETURN RAW IS V_ORIGINAL_RAW RAW(64); V_KEY_DATA_RAW RAW(64); ENCRYTED_RAW RAW(64); BEGIN -- INPUT값을 RAW 타입으로 변경 V_ORIGINAL_RAW := UTL_I18N.STRING_TO_RAW(V_INPUT_STRING, 'AL32UTF8'); --키 또한 RAW 타입으로 변경. V_KEY_DATA_RAW := UTL_I18N.STRING_TO_RAW(KEY_DATA, 'AL32UTF8'); ENCRYTED_RAW := DBMS_CRYPTO.ENCRYPT( SRC => V_ORIGINAL_RAW, TYP => DBMS_CRYPTO.DES_CBC_PKCS5, KEY => V_KEY_DATA_RAW, IV => NULL); RETURN ENCRYTED_RAW; END FUNC_ENCRYPT; FUNCTION FUNC_DECRYPT ( V_INPUT_STRING IN VARCHAR2, KEY_DATA IN VARCHAR2 := 'macaronics@53fs&8!!fz~' ) RETURN VARCHAR2 IS V_KEY_DATA_RAW RAW(64); DECRYPTED_RAW RAW(64); CONVERTED_STRING VARCHAR2(64); BEGIN V_KEY_DATA_RAW := UTL_I18N.STRING_TO_RAW(KEY_DATA, 'AL32UTF8'); DECRYPTED_RAW := DBMS_CRYPTO.DECRYPT( SRC => V_INPUT_STRING, TYP => DBMS_CRYPTO.DES_CBC_PKCS5, KEY => V_KEY_DATA_RAW, IV => NULL); CONVERTED_STRING := UTL_I18N.RAW_TO_CHAR(DECRYPTED_RAW, 'AL32UTF8'); RETURN CONVERTED_STRING; END FUNC_DECRYPT; END PACK_ENCRYPTION_DECRYPTION; /
패키지 된 모습이다.
4단계
쿼리 적용
암호화시
PACK_ENCRYPTION_DECRYPTION.FUNC_ENCRYPT(전달 받은 패스워드 )
복호화시
PACK_ENCRYPTION_DECRYPTION.FUNC_ENCRYPT(전달 받은 패스워드)
mybatis 적용 예
<insert id="insertMember"> <![CDATA[ INSERT INTO TBL_MEMBER (ID, PWD, NAME, EMAIL, ZIP_NUM, ADDRESS, PHONE, IP) VALUES(#{id}, PACK_ENCRYPTION_DECRYPTION.FUNC_ENCRYPT(#{pwd}), #{name}, #{email}, #{zip_num}, #{address}, #{phone}, #{ip}) ]]> </insert> <!-- 비밀번호 체크 --> <select id="checkIdAndPwd" resultType="int"> <![CDATA[ select count(*) from TBL_MEMBER where id=#{id} and pwd=PACK_ENCRYPTION_DECRYPTION.FUNC_ENCRYPT(#{pwd}) ]]> </select>
제작 : macaronics.net - Developer Jun Ho Choi
소스 : https://github.com/braverokmc79/jsp_sin
${request.getContextPath() } 처리를 안한 부분이 있으므로
루트 설정( http://macaronics.net/index.php/m01/jsp/view/1352) 및 server.xml 에서 DB 컨넥션 설정은 필수 설정이다.
댓글 ( 4)
댓글 남기기