오라클 10g 이상에서 사용할 수 있는 DBMS_CRYPTO 패키지를 이용하여 암호화 하는 방법
- DBMS_CRYPTO 패키지 생성
설치 되어 있지 않을 경우 다음의 SQL을 수행해서 패키지를 생성한다. /$ORACLE_HOME/rdbms/admin/dbmsobtk.sql /$ORACLE_HOME/rdbms/admin/prvtobtk.plb |
두 패키지를 추가하는 방법..
A. 오라클 서버에 sysdba으로 접속.
>sqlplus “/ as sysdba”
B. ‘dbmsobtk.sql’ 파일 실행.
리눅스 : @$ORACLE_HOME/rdbms/admin/dbmsobtk.sql;
윈도우 : @%ORACLE_HOME%/rdbms/admin/dbmsobtk.sql;
C. ‘prvtobtk.plb’ 파일 실행.
리눅스 : @$ORACLE_HOME/rdbms/admin/prvtobtk.plb;
윈도우 : @%ORACLE_HOME%/rdbms/admin/prvtobtk.plb;
D. 추가 후 시스템 계정으로만 사용 가능하기 때문에 권한 변경.
이 경우 모두다 실행 가능하도록 하였지만 필요하다면 특정 계정에만 실행권한 주면됨.
grant execute on dbms_crypto to public;
grant execute on dbms_obfuscation_toolkit to public;
# 참고) 콘솔에서 실행 전체 과정.
>sqlplus “/ as sysdba”
SQL>
SQL> @/oracle/rdbms/admin/dbmsobtk.sql
(중간 생략)
No errors.
Synonym created.
SQL> @/oracle/rdbms/admin/prvtobtk.plb
(중간 생략)
Package body created.
No errors.
SQL> grant execute on dbms_crypto to public;
Grant succeeded.
SQL> grant execute on dbms_obfuscation_toolkit to public;
Grant succeeded.
- SYS유저에서 사용할 패키지를 생성 함.
테스트에서 사용 할 암호 키 값은 ‘12345678‘을 사용한다.
DOWNLOAD SAMPLE SCRIPT : CRYPTO_PACKAGE_CREATE_SCRIPT
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; |
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_PKG_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_PKG_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; |
- 사용할 유저에게 실행 권한 부여
기본적으로 DBMS_CRYPTO 패키지 권한 만 부여하면 되지만, 혹시 안 될 경우 두 개의 패키지에 대한 사용 권한을 준다.
grant execute on pkg_crypto to USER; |
- 테스트
패키지가 정상적으로 생성되었는지 테스트 SQL> select sys.pkg_crypto.encrypt ( ‘test’ ) from dual ; A04B686B118AF67B SQL> select sys.pkg_crypto.decrypt ( ‘A04B686B118AF67B’ ) from dual ; test SQL> create table test_crypto (id int , pwd varchar2(64)) ; SQL> insert into test_crypto values (1, sys.pkg_crypto.encrypt(‘password1’) ) ; SQL> insert into test_crypto values (2, sys.pkg_crypto.encrypt(‘password2’) ) ; SQL> commit ; SQL> select * from test_crypto ; 1 8A65E0E80532B5FADACA597658B8E8E0 2 8A65E0E80532B5FA6635EBCA6EB4D195 SQL> select id , sys.pkg_crypto.decrypt(pwd) from test_crypto ; 1 password1 2 password2 |
- 패키지 소스 암호화 (WRAP)
패키지 바디 부분을 SQL 파일로 저장한 후에, 해당 SQL파일을 오라클의 WRAP 명령을 이용하여 소스를 암호화 한다.
암호화된 소스를 이용하여 패키지를 생성한다.
패키지 바디 부분을 pkg_crypto.sql 파일로 만든 후에, WRAP 명령을 이용하여 소스 암호화를 진행 한다. ..\client_1\BIN>wrap iname=pkg_crypto.sql oname=pkg_crypto.plb PL/SQL Wrapper: Release 19c.0- Production on Wed Sep 14 12:59:27 2019 Copyright (c) 1993, 2019, Oracle. All rights reserved. Processing pkg_crypto.sql to pkg_crypto.plb pkg_crypto.plb 파일을 실행 시켜도 되고, 메모장으로 열어서 사용하는 툴에 붙여 넣어서 수행 시켜도 됨. |
SQL> select text from dba_source where name = ‘PKG_CRYPTO’;
PACKAGE pkg_crypto IS FUNCTION encrypt ( input_string IN VARCHAR2 ) RETURN RAW; FUNCTION decrypt ( input_string IN VARCHAR2 ) RETURN VARCHAR2; END pkg_crypto;
— pkg_crypto.plb PACKAGE BODY pkg_crypto wrapped a000000 34e abcd abcd abcd abcd abcd abcd abcd abcd abcd abcd abcd abcd abcd abcd abcd b 569 237 ohqkYyNGzuK44ZjD/dc7zE6LBD4wg5VeACDWfC/NR2SlOfdRWqio8BgJ+rTLDeZ0KhuUtwfL pHsh5UXSmrE5hH7n/MYlulcFuxz+/3JEolt108hdUznBsR865PlC+TBOESlCZ+k6dfP/0AHl m7ZdffubfOeMEW+6xue2jQP8dS8cEnnuvOBaUG77FS9kmfvhlxjyhQm4lwlnk65byQ4mpm7j GILd7l4DK2J9rhLoBmcn9GupCftFAI05Ew3eYFuXMfS4NUsCqzdZDLE1ssWoPgFg+nUzSFvF 96FFaMLpCoAYcU9Tq8HdBzHF2Ns/HrqqvzJZx/uPlmo9e4NoSHOonHhr6S2BSS6PXVSXOfeW dCG489cqwDaf/h2Nxx6WEONFUFoTb7aNG1pvW8Ng5SfDjDYeq4D+lAQA3onCzKeT6/y2hsuA IJnvdL8FCN3PdeQlz1W8zWexpkBqPyhKvj+RXuuxlTfRnM2voRmdrRch6sSNazdobfnUJOL4 tbN6GdLtMV5ecSORI6U3gkDu9v0wuFojLTjBxLTrCgbIq5AI1x9AOIKC |