이번에는 복호화 함수를 만들어 보자.

    입력

        /* 9. 복호화 함수 **************************************************************************************************************************/
          FUNCTION fn_decrypt ( prw_encrypt IN RAW )
                   RETURN VARCHAR2
          IS
            vs_return VARCHAR2(100);
            v_key_raw RAW(32747);         -- 암호화 키
            encryption_type PLS_INTEGER;  -- 암호화 슈트
            decrypted_raw   RAW (2000);   -- 복호화 데이터
          BEGIN
            -- 암호화 키 값을 가져온다.
            v_key_raw := ch19_wrap_pkg.key_bytes_raw;
    
          -- 암호화 슈트 설정
          encryption_type := DBMS_CRYPTO.ENCRYPT_AES256 + -- 256비트 키를 사용한 AES 암호화
                             DBMS_CRYPTO.CHAIN_CBC +      -- CBC 모드
                             DBMS_CRYPTO.PAD_PKCS5;       -- PKCS5로 이루어진 패딩
    
            -- 매개변수로 들어온 RAW 타입 데이터를 다시 복호화 ( 암호화했던 키와 암호화 슈트는 동일하게 사용해야 한다. )
            decrypted_raw := DBMS_CRYPTO.DECRYPT ( src => prw_encrypt,
                                                   typ => encryption_type,
                                                   key => v_key_raw
                                                 );
             -- 복호화된 RAW 타입 데이터를 UTL_I18N.RAW_TO_CHAR를 사용해 다시 VARCHAR2로 변환
             vs_return := UTL_I18N.RAW_TO_CHAR (decrypted_raw, 'AL32UTF8');
    
             RETURN vs_return;
          END fn_decrypt;
    

    결과

        PACKAGE BODY MY_UTIL_PKG이(가) 컴파일되었습니다.
    

    성공적으로 컴파일이 되었으니 암호화 함수를 테스트하자. 이전에 사용했던 ch19_user 테이블에 전화번호 컬럼을 추가해 보자.

    입력

        ALTER TABLE ch19_userADD phone_number RAW(2000);
    

    결과

        table CH19_USER이(가) 변경되었습니다.
    

    전화번호를 fn_encrypt 함수의 매개변수로 받아 암호화한 다음 이 결과를 위 테이블의 전화번호 컬럼에 저장해 보자.

    입력

        BEGIN
          -- 홍길동의 전화번호를 암호화한 뒤 저장한다.
          UPDATE ch19_user
             SET phone_number = my_util_pkg.fn_encrypt('010-0000-0001')
           WHERE user_id = 'gdhong';
    
          COMMIT;
        END;
    

    결과

        익명 블록이 완료되었습니다.
    

    ch19_user 테이블을 조회해 제대로 암호화됐는지 확인해 보자.

    입력

        SELECT *
          FROM ch19_user;
    

    결과

    전화번호가 암호화되어 저장된 것을 알 수 있다. 이번에는 거꾸로 저장된 전화번호를 복호화해 보자.

    입력

        DECLARE
          v_raw RAW(2000);
          vs_phone_number VARCHAR2(50);
        BEGIN
          -- 홍길동의 전화번호를 가져온다.
          SELECT phone_number
            INTO v_raw
            FROM ch19_user
           WHERE user_id = 'gdhong';
    
          -- RAW 타입의 전화번호를 복호화 함수에 넣어 원래 문자형태의 전화번호를 얻는다.
          vs_phone_number := my_util_pkg.fn_decrypt(v_raw);
          DBMS_OUTPUT.PUT_LINE('전화번호 : ' || vs_phone_number);
        END;
    

    결과

        전화번호 : 010-0000-0001
    
    신간 소식 구독하기
    뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.