개발자의 끄적끄적

[DB Security] 공짜로 DB 암호화 하는 방법 본문

개발/sql

[DB Security] 공짜로 DB 암호화 하는 방법

효벨 2020. 8. 18. 01:00
728x90
반응형

[DB Security] 공짜로 DB 암호화 하는 방법

 

추가 암호화 솔루션 구매 없이 개인정보 데이터 를  컬럼 단위 암호화 하는  방법 입니다.

 

양방향 암호화

< 요약 >

아래 방식으로 키 테이블과 암호화 / 복호화 함수를 만든 다음 개인정보 데이터를

입력 , 수정 , 조회 하는 부분을 모두 변경 ( SQL , SP , java 등등 ) 해야 합니다.

 

< 방식설명 >

1.    Key 테이블을 일단 만들고 key 데이터를 한건 넣습니다. ( 임의로 )

2.    Encode param 함수 와 decode param 함수파일을 보면 오라클의 기본 함수를 이용합니다.

3.    Encode param 함수는 암호화 할 컬럼 데이터를 입력 또는 수정하는 쿼리에 사용합니다.

4.    Decode param 함수는 암호화 한 컬럼 데이터를 조회 하는데 사용 하는 쿼리에 사용 합니다.

 

< 주의 >

만약 사내 보안 규칙상 키 테이블을 같은 머신에 놓으면 안되는 경우 디비링크를 써서 다른 DB에 넣고 조회 하게 됩니다.
(주의 : 트래픽이 몰릴경우 성능 보장이 안됩니다. )

 

1. Key 테이블 생성 및 Key Data Insert

CREATE TABLE SY_SECURE_KEY
(
KEY              LONG RAW
)
TABLESPACE USERS
PCTFREE 10
PCTUSED 0
INITRANS 1
MAXTRANS 255
STORAGE
(
INITIAL 65536
MINEXTENTS 1
MAXEXTENTS UNLIMITED
BUFFER_POOL DEFAULT
)
LOGGING ;

 

INSERT INTO SY_SECURE_KEY VALUES (‘4E5065664D73337546314………..0000 임의 키값 입력 ’) ;

 

2. 암호화 함수 생성

CREATE OR REPLACE function encodeParam
(
p_in    in varchar2
)
return varchar2 is
l_return_val varchar2(2048) ;
l_enc_val raw (2048);
l_mod     number := DBMS_CRYPTO.ENCRYPT_AES256
+ DBMS_CRYPTO.CHAIN_ECB
+ DBMS_CRYPTO.PAD_PKCS5;
p_key raw (65) ;
begin

if p_in is not null and (isEncoded(p_in)=0) then

select key into p_key from sy_secure_key ;

l_enc_val := DBMS_CRYPTO.encrypt( UTL_RAW.cast_to_raw(p_in), l_mod, p_key );
l_return_val := UTL_RAW.cast_to_varchar2( utl_encode.base64_encode(l_enc_val) ) ;

else
l_return_val := p_in ;
end if ;

return l_return_val;

exception

when others then
l_return_val := p_in ;

return l_return_val;
end;
/

 

3. 복호화 암호 함수

CREATE OR REPLACE function decodeParam
(
p_in    in varchar2
)
return varchar2 is
l_return_val varchar2(2048) ;
l_dec_val raw (2048);
l_mod     number := DBMS_CRYPTO.ENCRYPT_AES256
+ DBMS_CRYPTO.CHAIN_ECB
+ DBMS_CRYPTO.PAD_PKCS5;
p_key raw (65) ;
begin

if p_in is not null and (isEncoded(p_in)>0) then

select key into p_key from sy_secure_key ;

l_dec_val := utl_encode.base64_decode(utl_raw.cast_to_raw(p_in)) ;
l_dec_val := DBMS_CRYPTO.decrypt( l_dec_val, l_mod, p_key );
l_return_val := UTL_RAW.cast_to_varchar2( l_dec_val) ;

else
l_return_val := p_in ;
end if ;

return l_return_val;

exception

when others then
l_return_val := p_in ;

return l_return_val;
end;
/

 

 

4. 암호화 테이블 데이터 조회 시 ( 복호화 과정 )

select  decodeParam(COL1), decodeParam(COL2)
from 개인정보테이블
where ID=’haisins’;

 

5. 암호화 테이블 데이터 추가 시 ( 암호화 과정 )

Insert into 개인정보테이블  values (encodeParam(‘주민번호’) ;

 

 

출처 : http://haisins.epac.to/wordpress/?p=2423

반응형
Comments