DB/SQL

[암호화]패키지 소스 암호화

토킹포테토 2022. 11. 24. 11:56
728x90

이전에 작성했던 DBMS_CRYPTO 패키지를 이용하여 데이터를 암/복호화하는 패키지 바디 소스를 암호화 하는 방법이다.

 

DBMS_CRYPTO 패키지를 이용하여 데이터를 암/복호화 

https://talking-potato-dev.tistory.com/14

 

[암호화] DBMS_CRYPTO 패키지를 이용하여 데이터 암/복호화

환경 : 오라클 11g * 각자의 환경에 맞게 경로를 바꿔 사용해 주시길 바랍니다. 1. CMD로 오라클 접속 (sys 계정으로 접속) C:\Users\말하는감자>sqlplus SQL*Plus: Release 11.2.0.2.0 Production on 수 11월 23 13:40:25 20

talking-potato-dev.tistory.com

 

1. 기존에 있던 패키지 바디를  아래와 같이 수정

DECLARE
  src CLOB;
BEGIN
  src := 
'
create or replace PACKAGE BODY pkg_crypto

IS

-- 에러 발생시에 error code 와 message를 받기 위한 변수 지정.

    SQLERRMSG   VARCHAR2(255);

    SQLERRCDE   NUMBER;



    FUNCTION encrypt (input_string IN VARCHAR2 )

     RETURN RAW

    IS



        key_data_raw        RAW(4000);

        converted_raw       RAW(4000);

        encrypted_raw       RAW(4000);



    BEGIN



        -- 들어온 data 와 암호 키를 각각 RAW 로 변환한다.

        converted_raw := UTL_I18N.STRING_TO_RAW(input_string , ''AL32UTF8'');

        key_data_raw  := UTL_I18N.STRING_TO_RAW(  ''원하는 암호키(EX 12345)'' , ''AL32UTF8'');



        -- DBMS_CRYPTO.ENCRYPT 로 암호화 하여 encrypted_raw 에 저장.

        encrypted_raw := DBMS_CRYPTO.ENCRYPT(  src => converted_raw ,
                                               typ => DBMS_CRYPTO.DES_CBC_PKCS5 , --• DES_CBC_PKCS5: ENCRYPT_DES + CHAIN_CBC + PAD_PKCS5 가 결합된 슈트
                                               key => key_data_raw ,
                                               iv =>  NULL);



        RETURN encrypted_raw;

    END encrypt;



    FUNCTION decrypt (input_string IN VARCHAR2 )

     RETURN VARCHAR2

    IS

        converted_string    VARCHAR2(4000);

        key_data_raw        RAW(4000);

        decrypted_raw       VARCHAR2(4000);



    BEGIN



        key_data_raw     := UTL_I18N.STRING_TO_RAW(  ''원하는 암호키(EX 12345)'' , ''AL32UTF8'');



        decrypted_raw := DBMS_CRYPTO.DECRYPT( src => input_string ,
                                              typ => DBMS_CRYPTO.DES_CBC_PKCS5 ,
                                              key => key_data_raw ,
                                              iv =>  NULL);



        -- DBMS_CRYPTO.DECRYPT 수행 결과 나온 복호화 된 raw data를 varchar2로 변환하면 끝!

        converted_string := UTL_I18N.RAW_TO_CHAR(decrypted_raw, ''AL32UTF8'');



        RETURN converted_string;

    END decrypt ;

END pkg_crypto;
';
DBMS_DDL.CREATE_WRAPPED (src);

EXCEPTION WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(SQLERRM);
END ;

 

2. 결과

create or replace PACKAGE BODY pkg_crypto wrapped 
a000000
369
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
b
61a 23b
NBzrSQ0lRU8vf753ZBRK8y9KN40wg+23Na7WfI7GAE4+I9Zs2cIt7m+cWIlhajkrS4mI3AAw
pY+vlTAIBQXyMaMEyW3Uv8W7jaq1u4Gx4VGOGzbbreKv7oHpIp2qHCIZetCnQZ4OUc9H58GY
ZcweAF19+5t854wRoGEe57YNyT3RG89V+UU7BNMhF6l82x7mqanCUdPCjm7CNmmfjjaMiyjd
9E1XHXYiKvS3KKQ+JmxA4fJcIMcniFbo694egFuXMUG4NUsNCGgihva4DwOCG70BYfBr1rnf
DtNYGgOUEyEA8vceGAX+BM58EweNtOLPBfAFVUsEpvlWbpZRBUOXu/SQxylhJkZSNNVDv9FP
dVEJYq3hE/jcroaMlwKo/OYKtIBwUad/8ekYl1qtvCsJsmAMe06+gx9V9rICEae+x2WFrYRl
xOYESE4QTX++0/zfqmaY0PfMLZqjH4MMLDcIwd1VtqTKNL/UZN71VfUEIZUO6VAQ0RkPHX1z
JD/W0nOmNwDHMugcU7w03YhDpduyMkyTmc2ncI0lT+nsdTc77ROWeaBgCg==

 

프로시저 또한 동일하게 소스 암호화가 가능하다