기술

[오라클 / 티베로] UTL_FILE 패키지를 이용한 개인정보 암호화 키 OS파일 읽기

또리줌마 2022. 11. 7. 14:34
반응형

요즘 개인정보보안강화로 암복화 키를 파일 저장방식으로 강화되었네요.
DB서버에 키를 저장한 파일을 읽어서 암호화키를 추출해야 합니다.

그래서 티베로에서 UTL_FILE 패키지를 이용해서 OS파일에 대한 read/write를 수행 할 수 있다고 하니, 참고하시기 바랍니다.
(티베로와 오라클 동일)

1. 암호키를 저장한 파일을 DBMS 폴더에 생성
폴더위치에 암호화 키를 저장한 파일을 저장하고 해당 파일을 읽을 수 있도록 권한 부여해주면 됨(DBA에 요청)

* UTL_FILE package의 설명

Function/Procedure설 명

FOPEN Input이나 Output을 위해 file을 연다.
file이 존재하지 않을 경우 file을 생성한다.
IS_OPEN file handler를 이용해 file이 open되었는지 여부를 return한다.
FCLOSE file을 닫는다.
FCLOSE_ALL 열려 있는 모든 file을 닫는다.
GET_LINE open된 file로부터 한 line을 읽는다.
PUT open된 file에 한 line을 write한다. (Line terminator를 붙이지 않는다.)
PUT_LINE open된 file에 한 line을 write한다. (Line terminator를 붙인다.)
PUTF string을 formatting에 의해 write한다. (printf처럼)
NEW_LINE open된 file에 line terminator을 write한다.
FFLUSH open된 모든 file의 내용을 file에 physical하게 write한다.


1. 암호화키를 저장한 파일(.txt) 저장
- File 경로: $TIBERO_HOME/ENC_KEY
- DB Directory 명: ENC_KEY
- 파일명 : enc_key.txt (암호화키를 저장한 파일)


암호화키를암호화 키를 저장한 파일을 읽어서 암호화 키를 추출해보도록 하겠습니다.

2. 파일 읽어서 암호화 키 추출하는 함수 생성

CREATE OR REPLACE FUNCTION FN_GET_ENC_KEY
RETURN VARCHAR2
IS

FHANDLE UTL_FILE.FILE_TYPE;
FBUFFER VARCHAR2(64);
FILE_PATH VARCHAR2(100) := 'ENC_KEY'; //파일 디렉토리 위치
FILE_NAME VARCHAR2(100) := 'enc_key.txt'; //파일명

BEGIN

-- 파일 읽기
FHANDLE := UTL_FILE.FOPEN(FILE_PATH, FILE_NAME, 'R');
UTL_FILE.GET_LINE(FHANDLE, FBUFFER);
--DBMS_OUTPUT.PUT_LINE(FBUFFER);
UTL_FILE.FCLOSE(FHANDLE);

RETURN FBUFFER ;

EXCEPTION
WHEN NO_DATA_FOUND THEN
--DBMS_OUTPUT.PUT_LINE('NO_DATA_FOUND');
UTL_FILE.FCLOSE(FHANDLE);
RAISE_APPLICATION_ERROR(-20000,'NO_DATA_FOUND');
WHEN UTL_FILE.INVALID_PATH THEN
--DBMS_OUTPUT.PUT_LINE('UTL_FILE.INVALID_PATH');
UTL_FILE.FCLOSE(FHANDLE);
RAISE_APPLICATION_ERROR(-20000,'UTL_FILE.INVALID_PATH');
WHEN UTL_FILE.READ_ERROR THEN
--DBMS_OUTPUT.PUT_LINE(' UTL_FILE.READ_ERROR');
UTL_FILE.FCLOSE(FHANDLE);
RAISE_APPLICATION_ERROR(-20000,'UTL_FILE.READ_ERROR');
WHEN OTHERS THEN
--DBMS_OUTPUT.PUT_LINE('other ERR');
UTL_FILE.FCLOSE(FHANDLE);
RAISE_APPLICATION_ERROR(-20000,'OTHERS ERROR');
END;


3. 암호화키 확인 테스트

SELECT FN_GET_ENC_KEY() AS TXT_KEY
FROM DUAL