본문 바로가기

DB/Oracle

db 암호화

1. 사용자에게 권한 부여 및 컬럼 바이트 확인


   GRANT EXECUTE ON DBMS_CRYPTO TO NEWID;


  * ALTER TABLE TB_TEMP MODIFY(REG_NO VARCHAR2(100));


2. PACKAGE 작성


   CREATE OR REPLACE PACKAGE PACK_ENCRYPTION_DECRYPTION

IS

   FUNCTION FUNC_ENCRYPT     -- 암호화위한 함수

   (V_INPUT_STRING IN VARCHAR2

   ,KEY_DATA  IN  VARCHAR2:='JAVA302$')   -- KEY값은 임의로 지정해주면된다. 여기서는 JAVA302$지정 

     RETURN RAW;   -- 데이터 타입을 알수 없도록 RAW 형으로 지정


    FUNCTION FUNC_DECRYPT   -- 복호화위한 함수

    (V_INPUT_STRING IN VARCHAR2

   ,KEY_DATA IN VARCHAR2:='JAVA302$') -- 공개키이므로 KEY값은 암호화할때와 동일하게 해주었다.


RETURN VARCHAR2;

   

   END  PACK_ENCRYPTION_DECRYPTION;   


3. PACKAGE 작성

 CREATE OR REPLACE PACKAGE BODY PACK_ENCRYPTION_DECRYPTION

IS


     FUNCTION FUNC_ENCRYPT

     ( V_INPUT_STRING  IN  VARCHAR2,

       KEY_DATA          IN  VARCHAR2 := 'JAVA302$'

     ) RETURN RAW

     IS

        V_ORIGINAL_RAW     RAW(64);

        V_KEY_DATA_RAW   RAW(64);

        ENCRYTED_RAW      RAW(64);

     BEGIN

        V_ORIGINAL_RAW := UTL_I18N.STRING_TO_RAW(V_INPUT_STRING, 'AL32UTF8');  -- INPUT값을 RAW 타입으로 변경

        V_KEY_DATA_RAW := UTL_I18N.STRING_TO_RAW(KEY_DATA, 'AL32UTF8');  --키 또한  RAW 타입으로 변경.

        

        ENCRYTED_RAW := DBMS_CRYPTO.ENCRYPT(SRC => V_ORIGINAL_RAW,

                                                                      TYP => DBMS_CRYPTO.DES_CBC_PKCS5,

                                                                      KEY => V_KEY_DATA_RAW,

                                                                      IV => NULL);

        

        RETURN ENCRYTED_RAW;

     END FUNC_ENCRYPT;

     

     

     FUNCTION FUNC_DECRYPT

     ( V_INPUT_STRING  IN  VARCHAR2,

       KEY_DATA          IN  VARCHAR2 := 'JAVA302$'

     ) RETURN VARCHAR2

     IS

         V_KEY_DATA_RAW  RAW(64);

         DECRYPTED_RAW   RAW(64);

         CONVERTED_STRING  VARCHAR2(64);

     BEGIN

             V_KEY_DATA_RAW := UTL_I18N.STRING_TO_RAW(KEY_DATA, 'AL32UTF8');

             

             DECRYPTED_RAW := DBMS_CRYPTO.DECRYPT(SRC => V_INPUT_STRING,

                                                                             TYP => DBMS_CRYPTO.DES_CBC_PKCS5,

                                                                             KEY => V_KEY_DATA_RAW,

                                                                             IV => NULL);

                                                                             

             CONVERTED_STRING :=  UTL_I18N.RAW_TO_CHAR(DECRYPTED_RAW, 'AL32UTF8');                                    

     

             RETURN CONVERTED_STRING;

     END FUNC_DECRYPT;


END PACK_ENCRYPTION_DECRYPTION;


4. 암호화

 PACK_ENCRYPTION_DECRYPTION.FUNC_ENCRYPT(REG_NO)

5. 복호화

 PACK_ENCRYPTION_DECRYPTION.FUNC_DECRYPT(REG_NO)