일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 오라클
- 자바
- 제이쿼리
- 맥
- html
- Eclipse
- 7월 공모주 청약 일정
- MYSQL
- JavaScript
- SQL
- 주식
- java
- 6월 공모주 청약 일정
- linux
- IPO
- 공모주
- 공모주 청약
- Oracle
- css
- Stock
- codeigniter
- Stock ipo
- 코드이그나이터
- jquery
- 자바스크립트
- 리눅스
- 주식 청약 일정
- 공모주 청약 일정
- php
- 주식 청약
- Today
- Total
개발자의 끄적끄적
[DB Security] 공짜로 DB 암호화 하는 방법 본문
[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(‘주민번호’) ;
'개발 > sql' 카테고리의 다른 글
[MySQL] 패스워드 노출 경고 (Mysql 5.6 Warning: Using a password on the command line interface can be insecure.) [펌] (0) | 2020.08.20 |
---|---|
[sql] mysqldump 의 사용법 [펌] (0) | 2020.08.18 |
[oracle] 암호화 / DBMS_CRYPTO 패키지를 이용하여 데이터 암,복호화[펌] (0) | 2020.08.17 |
[Oracle] 오라클 프로시저, 함수 수정 확인 [펌] (0) | 2020.08.16 |
[ORACLE] 에러 - ORA-01465: 16진수의 지정이 부적합합니다[펌] (0) | 2020.08.16 |