* 공개키 알고리즘
- 암호화와 복호화에 같은 키를 사용하여 문서를 암호화하고 복호화함
비밀번호 암호화를 위해 기존의
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)
댓글 남기기