티스토리 뷰
* 오라클 계정에서 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
- 구분자 자르기
- 1차원 배열저장
- CKFinder
- HTTPD
- 엔티티 코드표
- resttemplate
- postForObject
- php
- selinux
- 파일명 공백
- iis 파일 다운로드 공백
- CKEditor
- 정규식
- Entity Code
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |