--■■■ 오라클 암호화&복호화01_SYS ■■■--
/*
암호화는 허용불가된 제 3자가 어떤내용인지 열람불가하게 하는것
복호화는 암호화된 데이터를 볼수있게 복원하는 과정으로
이건 특정 알고리즘에 대한것을 일반인도 구성할수있다.
1.오라클 암호화 기능을 사용하기 위해서는
『DBMS_OBFUSCATION_TOOLKIT』 패키지를 이용한다.
암호화, 복호화 알고리즘을 직접 구현하는 것도 가능하다.
하지만, 편의상 오라클에서 제공해주는 패키지를 통해 구현할 수 있다.
2.『DBMS_OBFUSCATION_TOOLKIT』 패키지는
기본적으로 사용할 수 없는 상태로 설정되어있다. (DEFAULT 설정 상)
이 패키지를 사용하기 위해서는 추가 설치 과정이 필요하다.
(dbmsobtk.sql, prvtobtk.plb 파일을 찾아서 실행할 수 있도록 한다.)
3. 이 패키지는 4개의 프로시저로 이루어져 있다.
VARCHAR2 타입을 Encrypt/Decrypt 할 수 있는 2개의 프로시저
RAW 타입을 Encrypt/Decrypt 할 수 있는 2개의 프로시저
(다른 타입은 지원하지 않기 때문에 NUMBER 타입인 경우 TO_CHAR 사용)
※ RAW, LONG RAW, ROWID 타입
그래픽 이미지나 디지털 사운드를 저장
HEXA-DECEMAL(16 진수) 형태로 RETURN
RAW 는 VARCHAR2 와 유사
LONG RAW 는 LONG 과 유사하나 다음과 같은 제한사항이 있다.
- 저장과 추출만 가능하고, 데이터를 가공할 수 없다.
- LONG RAW는 LONG 과 같은 제한 사항을 갖는다.
*/
--○암호화 복호화 패키지 위치
/*
C:\oraclexe\app\oracle\product\11.2.0\server\rdbms\admin
@C:\oraclexe\app\oracle\product\11.2.0\server\rdbms\admin\dbmsobtk.sql
@C:\oraclexe\app\oracle\product\11.2.0\server\rdbms\admin\prvtobtk.plb
*/
--○ SCOTT 계정에 이 패키지를 사용할 수 있는 권한 부여 (SYS가..)
GRANT EXECUTE ON DBMS_OBFUSCATION_TOOLKIT TO SCOTT;
--Grant을(를) 성공했습니다.
SELECT USER
FROM DUAL;
--○패키지 선언(명세부 작성)
CREATE OR REPLACE PACKAGE CRYPTPACK
AS
--암호화 함수 선언
FUNCTION ENCRYPT(STR VARCHAR2, HASH VARCHAR2) RETURN VARCHAR2;
--복호화 함수 선언
FUNCTION DECRYPT(XCRYPT VARCHAR2, HASH VARCHAR2) RETURN VARCHAR2;
END CRYPTPACK;
--Package CRYPTPACK이(가) 컴파일되었습니다.
--○패키지 정의(몸체부 작성)
/*
※ DSESEncrypt, DESDecrypt 함수는
인수가 VARCHAR2, RAW인 프로시저가 있다.
- RAW : 2진 데이터
- UTL_RAW.CAST_TO_RAW : 문자열을 2진 데이터로 변환
- INPUT_STRING VARCHAR2(32) := 'abcd';
- RAW_INPUT RAW(128) := UTL_RAW.CAST_TO_RAW(INPUT_STRING);
- STR VARCHAR2(30) := UTL_RAW.CAST_TO_RAW(RAW_INPUT);
※ 프로시저를 구성하는 매개변수가 많을 경우
이 프로시저를 실행할 때 매개변수 값의 갯수나 순서를
혼동하게 될 가능성이 매우 크다.
이와 같은 경우에는 다음과 같은 형태로
매개변수와 입력 값을 매핑하여 실행하면
실수를 줄일 수 있으며, 편리하게 사용할 수 있다.
<프로시저 실행>
EXEC 혹은 EXECUTE 프로시저명( 매개변수1 => 매개변수1에 전달하는 값
, 매개변수2 => 매개변수2에 전달하는 값
, 매개변수 5 => 매개변수 5에 전달하는 값
);
→즉, 『=>』 기호를 이용하여
해당 매개변수명과 값을 연결하는 형태로 데이터를 전달할 수 있다.
*/
CREATE OR REPLACE PACKAGE BODY CRYPTPACK
AS
--전역변수
CRYPTED_STRING VARCHAR2(2000);
--암호화 함수 정의
FUNCTION ENCRYPT(STR VARCHAR2, HASH VARCHAR2)
RETURN VARCHAR2
IS
PIECES_OF_EIGHT NUMBER := ((FLOOR(LENGTH(STR)/8+.9))*8);
BEGIN
DBMS_OBFUSCATION_TOOLKIT.DESENCRYPT
( INPUT_STRING => RPAD(STR, PIECES_OF_EIGHT)
, KEY_STRING => RPAD(HASH, 8, '#')
, ENCRYPTED_STRING => CRYPTED_STRING
);
RETURN CRYPTED_STRING;
END;
--복호화 함수 정의
FUNCTION DECRYPT(XCRYPT VARCHAR2, HASH VARCHAR2)
RETURN VARCHAR2
IS
BEGIN
DBMS_OBFUSCATION_TOOLKIT.DESDECRYPT
( INPUT_STRING => XCRYPT
, KEY_STRING => RPAD(HASH, 8, '#')
, DECRYPTED_STRING => CRYPTED_STRING
);
RETURN TRIM(CRYPTED_STRING);
END;
END CRYPTPACK;
--Package Body CRYPTPACK이(가) 컴파일되었습니다.
--○암호화/복호화 패키지의 암호화 함수를 활용하여 데이터 입력
INSERT INTO TBL_EXAM(ID, PW) VALUES( 1, CRYPTPACK.ENCRYPT('suer1234', 'SUPERMAN'));
--○확인
SELECT *
FROM TBL_EXAM;
/*
ID PW
--------------------
1 Mp?T?
*/
--○커밋
COMMIT;
--==>>커밋 완료.
--테스트 및 관찰
SELECT ID, CRYPTPACK.DECRYPT(PW,'SUPERMAN')
FROM TBL_EXAM;
/*
ID PW
-----------------
1 suer1234
*/
SELECT ID, CRYPTPACK.DECRYPT(PW,'BATMAN') AS PW
FROM TBL_EXAM;
-- 1 !/??g 복호화 실패