본문 바로가기
[ View ]/JSP

[ JSP ] JDBC 암호화

by 환이s 2023. 3. 8.

이전 포스팅을 지나오면서 JDBC를 이용해 DB를 연결했었습니다. 문제는 연결 정보인 context.xml가 Github와 같이 웹 상에 공유되면 보안적으로 문제가 발생하므로 DB 계정 정보를 암호화하는 방법에 대해서 포스팅해보려 합니다.

 

 

■  데이터베이스 암호화

데이터를 서버와 클라이언트 간 통신 시 암호화하여 전송하지 않으면 네트워크 스니핑 등을 통한 중요 정보가 외부에 노출될 수 있습니다. 

 

개인정보보호법에 의거하여 회원의 중요한 정보들(고유식별번호, 비밀번호, 바이오정보 등)반드시 암호화하여 처리를 해야 하며, 비밀번호는 일방향 암호화를 해야 합니다.(복호화 금지)

 

◎참고 : 평문 => 암호문 (암호화) / 암호문 => 평문 (복호화)

 

암호화의 종류는 양방향 암호화, 단방향 암호화 등  다양하게 있습니다. 

종류에 대해서는 별도로 포스팅하지 않겠습니다.

 

이번 포스팅에서는 오라클 DB에서 제공해 주는 대칭키 알고리즘. 즉, 암호화와 복호화에 같은 키를 사용하여 데이터를 암호화하고 복호화합니다. 

 

 

다양한 암호화 알고리즘 중에서 대칭키 알고리즘인 DES_CBC_PKCS5를 활용하여 오라클 DB에서 제공되는 암호화를 알아봅시다.

 


■  JDBC 암호화. SQL

먼저 명령프로프트(터미널)에서 오라클의 최상위 계정인 sysdba 계정으로 로그인하여 사용자에게 암호화, 복호화 권한을 부여해야 합니다.

 

sqlplus / as sysdba 또는 접속된 상태에서는 conn / as sysdba

위 사진처럼 sysdba 계정으로 들어왔다면 이제 계정에 권한을 부여해야 합니다.

 

-GRANT EXECUTE ON DBMS_CRYPTO TO 사용자아이디
GRANT EXECUTE ON DBMS_CRYPTO TO JAVA;
GRANT EXECUTE ON DBMS_CRYPTO TO hr;

위 사진처럼 Grant succeeded. 문구가 나오면 성공입니다. 

이 작업에서 자주 실수하는 부분이 있는데 바로 ;(세미콜론)입니다.

;(세미콜론)을 마지막에 꼭 확인해야 합니다.

 

그럼 이제 SQL Developer에서 작업합니다.

권한이 주어진 JAVA 계정으로 로그인하여 암호화+복호화를 위한 패키지 함수를 선언해야 합니다.

 

<SQL>

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;

 

주의할 점은 KEY 값은 임의로 지정하되 암호화, 복호화에 각각 동일하게 지정해야 합니다.

 

위처럼 출력되셨다면 이제 패키지 구현을 합니다.

이번 포스팅은 JDBC의 암호화를 설정하는 포스팅이므로, SQL의 함수 설명은 넘어가겠습니다.

 

< 패키지 구현 >

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;

 

위 작업까지 완료했다면 테이블을 생성해 봅시다.

 

< member table 생성 >

create table member (
userid varchar2(50) not null primary key,
passwd varchar(64) not null, --varchar2가 아닌 varchar로 설정
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
);

생성하고 나서 테이블에 출력시킬 예제 데이터를 넣어줍니다.

 

< 테이블에 자료 입력 >

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'),'홍실장');

 

 

그럼 이제 로그인 테스트를 진행해 봅시다. 테이블에 자료 입력을 할 때 비밀번호는 암호화 설정을 했습니다. 그럼 출력될 때 비밀번호는 암호화 상태로 출력되어야 합니다.

 

< Login Test >

select * from member where userid='kim'
and passwd=PACK_ENCRYPTION_DECRYPTION.FUNC_ENCRYPT('1234');

-- 비교
select * from member where userid='kim' and passwd='1234'; --안나옴

 


마치며 

 

오늘은 데이터 베이스 암호화 설정하는 방법에 대해서 알아봤습니다.

다음 포스팅에서 뵙겠습니다.

728x90

'[ View ] > JSP' 카테고리의 다른 글

[ JSP ] EL(Expression Language)  (0) 2023.03.14
[ JSP ] Cookie  (0) 2023.03.11
[ JSP ] JAVA Bean  (0) 2023.03.07
[ JSP ] 에러 처리  (0) 2023.03.06
[ JSP ] 액션 태그  (0) 2023.03.05