티스토리 뷰
CREATE OR REPLACE PACKAGE ENCUTIL
IS
/*******************************************************************************
PURPOSE : 평문 문자열을 암호화(Encryption)하는 Function
특기사항 : Oracle 에서 제공하는 AES128 암호화 알고리즘 Package 사용
/******************************************************************************/
FUNCTION f_ENC
(
p_str VARCHAR2, -- 평문 입력 문자열
p_enc_key_str VARCHAR2 -- 암호화 키
)
RETURN RAW;
/*******************************************************************************
PURPOSE : 암호화된 문자열을 평문으로 복호화(Decryption)하는 Function
특기사항 : Oracle 에서 제공하는 AES128 암호화 알고리즘 Package 사용
/******************************************************************************/
FUNCTION f_DEC
(
p_str VARCHAR2, -- 암호화된 입력 문자열
p_dec_key_str VARCHAR2 -- 복호화 키
)
RETURN VARCHAR2;
/*******************************************************************************
PURPOSE : 특정DB에서만 암복호화가 이루어지도록 제한
특기사항 : Oracle DBID사용
/******************************************************************************/
PROCEDURE dCheck;
FUNCTION TestP
RETURN VARCHAR2;
END; -- Package spec
/
CREATE OR REPLACE PACKAGE BODY ENCUTIL
IS
iFlag PLS_INTEGER := 0;
/*******************************************************************************
PURPOSE : 평문 문자열을 암호화(Encryption)하는 Function
특기사항 : Oracle 에서 제공하는 AES128 암호화 알고리즘 Package 사용
/******************************************************************************/
FUNCTION f_ENC
(
p_str VARCHAR2, -- 평문 입력 문자열
p_enc_key_str VARCHAR2 -- 암호화 키
)
RETURN RAW
IS
l_type NUMBER := dbms_crypto.ENCRYPT_AES128
+ dbms_crypto.CHAIN_CBC
+ dbms_crypto.PAD_PKCS5;
l_retval RAW ( 2000 ) ;
rPrivate_key RAW( 128 );
BEGIN
IF p_str IS NULL THEN -- NULL은 NULL로 리턴한다.
RETURN NULL;
END IF;
IF iFlag = 0 THEN -- DBID를 비교하지 않았으면 먼저 비교한다.
dCheck;
END IF;
IF iFlag = 0 THEN -- DBID가 맞지 않으면 ''를 리턴한다.
RETURN '';
END IF;
rPrivate_key := dbms_crypto.hash( p_enc_key_str , 2 ); --128bit로 맞추기 위해
l_retval := dbms_crypto.encrypt (
utl_i18n.string_to_RAW ( p_str, 'AL32UTF8' ), l_type, rPrivate_key
);
RETURN l_retval;
END f_ENC;
/*******************************************************************************
PURPOSE : 암호화된 문자열을 평문으로 복호화(Decryption)하는 Function
특기사항 : Oracle 에서 제공하는 AES128 암호화 알고리즘 Package 사용
/******************************************************************************/
FUNCTION f_DEC
(
p_str VARCHAR2, -- 암호화된 입력 문자열
p_dec_key_str VARCHAR2 -- 복호화 키
)
RETURN VARCHAR2
is
l_decrypt RAW ( 2000 ) ;
l_type NUMBER := dbms_crypto.ENCRYPT_AES128
+ dbms_crypto.CHAIN_CBC
+ dbms_crypto.PAD_PKCS5;
rPrivate_key RAW( 128 );
BEGIN
IF p_str IS NULL THEN -- NULL은 NULL로 리턴한다.
RETURN NULL;
END IF;
IF iFlag = 0 THEN -- DBID를 비교하지 않았으면 먼저 비교한다.
dCheck;
END IF;
IF iFlag = 0 THEN -- DBID가 맞지 않으면 ''를 리턴한다.
RETURN '';
END IF;
rPrivate_key := dbms_crypto.hash( p_dec_key_str , 2 ); --128bit로 맞추기 위해
l_decrypt := dbms_crypto.decrypt ( p_str, l_type, rPrivate_key ) ;
RETURN ( utl_i18n.RAW_to_char ( l_decrypt ) ) ;
END f_DEC;
/*******************************************************************************
PURPOSE : 특정DB에서만 암복호화가 이루어지도록 제한
특기사항 : Oracle DBID사용
/******************************************************************************/
PROCEDURE dCheck AS
rHash RAW ( 128 ) := '32F5677ED22C730D884D99F615CBB4CE'; --DBID hash
nDBID NUMBER;
BEGIN
SELECT dbid
INTO nDBID
FROM v$database;
IF sys.dbms_crypto.hash( utl_raw.cast_from_number(nDBID),2) = rHash THEN --저장된 DBID hash와 현재 얻은 DBID hash를 비교
iFlag := 1;
ELSE
iFlag := 0;
END IF;
END;
FUNCTION TestP
RETURN VARCHAR2
IS
l_var VARCHAR2(4000);
BEGIN
l_var := f_ENC('PORTAL','2DAE49B9205DC3E7');
RETURN f_DEC(l_var,'2DAE49B9205DC3E7');
EXCEPTION
WHEN OTHERS THEN
htp.p(SQLERRM);
END TestP;
END ENCUTIL;
/
- Total
- Today
- Yesterday
- 챔픽스 후기
- 믹스커피
- oracle
- 윈도우10
- 100일
- 생명과학
- 금단증상
- 부작용
- 챔픽스
- 유전자
- 금연일기
- 흡연
- 통신
- 인공지능
- 지진
- DNA
- 설탕
- 보건
- 금연
- 냄새
- 챔픽스 후기 금연
- 과학
- 다이어트
- 의료
- 오라클
- 단백질
- java
- 뇌
- 상식
- 보건소
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |