JSP

오라클 계정 암호화


* 암호화의 중요성

- 개인정보보호법에 의거하여 회원의 중요한 정보들(고유식별번호, 비밀번호, 바이오정보 등)은 반드시 암호화하여 처리해야 함

- 개인정보보호법에 의하여 비밀번호는 일방향 암호화를 해야 함(복호화 금지)

 

* 공개키 알고리즘

- 암호화와 복호화에 같은 키를 사용하여 문서를 암호화하고 복호화함

- 다양한 암호화 알고리즘 중에서 공개키  알고리즘인 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;

 


------------------------------------------------------

 

 실습 하기 

 

=> cmd  실행


C:\Users\choi>sqlplus / as sysdba

SQL> grant execute on dbms_crypto to java;

Grant succeeded.


----------------- 토드 실행

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;


-------------------------------------------------------

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;

-----------------------------------------------------------------


drop table member;



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

select * from member;


----------------  로그인 테스트


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

--------------- 복호화 테스트


select userid, PACK_ENCRYPTION_DECRYPTION.FUNC_DECRYPT(passwd) from member;



 

 

 

 

 

jsp

 

about author

PHRASE

Level 60  머나먼나라

재주는 곰이 넘고 돈은 되놈이 먹는다 , 정작 수고한 사람은 대가를 못 받고, 엉뚱한 사람이 가로챈다는 뜻.

댓글 ( 4)

댓글 남기기

작성