간단한 암호화
사용방법
select rawtohex(DBMS_CRYPTO.Hash(to_clob(passwd),2)) from dual;
두번째 파라미터
1 : md4, 2 : md5, 3 : sh1 암호화 방식을 의미
넣을때 암호화하여 넣고, 비교할 때 문자열을 암호화 하여 비교 한다.
문자열 암호화 : rawtohex(DBMS_CRYPTO.Hash(to_clob(to_char('inputpw')),2))
여기서부터는 sqlplus를 이용해 작성한다.
-- dbms_crypto 에 대한 실행 권한만 부여하면 권한은 끝!
grant execute on DBMS_CRYPTO to sinu;
-- package 껍데기
CREATE OR REPLACE PACKAGE king_crypto
-- package 껍데기
CREATE OR REPLACE PACKAGE king_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 king_crypto;
/
-- package body 를 살펴보자
CREATE OR REPLACE PACKAGE BODY king_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(64);
converted_raw RAW(64);
encrypted_raw RAW(64);
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;
END encrypt;
FUNCTION decrypt (input_string IN VARCHAR2 , key_data IN VARCHAR2 := '12345678')
RETURN VARCHAR2
IS
converted_string VARCHAR2(64);
key_data_raw RAW(64);
decrypted_raw VARCHAR2(64);
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;
END decrypt ;
END king_crypto;
/
create table card_info ( id number, card_number varchar2(64) ) ;
-- 8자리 16자리 data 를 넣어보자.
insert into card_info values ( 1 , pkg_crypto.encrypt('1234567812345678')) ;
insert into card_info values ( 2 , pkg_crypto.encrypt('12345678')) ;
commit;
-- 암호화 되어 return 되는 bytes 가 다르다!
select * from card_info ;
ID CARD_NUMBER
---------- ----------------------------------------------------------------
1 96D0028878D58C89D73FBE0238428B0A3D440C49910337FB
2 96D0028878D58C898E250D5F4C76644B
-- 복호화 해보니 정상적으로 잘 보인다.
select id , pkg_crypto.decrypt(card_number) card_number
from card_info;
ID CARD_NUMBER
---------- ----------------------------------------------------------------
1 1234567812345678
2 12345678
-- key value 를 00000000 으로 바꾸어 보자
insert into card_info values ( 3 , pkg_crypto.encrypt('1234567812345678','00000000')) ;
-- 데이터는 id=1 과 같은데 key 가 다르므로 암호화된 값이 다름을 알 수 있다.
select * from card_info where id = 3;
ID CARD_NUMBER
---------- ----------------------------------------------------------------
3 858B176DA8B125034356364E8179CD61040EE2CAC3041331
-- 복호화 할 때는 반드시 암호화 시 사용했던 key value 가 필요하다.
select id , pkg_crypto.decrypt(card_number,'00000000') card_number from card_info where id = 3 ;
ID CARD_NUMBER
---------- ----------------------------------------------------------------
3 1234567812345678
출처 http://www.rudaks.co.kr/post/1316
'데이터베이스 > Oracle' 카테고리의 다른 글
Oracle Access와 Oracle 데이터타입 매핑 (0) | 2015.11.06 |
---|---|
Oracle 현재날짜 기준 (한달전,어제,1년전 등등 쿼리) (0) | 2015.10.13 |
Oracle sys 계정로그인 & 비밀번호 변경 (0) | 2015.10.06 |
Oracle 한글깨짐 (0) | 2015.10.05 |
Oracle 시퀀스 (0) | 2015.09.23 |