오라클의 암호화 복호화

유동현·2022년 11월 10일
0
post-thumbnail

암호화 & 복호화

--■■■ 오라클 암호화&복호화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을(를) 성공했습니다.

암호화 & 복호화 사용법

1.

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이(가) 컴파일되었습니다.

2.

--○암호화/복호화 패키지의 암호화 함수를 활용하여 데이터 입력
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  복호화 실패

0개의 댓글