더북(TheBook)

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

입력

    /* 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
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.