* 암호화의 중요성
- 개인정보보호법에 의거하여 회원의 중요한 정보들(고유식별번호, 비밀번호, 바이오정보 등)은 반드시 암호화하여 처리해야 함
- 개인정보보호법에 의하여 비밀번호는 일방향 암호화를 해야 함(복호화 금지)
* 공개키 알고리즘
- 암호화와 복호화에 같은 키를 사용하여 문서를 암호화하고 복호화함
- 다양한 암호화 알고리즘 중에서 공개키 알고리즘인 DES_CBC_PKCS5 알고리즘을 활용하여 암호화 실습
* 실습과정
1. sys 계정으로 로그인하여 사용자에게 암호화, 복호화 권한 부여
GRANT EXECUTE ON DBMS_CRYPTO TO 사용자아이디
2. 암호화+복호화를 위한 패키지 선언
- KEY값은 임의로 지정하되 암호화,복호화에 각각 동일하게 지정
CREATE OR REPLACE PACKAGE PACK_ENCRYPTION_DECRYPTION
IS
FUNCTION FUNC_ENCRYPT -- 암호화를 위한 함수
(V_INPUT_STRING IN VARCHAR2, KEY_DATA IN VARCHAR2:='java1234$!')
RETURN RAW;
FUNCTION FUNC_DECRYPT -- 복호화를 위한 함수
(V_INPUT_STRING IN VARCHAR2, KEY_DATA IN VARCHAR2:='java1234$!')
RETURN VARCHAR2;
END PACK_ENCRYPTION_DECRYPTION;
/
3. 패키지 구현
CREATE OR REPLACE PACKAGE BODY PACK_ENCRYPTION_DECRYPTION
IS
FUNCTION FUNC_ENCRYPT
( V_INPUT_STRING IN VARCHAR2,
KEY_DATA IN VARCHAR2 := 'java1234$!'
) 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 := 'java1234$!'
) 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. 회원 테이블 생성(기존 테이블은 삭제)
drop table member;
create table member (
userid varchar2(50) not null primary key,
passwd varchar(64) not null,
name varchar2(50) not null,
email varchar2(50),
hp varchar2(50),
zipcode varchar2(7),
address1 varchar2(200),
address2 varchar2(200),
join_date date default sysdate
);
5. 테이블에 자료 입력
insert into member (userid,passwd,name) values ('kim',PACK_ENCRYPTION_DECRYPTION.FUNC_ENCRYPT('1234'),'김과장');
insert into member (userid,passwd,name) values ('park',PACK_ENCRYPTION_DECRYPTION.FUNC_ENCRYPT('1234'),'최부장');
insert into member (userid,passwd,name) values ('hong',PACK_ENCRYPTION_DECRYPTION.FUNC_ENCRYPT('1234'),'홍실장');
6. 회원정보 확인
select * from member;
7. 로그인 테스트
select * from member where userid='kim' and passwd=PACK_ENCRYPTION_DECRYPTION.FUNC_ENCRYPT('1234');
8. 복호화 테스트
select userid, PACK_ENCRYPTION_DECRYPTION.FUNC_DECRYPT(passwd) from member;
댓글 ( 4)
댓글 남기기