티스토리 뷰

* 오라클 계정에서 sysdba 권한으로 로그인
sqlplus / as sysdba

* 암호화 패키지 추가
@$ORACLE_HOME/rdbms/admin/dbmsobtk.sql
@$ORACLE_HOME/rdbms/admin/prvtobtk.plb

* 암호화 패키지 사용권한 추가
grant execute on dbms_crypto to public;
grant execute on dbms_obfuscation_toolkit to public;

* 사용자 계정으로 로그인 하여 패키지 생성

CREATE OR REPLACE PACKAGE pkg_crypto
IS
    FUNCTION encrypt (
        input_string        IN  VARCHAR2 ,
        key_data IN VARCHAR2 := '12345678'
    ) RETURN RAW;
    

    FUNCTION decrypt (
        input_string        IN  VARCHAR2 ,
        key_data IN VARCHAR2 := '12345678'
    ) RETURN VARCHAR2;

END pkg_crypto;
/


CREATE OR REPLACE PACKAGE BODY pkg_crypto
IS
    -- 에러 발생시에 error code 와 message 를 받기 위한 변수 지정.
    SQLERRMSG   VARCHAR2(255);
    SQLERRCDE   NUMBER;

    -- 암호화 함수 선언 key_data 는 입력하지 않을 시에 default 로 12345678 로 지정됨.
    FUNCTION encrypt (input_string IN VARCHAR2 , key_data IN VARCHAR2 := '12345678')
     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(key_data, 'AL32UTF8');

        -- DBMS_CRYPTO.ENCRYPT 로 암호화 하여 encrypted_raw 에 저장.
        encrypted_raw :=
             DBMS_CRYPTO.ENCRYPT(
                 src => converted_raw ,
                -- typ 부분만 변경하면 원하는 알고리즘을 사용할 수 있다.
                --단, key value bype 가 다 다르니 확인해야 한다.
                 typ => DBMS_CRYPTO.DES_CBC_PKCS5 ,
                 key => key_data_raw ,
                 iv =>  NULL);
        RETURN encrypted_raw;

    EXCEPTION
          WHEN OTHERS THEN 
          RETURN input_string;
    END encrypt;


    FUNCTION decrypt (input_string IN VARCHAR2 , key_data IN VARCHAR2 := '12345678')
     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(key_data, '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;

    EXCEPTION
        WHEN OTHERS THEN
            RETURN input_string;
    END decrypt;
END pkg_crypto;
/


* 테스트 쿼리
select pkg_crypto.encrypt('알리알리알라숑') as enc from dual;
select pkg_crypto.decrypt('AC1C19926AA3DC63038D29E6B6B072B537DFD48ED1D57CA9') as dec from dual;
 

* 만약, 패키지는 만들었으나 암호화 실행시 "DBMS_CRYPTO 식별자가 정의되어야 합니다." 발생시
   (Oralce 11g 기준)

SYSTEM 계정으로 로그인 후 아래의 권한을 부여한다.

grant execute on DBMS_CRYPTO to MINOV;
grant execute on DBMS_CRYPTO_FFI to MINOV;
grant execute on DBMS_CRYPTO_TOOLKIT to MINOV;
grant execute on DBMS_CRYPTO_TOOLKIT_FFI to MINOV;
grant execute on DBMS_CRYPTO_TOOLKIT_TYPES to MINOV;

* 반영 해도 동일 할 경우에는 아래의 10g 예시를 따라 조치
  (Oracle 10g 기준)

create or replace PACKAGE BODY pkg_crypto
IS
    -- 에러 발생시에 error code 와 message 를 받기 위한 변수 지정.
    SQLERRMSG   VARCHAR2(255);
    SQLERRCDE   NUMBER;


    -- 암호화 함수 선언 key_data 는 입력하지 않을 시에 default 로 12345678 로 지정됨.
    FUNCTION encrypt (input_string IN VARCHAR2 , key_data IN VARCHAR2 := '12345678')
     RETURN RAW
    IS
        key_data_raw        RAW(4000);
        converted_raw       RAW(4000);
        encrypted_raw       RAW(4000);
        

        DES_CBC_PKCS5 CONSTANT PLS_INTEGER := DBMS_CRYPTO.ENCRYPT_DES
                                           + DBMS_CRYPTO.CHAIN_CBC
                                           + DBMS_CRYPTO.PAD_PKCS5;               

    BEGIN
        -- 들어온 data 와 암호키를 각각 RAW 로 변환한다.
        converted_raw := UTL_I18N.STRING_TO_RAW(input_string, 'AL32UTF8');

        key_data_raw     := UTL_I18N.STRING_TO_RAW(key_data, 'AL32UTF8');

        -- DBMS_CRYPTO.ENCRYPT 로 암호화 하여 encrypted_raw 에 저장.
        encrypted_raw :=
             DBMS_CRYPTO.ENCRYPT(
                 src => converted_raw ,
                -- typ 부분만 변경하면 원하는 알고리즘을 사용할 수 있다.
                --단, key value type 이 각기 다르니 확인해야 한다.
                 typ => DES_CBC_PKCS5 ,
                 key => key_data_raw ,
                 iv =>  NULL);
        RETURN encrypted_raw;

    EXCEPTION
          WHEN OTHERS THEN
            RETURN input_string;
    END encrypt;

    FUNCTION decrypt (input_string IN VARCHAR2 , key_data IN VARCHAR2 := '12345678')
     RETURN VARCHAR2
    IS
        converted_string    VARCHAR2(4000);
        key_data_raw        RAW(4000);
        decrypted_raw    VARCHAR2(4000);
        

        DES_CBC_PKCS5 CONSTANT PLS_INTEGER := DBMS_CRYPTO.ENCRYPT_DES
                                           + DBMS_CRYPTO.CHAIN_CBC
                                           + DBMS_CRYPTO.PAD_PKCS5;               
       

    BEGIN
        key_data_raw     := UTL_I18N.STRING_TO_RAW(key_data, 'AL32UTF8');        
        decrypted_raw :=
            DBMS_CRYPTO.DECRYPT(
                 src => input_string ,
                 typ => 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;

    EXCEPTION
        WHEN OTHERS THEN
            RETURN input_string;
    END decrypt;
END pkg_crypto;
/


참조 : http://m.blog.naver.com/eureka6846/110076105943

'DB 전체 > ORACLE' 카테고리의 다른 글

DB 복원방법  (0) 2016.05.24
ORA-00844 / ORA-00851 문제 발생시  (0) 2012.10.10
오라클 10g 64비트 OS에 설치시 문제점 및 OCI 접근문제  (0) 2011.10.19
ORACLE 재시작 명령어  (0) 2011.10.06
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함