태그 보관물: CRYPTO

How to use Oracle dbms_crypto (crypto package library)

오라클 10g 이상에서 사용할 수 있는 DBMS_CRYPTO 패키지를 이용하여 암호화 하는 방법

  1. 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.

 

  1. 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;

 

  1. 사용할 유저에게 실행 권한 부여

기본적으로 DBMS_CRYPTO 패키지 권한 만 부여하면 되지만, 혹시 안 될 경우 두 개의 패키지에 대한 사용 권한을 준다.

grant execute on pkg_crypto to USER;

 

  1. 테스트

패키지가 정상적으로 생성되었는지 테스트

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

 

  1. 패키지 소스 암호화 (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