타 사이트에서 사용 했던 오라클 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(‘주민번호’) ;
*.참고
DBMS_CRYPTO Encryption Algorithms
Name | Description |
---|---|
<span style="font-size: 8.7pt;">ENCRYPT_DES</span> |
Data Encryption Standard. Block cipher. Uses key length of 56 bits. |
<span style="font-size: 8.7pt;">ENCRYPT_3DES_2KEY</span> |
Data Encryption Standard. Block cipher. Operates on a block 3 times with 2 keys. Effective key length of 112 bits. |
<span style="font-size: 8.7pt;">ENCRYPT_3DES</span> |
Data Encryption Standard. Block cipher. Operates on a block 3 times. |
ENCRYPT_AES128 |
Advanced Encryption Standard. Block cipher. Uses 128-bit key size. |
ENCRYPT_AES192 |
Advanced Encryption Standard. Block cipher. Uses 192-bit key size. |
ENCRYPT_AES256 |
Advanced Encryption Standard. Block cipher. Uses 256-bit key size. |
<span style="font-size: 8.7pt;">ENCRYPT_RC4</span> |
Stream cipher. Uses a secret, randomly generated key unique to each session. |
https://docs.oracle.com/cd/E18283_01/appdev.112/e16760/d_crypto.htm