oracle 데이터 암호화unioneinc.co.kr/upload/board/[unioneinc]cryptopackage...2014/02/06  ·...

31
. Oracle 데이터 암호화 Crypto_Package 유니원아이앤씨 DB사업부 20141219문서정보 프로젝트명 ORACLE 암호화 서브 시스템명 버전 1.0 문서명 ORACLE 암호화 작성일 2014-12-19 작성자 DB사업부 이대혁 사원 최종수정일 2014-12-19 문서번호 UNIONE-201402060432-LDH

Upload: others

Post on 03-Feb-2021

0 views

Category:

Documents


0 download

TRANSCRIPT

  • .

    Oracle 데이터 암호화 Crypto_Package

    유니원아이앤씨 DB사업부 이 대 혁

    2014년 12월 19일

    문서정보

    프로젝트명 ORACLE 암호화

    서브 시스템명 버전 1.0

    문서명 ORACLE 암호화 작성일 2014-12-19

    작성자 DB사업부 이대혁 사원 최종수정일 2014-12-19

    문서번호 UNIONE-201402060432-LDH

  • 기술지원

    Oracle 데이터 암호화 Package 작성자:이 대 혁 Version: 1.0 최종 수정일: 2014-02-06

    2/31

    재개정 이력

    일자 내용 수정인 버전

    문서배포 이력

    발신자 수신자 배포목적 일자 비고

  • 기술지원

    Oracle 데이터 암호화 Package 작성자:이 대 혁 Version: 1.0 최종 수정일: 2014-02-06

    3/31

    Table of Contents

    1 테스트 환경 .......................................................................................................................................... 4

    2 ORACLE 암호화 ...................................................................................................................................... 7

    3 DBMS_CRYPTO .................................................................................................................................. 8

    3.1 DBMS_CRYPTO 설정 ............................................................................................................................................................................. 8

    3.1.1 Package 생성 ............................................................................................................................................................................... 8

    3.1.2 권한 부여 ...................................................................................................................................................................................... 9

    3.1.3 Function 생성 ............................................................................................................................................................................... 9

    3.1.4 샘플 데이터 생성 ......................................................................................................................................................................... 11

    3.2 DBMS_CRYPTO 를 이용한 암호화 ...................................................................................................................................................... 13

    3.3 Decryt Function 을 사용한 복호화 방법 ............................................................................................................................................... 14

    3.4 Crypto insert 작업 ................................................................................................................................................................................. 15

    4 FUNCTION, PACKAGE ...................................................................................................................... 18

    5 WRAP Utility 를 이용한 PL/SQL Source 암호화 ............................................................................. 20

    5.1 Function 암호화 후 Function 조회 ....................................................................................................................................................... 22

    6 WRAP Utility 를 이용한 Package 암호화 ........................................................................................ 25

    6.1 현재 Crypt Package 내용 검색 ............................................................................................................................................................. 25

    6.2 Package Wrap ....................................................................................................................................................................................... 25

    6.3 Wrap 을 이용한 Package 암호화 ......................................................................................................................................................... 27

    6.4 Wrap 되어진 Package 내용 확인 ......................................................................................................................................................... 29

    7 암호화 컬럼의 Index 활용 ................................................................................................................. 30

  • 기술지원

    Oracle 데이터 암호화 Package 작성자:이 대 혁 Version: 1.0 최종 수정일: 2014-02-06

    4/31

    1 테스트 환경 Server : VM-ware server

    # dmidecode | grep Product

    Product Name: VMware Virtual Platform

    Product Name: 440BX Desktop Reference Platform

    O/S : RHEL 5.2 64bit

    # cat /etc/redhat-release

    Enterprise Linux Enterprise Linux Server release 5.2 (Carthage)

    CPU 정보

    # cat /proc/cpuinfo |more

    processor : 0

    vendor_id : GenuineIntel

    cpu family : 6

    model : 58

    model name : Intel(R) Core(TM) i3-3220 CPU @ 3.30GHz

    stepping : 9

  • 기술지원

    Oracle 데이터 암호화 Package 작성자:이 대 혁 Version: 1.0 최종 수정일: 2014-02-06

    5/31

    cpu MHz : 3292.410

    cache size : 3072 KB

    fpu : yes

    fpu_exception : yes

    cpuid level : 13

    wp : yes

    flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts mmx fxsr sse sse2 ss

    syscall nx rdtscp lm constant_tsc up pni cx16 popcnt lahf_lm

    bogomips : 6591.09

    clflush size : 64

    cache_alignment : 64

    address sizes : 40 bits physical, 48 bits virtual

    power management:

    Memory 정보

    # cat /proc/meminfo |more

    MemTotal: 1503640 kB

    MemFree: 30732 kB

    Buffers: 165888 kB

    Cached: 925140 kB

  • 기술지원

    Oracle 데이터 암호화 Package 작성자:이 대 혁 Version: 1.0 최종 수정일: 2014-02-06

    6/31

    SwapCached: 0 kB

    Active: 712940 kB

    Inactive: 624848 kB

    HighTotal: 0 kB

    HighFree: 0 kB

    LowTotal: 1503640 kB

    LowFree: 30732 kB

    SwapTotal: 4192956 kB

    SwapFree: 4192956 kB

    Dirty: 4 kB

    Writeback: 0 kB

    AnonPages: 246752 kB

    Mapped: 262804 kB

    Slab: 73504 kB

    PageTables: 37204 kB

    NFS_Unstable: 0 kB

    Bounce: 0 kB

    CommitLimit: 4944776 kB

    Committed_AS: 2143132 kB

    VmallocTotal: 34359738367 kB

  • 기술지원

    Oracle 데이터 암호화 Package 작성자:이 대 혁 Version: 1.0 최종 수정일: 2014-02-06

    7/31

    VmallocUsed: 264988 kB

    VmallocChunk: 34359472887 kB

    HugePages_Total: 0

    HugePages_Free: 0

    HugePages_Rsvd: 0

    Hugepagesize: 2048 kB

    Target Oracle Vesion : Oracle 10.2.0.5 EE 64bit

    Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - 64bit Production

    2 ORACLE 암호화 테이블의 컬럼을 암호화 하기 위한 상용 소프트웨어는 다양하지만 비용이 발생할 수 밖에 없습니다.

    Oracle 에서 제공하는 Package를 통해 테이블의 컬럼을 암호화 할 수 있는 기능을 소개합니다.

    Oracle 9i 까지는 DBMS_OBFUSCATION_TOOLKIT 으로, 10g 부터는 추가로 DBMS_CRYPTO 를 이용하여 테이블의 컬럼을 암호화 할 수 있습니다.

  • 기술지원

    Oracle 데이터 암호화 Package 작성자:이 대 혁 Version: 1.0 최종 수정일: 2014-02-06

    8/31

    3 DBMS_CRYPTO 3.1 DBMS_CRYPTO 설정 3.1.1 Package 생성 SQL> @?/rdbms/admin/dbmsobtk.sql

    Library created.

    No errors.

    Library created.

    No errors.

    Package created.

    Synonym created.

    Package created.

    No errors.

    Synonym created.

    Grant succeeded.

    No errors.

    Package created.

    No errors.

    Synonym created.

    SQL> @?/rdbms/admin/prvtobtk.plb

    Package created.

    Package body created.

  • 기술지원

    Oracle 데이터 암호화 Package 작성자:이 대 혁 Version: 1.0 최종 수정일: 2014-02-06

    9/31

    Package body created.

    Package created.

    No errors.

    Package body created.

    No errors.

    Package body created.

    No errors.

    Package body created.

    No errors.

    3.1.2 권한 부여 SQL> GRANT execute ON sys.dbms_crypto TO public;

    SQL> GRANT execute ON sys.dbms_crypto TO test;

    3.1.3 Function 생성 National Character Set 확인

    SQL> select * from nls_database_parameter where parameter=’NLS_NCHAR_CHARACTERSET’;

    PARAMETER VALUE

    ------------------------------- ---------------------------------------------------------------------------------------

    NLS_NCHAR_CHARACTERSET AL16UTF16

    Encrypt Function 생성

    SQL> create or replace function encrypt(v_string in varchar2) return varchar2 is

  • 기술지원

    Oracle 데이터 암호화 Package 작성자:이 대 혁 Version: 1.0 최종 수정일: 2014-02-06

    10/31

    2 encrypted_raw RAW (2000);

    3 encryption_type PLS_INTEGER := SYS.DBMS_CRYPTO.ENCRYPT_DES +

    4 SYS.DBMS_CRYPTO.CHAIN_CBC + SYS.DBMS_CRYPTO.PAD_PKCS5;

    5 v_key raw(128) := utl_i18n.string_to_raw('unione', 'AL16UTF16' );

    6 begin

    7 encrypted_raw := DBMS_CRYPTO.ENCRYPT

    8 (

    9 src => UTL_I18N.STRING_TO_RAW (v_string,'AL16UTF16'),

    10 typ => encryption_type,

    11 key => v_key

    12 );

    13 return RAWTOHEX(encrypted_raw);

    14 end encrypt;

    15 /

    Function created.

    Decrypt Function 생성

    SQL> create or replace function decrypt(v_str in varchar2) return varchar2 is

    2 decrypted_raw raw(2000);

    3 encryption_type PLS_INTEGER := SYS.DBMS_CRYPTO.ENCRYPT_DES +

    4 SYS.DBMS_CRYPTO.CHAIN_CBC + SYS.DBMS_CRYPTO.PAD_PKCS5;

  • 기술지원

    Oracle 데이터 암호화 Package 작성자:이 대 혁 Version: 1.0 최종 수정일: 2014-02-06

    11/31

    5 v_key raw(128) := utl_i18n.string_to_raw( 'unione', 'AL16UTF16' );

    6 begin

    7 decrypted_raw := DBMS_CRYPTO.Decrypt

    8 (

    9 src => HEXTORAW(v_str),

    10 typ => encryption_type,

    11 key => v_key

    12 );

    13 return UTL_I18N.RAW_TO_CHAR (decrypted_raw, 'AL16UTF16');

    14 end decrypt;

    15 /

    Function created.

    3.1.4 샘플 데이터 생성 SQL> create table crypto_test(번호 number , 성명 varchar2(10) , 주민등록번호 varchar2(14)) ;

    Table created.

    SQL> desc crypto_test

  • 기술지원

    Oracle 데이터 암호화 Package 작성자:이 대 혁 Version: 1.0 최종 수정일: 2014-02-06

    12/31

    Name Null Type

    ----------------------------------------- -------- ----------------------------

    번호 NUMBER

    성명 VARCHAR2(10)

    주민등록번호 VARCHAR2(14)

    SQL> INSERT into crypto_test VALUES(1,'이대혁','111111-1111111');

    1 row created.

    SQL> INSERT into crypto_test VALUES(2,'김성한','222222-2222222');

    1 row created.

    SQL> INSERT into crypto_test VALUES(3,'권순기','333333-3333333');

    1 row created.

    SQL> INSERT into crypto_test VALUES(4,'유명수','444444-4444444');

    1 row created.

    SQL> INSERT into crypto_test VALUES(5,'심현승','555555-5555555');

  • 기술지원

    Oracle 데이터 암호화 Package 작성자:이 대 혁 Version: 1.0 최종 수정일: 2014-02-06

    13/31

    1 row created.

    SQL> select * from crypto_test;

    번호 성명 주민등록번호

    ---------- ---------- --------------

    1 이대혁 111111-1111111

    2 김성한 222222-2222222

    3 권순기 333333-3333333

    4 유명수 444444-4444444

    5 심현승 555555-5555555

    3.2 DBMS_CRYPTO 를 이용한 암호화

    SQL> update crypto_test set 주민등록번호=encrypt(주민등록번호);

    update crypto_test set 주민등록번호=encrypt(주민등록번호)

    *

    ERROR at line 1:

    ORA-12899: value too large for column "SYS"."CRYPTO_TEST"."주민등록번호"

    (actual: 64, maximum: 14)

    컬럼 사이즈 부족으로 Error 발생

    SQL> ALTER TABLE crypto_test MODIFY 주민등록번호 VARCHAR2(100);

  • 기술지원

    Oracle 데이터 암호화 Package 작성자:이 대 혁 Version: 1.0 최종 수정일: 2014-02-06

    14/31

    Table altered.

    SQL> update crypto_test set 주민등록번호=encrypt(주민등록번호);

    5 rows updated.

    SQL> select * from crypto_teset;

    번호 성명 주민등록번호

    ---------- ---------- ----------------------------------------------------------------------------------------------------

    1 이대혁 632D19693C9AA9BC86DC844C9BF01041BFBB3C005F10DF0C6F13F1CBE74D34BA

    2 김성한 61F0D8EB431962C1D00744690FBD3177D83B6F42DD1B6CBE1624EB93EB35E9F0

    3 권순기 998E23E7B9F32F70DE115CDB8126ED1E02DE4DA995B880AD9FF451F78422E527

    4 유명수 0FAA3ED3F07E6A00A0EB0F270E883F43D88F87812E1085DDD16864C6B79C9BB3

    5 심현승 B7B012A42729ADB0194C424197849C2EEF79B6A64D487C9969527680645C608C

    5 rows selected.

    3.3 Decryt Function 을 사용한 복호화 방법

    SQL> select 번호 , 성명 , Decrypt(주민등록번호) from crypto_test ;

  • 기술지원

    Oracle 데이터 암호화 Package 작성자:이 대 혁 Version: 1.0 최종 수정일: 2014-02-06

    15/31

    번호 성명 DECRYPT(주민등록번호)

    ---------- ---------- --------------------------------------------------

    1 이대혁 111111-1111111

    2 김성한 222222-2222222

    3 권순기 333333-3333333

    4 유명수 444444-4444444

    5 심현승 555555-5555555

    3.4 Crypto insert 작업

    SQL> INSERT into crypto_test VALUES(6,'임동규',ENCRYPT('555555-5555555'));

    1 row created.

    SQL> select * from crypto_test;

    번호 성명 주민등록번호

    ---------- ---------- ----------------------------------------------------------------------------------------------------

    1 이대혁 632D19693C9AA9BC86DC844C9BF01041BFBB3C005F10DF0C6F13F1CBE74D34BA

    2 김성한 61F0D8EB431962C1D00744690FBD3177D83B6F42DD1B6CBE1624EB93EB35E9F0

    3 권순기 998E23E7B9F32F70DE115CDB8126ED1E02DE4DA995B880AD9FF451F78422E527

  • 기술지원

    Oracle 데이터 암호화 Package 작성자:이 대 혁 Version: 1.0 최종 수정일: 2014-02-06

    16/31

    4 유명수 0FAA3ED3F07E6A00A0EB0F270E883F43D88F87812E1085DDD16864C6B79C9BB3

    5 심현승 B7B012A42729ADB0194C424197849C2EEF79B6A64D487C9969527680645C608C

    6 임동규 B7B012A42729ADB0194C424197849C2EEF79B6A64D487C9969527680645C608C

    6번과 5번이 같은 주민번호(555555-5555555)를 입력하게 되면 안호화된 값이 동일하다는 것을 알 수 있습니다.

    dbms_crypto는 같은 값의 데이터는 암호화된 값도 같게 됩니다. 주민번호는 같을 수 없으므로 문제가 없지만 다른 컬럼 암호화시

    주의를 해야하는 사항이 됩니다.

    SQL> update crypto_test set 주민등록번호 = ENCRYPT(주민등록번호)

    2 where 성명='임동규';

    1 row updated.

    SQL> /

    번호 성명 주민등록번호

    ---------- -------------------- --------------------------------------------------------------------------------

    1 이대혁 632D19693C9AA9BC86DC844C9BF01041BFBB3C005F10DF0C6F13F1CBE74D34BA

    2 김성한 61F0D8EB431962C1D00744690FBD3177D83B6F42DD1B6CBE1624EB93EB35E9F0

    3 권순기 998E23E7B9F32F70DE115CDB8126ED1E02DE4DA995B880AD9FF451F78422E527

    4 유명수 0FAA3ED3F07E6A00A0EB0F270E883F43D88F87812E1085DDD16864C6B79C9BB3

  • 기술지원

    Oracle 데이터 암호화 Package 작성자:이 대 혁 Version: 1.0 최종 수정일: 2014-02-06

    17/31

    5 심현승 B7B012A42729ADB0194C424197849C2EEF79B6A64D487C9969527680645C608C

    6 임동규 4E3B23DE9282EE57CA2EC4B866EAE3BFA87EA2EE5653F78C6A8B804B58C2C0906204D76115FD0047

    33E29EAF61ECEAF4826FCD55E81261DD076DC5508D94D0C1B9B7A3AF5CE46327C19382BC7AE9D2F3

    A9D5E51AD1B20833A17594F6BCD72A006BE94C37A3C7AB94EE20468B81122286A1316F96F6D0E74E

    53C230B9CAA4FBFFCBEC45870A99DF51

    6 rows selected.

    암호화된 컬럼을 또다시 암호화를 할경우, 컬럼에 필요한 값이 증가하게 되고, 2중 암호화가 됩니다.

    2중 암호화된 컬럼을 복호화를 하면 처음 암호화했을때의 값으로 돌아오게 됩니다.

    암호화한 테이타에 다시 암호화를 수행하면 테이타가 2중암호화가 되며, 2중 암호화가 되면 사이즈가 더 늘어나게 됩니다.

    2중암호화를 복호화 하기 위해서는 2중 복호화를 수행해야 합니다.

    암호화 방식이 기존의 데이터에 암호화데이타가 추가로 삽입이 되므로 같은 값의 데이터를 암호화 하게 되면 암호화된 값은

    같아집니다.

    SQL> update crypto_test set 주민등록번호 = DECRYPT(주민등록번호)

    2 where 성명='임동규';

    1 row updated.

    SQL> select * from crypto_test ;

    번호 성명 주민등록번호

  • 기술지원

    Oracle 데이터 암호화 Package 작성자:이 대 혁 Version: 1.0 최종 수정일: 2014-02-06

    18/31

    ---------- -------------------- --------------------------------------------------------------------------------

    1 이대혁 632D19693C9AA9BC86DC844C9BF01041BFBB3C005F10DF0C6F13F1CBE74D34BA

    2 김성한 61F0D8EB431962C1D00744690FBD3177D83B6F42DD1B6CBE1624EB93EB35E9F0

    3 권순기 998E23E7B9F32F70DE115CDB8126ED1E02DE4DA995B880AD9FF451F78422E527

    4 유명수 0FAA3ED3F07E6A00A0EB0F270E883F43D88F87812E1085DDD16864C6B79C9BB3

    5 심현승 B7B012A42729ADB0194C424197849C2EEF79B6A64D487C9969527680645C608C

    6 임동규 B7B012A42729ADB0194C424197849C2EEF79B6A64D487C9969527680645C608C

    6 rows selected.

    4 FUNCTION, PACKAGE 암호화/복호화는 function의 name만으로 작업이 가능하며, function의 name을 알고있는 사람은 누구가 암호화된 값을 복호화해서 조회가 가능하게 됩니다.따라서 function을 암호화 하는 방안을 시도해 보도록 하겠습니다.

    SQL> select * from user_source where name='ENCRYPT' or name='DECRYPT';

    NAME TYPE LINE TEXT

    ------------------------------ ------------ ---------- ----------------------------------------------------------------------

    DECRYPT FUNCTION 1 function decrypt(v_str in varchar2) return varchar2 is

    DECRYPT FUNCTION 2 decrypted_raw raw(2000);

    DECRYPT FUNCTION 3 encryption_type PLS_INTEGER := SYS.DBMS_CRYPTO.ENCRYPT_DES +

    DECRYPT FUNCTION 4 SYS.DBMS_CRYPTO.CHAIN_CBC + SYS.DBMS_CRYPTO.PAD_PKCS5;

  • 기술지원

    Oracle 데이터 암호화 Package 작성자:이 대 혁 Version: 1.0 최종 수정일: 2014-02-06

    19/31

    DECRYPT FUNCTION 5 v_key raw(128) := utl_i18n.string_to_raw( 'unione', 'AL16UTF16' );

    DECRYPT FUNCTION 6 begin

    DECRYPT FUNCTION 7 decrypted_raw := DBMS_CRYPTO.Decrypt

    DECRYPT FUNCTION 8 (

    DECRYPT FUNCTION 9 src => HEXTORAW(v_str),

    DECRYPT FUNCTION 10 typ => encryption_type,

    DECRYPT FUNCTION 11 key => v_key

    DECRYPT FUNCTION 12 );

    DECRYPT FUNCTION 13 return UTL_I18N.RAW_TO_CHAR (decrypted_raw, 'AL16UTF16');

    DECRYPT FUNCTION 14 end decrypt;

    ENCRYPT FUNCTION 1 function encrypt(v_string in varchar2) return varchar2 is

    ENCRYPT FUNCTION 2 encrypted_raw RAW (2000);

    ENCRYPT FUNCTION 3 encryption_type PLS_INTEGER := SYS.DBMS_CRYPTO.ENCRYPT_DES +

    ENCRYPT FUNCTION 4 SYS.DBMS_CRYPTO.CHAIN_CBC + SYS.DBMS_CRYPTO.PAD_PKCS5;

    ENCRYPT FUNCTION 5 v_key raw(128) := utl_i18n.string_to_raw('unione', 'AL16UTF16' );

    ENCRYPT FUNCTION 6 begin

    ENCRYPT FUNCTION 7 encrypted_raw := DBMS_CRYPTO.ENCRYPT

    ENCRYPT FUNCTION 8 (

    ENCRYPT FUNCTION 9 src => UTL_I18N.STRING_TO_RAW (v_string,'AL16UTF16'),

    ENCRYPT FUNCTION 10 typ => encryption_type,

    ENCRYPT FUNCTION 11 key => v_key

    ENCRYPT FUNCTION 12 );

    ENCRYPT FUNCTION 13 return RAWTOHEX(encrypted_raw);

  • 기술지원

    Oracle 데이터 암호화 Package 작성자:이 대 혁 Version: 1.0 최종 수정일: 2014-02-06

    20/31

    ENCRYPT FUNCTION 14 end encrypt;

    28 rows selected.

    5 WRAP Utility 를 이용한 PL/SQL Source 암호화 Vi 를 이용해서 Encrypt Function 의 Source encrypt.sql 파일을 작성합니다.

    Vi 를 이용해서 Decrypt Function 의 Source decrypt.sql 파일을 작성합니다.

    OS 프롬프트에서 다음의 명령어로 암호화된 코드를 생성합니다.

    ( 단 위에서 생성한 encrypt.sql 과 decrypt.sql 파일이 있는 위치에서 수행합니다. )

    - Wrap iname=encrypt.sql oname=encrypt2.sql

    - Wrap iname=decrypt.sql oname=decrypt2.sql

    SQL 로 접속 후 encrypt2.sql 과 decrypt2.sql 을 실행시킵니다.

    /oracle $wrap iname=encrypt.sql oname=encrypt2.sql

    PL/SQL Wrapper: Release 10.2.0.5.0- 64bit Production on Wed Jan 29 00:12:53 2014

    Copyright (c) 1993, 2004, Oracle. All rights reserved.

    Processing decrypt.sql to decrypt2.sql

    /oracle $wrap iname=decrypt.sql oname=decrypt2.sql

  • 기술지원

    Oracle 데이터 암호화 Package 작성자:이 대 혁 Version: 1.0 최종 수정일: 2014-02-06

    21/31

    PL/SQL Wrapper: Release 10.2.0.5.0- 64bit Production on Wed Jan 29 00:13:20 2014

    Copyright (c) 1993, 2004, Oracle. All rights reserved.

    Processing encrypt.sql to encrypt2.sql

    /oracle $sqlplus / as sysdba

    SQL*Plus: Release 10.2.0.5.0 - Production on Wed Jan 29 00:15:04 2014

    Copyright (c) 1982, 2010, Oracle. All Rights Reserved.

    Connected to:

    Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - 64bit Production

    With the Partitioning, OLAP, Data Mining and Real Application Testing options

    SQL> @encrypt2.sql

    Function created.

    SQL> @decrypt2.sql

  • 기술지원

    Oracle 데이터 암호화 Package 작성자:이 대 혁 Version: 1.0 최종 수정일: 2014-02-06

    22/31

    Function created.

    5.1 Function 암호화 후 Function 조회

    SQL> select * from user_source where type = 'FUNCTION';

    NAME TYPE LINE TEXT

    ---------- -------- ---------- ---------------------------------------------------------------------------

    DECRYPT FUNCTION 1 function decrypt wrapped

    a000000

    34e

    abcd

    abcd

    abcd

    abcd

    abcd

    abcd

    abcd

    abcd

    abcd

    abcd

    abcd

    abcd

  • 기술지원

    Oracle 데이터 암호화 Package 작성자:이 대 혁 Version: 1.0 최종 수정일: 2014-02-06

    23/31

    abcd

    abcd

    abcd

    8

    1bd 185

    D/YhBYfTCm7yUqyy/+9E/BDqnq4wgwHIf65qfC8CWHPVSAxRYMzT9OVmxQngD14KlfR+Scgp

    OX3dCS+sN6rQeeln66/Z7U4Smu1VDlONkKyc607G/vgXevEtqxqsLTzPDx5l+/CfUKodyEC9

    XSP8Yp4lge9TH5xCQUmUhJQ2wVqf/POSjKgmVmFN7kiZyWVYERx0AjvRE7GhDjeUuuXR3MUG

    sgc9PXK8b3csU747tFpbbuGizEjTLIK07/rgjGW/bcNiMf/H1C8QkA+a/7AWAk0ibx6vuRgy

    NsuYryvllVz/waqPVsJ1iNc4EigSz8KQxLKNbD7HW/g6UayOqUIisDZpiwaLYKp/kG0X0oHm

    zzVSNauSlHyWw3gkt2y/lw==

    ENCRYPT FUNCTION 1 function encrypt wrapped

    a000000

    34e

    abcd

    abcd

    abcd

    abcd

    abcd

    abcd

    abcd

    abcd

  • 기술지원

    Oracle 데이터 암호화 Package 작성자:이 대 혁 Version: 1.0 최종 수정일: 2014-02-06

    24/31

    abcd

    abcd

    abcd

    abcd

    abcd

    abcd

    abcd

    8

    1c2 179

    ipymkTIHK3PaPM7PkzLfg8Yw1GgwgzLI2q5qfI4CWHPVuW+A8FEU01zpwxTGUl4Kry1+Scgp

    y00dDGfnOfkAnxFCNgS5wCzBz/6KI5WQio52sPjBxLAfew4yYOU5Gqw3iLwX6OOv57ETZDla

    DEYGyXfcdxG0YkZR6acBUkJBMFz1jG8Oum0JrbPnHeq6S4wuHvzUBjQ9Y7Ay2AIClJPc7U/D

    hdXLCg+c7D1NKGiHp5Hd1gQdRNdtLnZ+I7FRR3jFc85bTB9n3tJ7AHrcxhY34w06Rb+Yz6Q3

    sOKi7z0G1ZZOWz5r26vLBR6qeo+C210TgG4vT2BTo123yKm5+E4o24xuJTMJ4gVt2pIdJ8tT

    Im2JH7taPyP9

    위와같이 function의 source가 암호화 되었습니다.

    그러나 function의 name은 암호화가 되지 않습니다.

    암호화/복호화 작업시 function의 source 내용과 무관하게 function의 name만으로 암호화/복호화 작업이 가능

    source의 암호화는 의미가 퇴색되게 됩니다.

    하므로 function

  • 기술지원

    Oracle 데이터 암호화 Package 작성자:이 대 혁 Version: 1.0 최종 수정일: 2014-02-06

    25/31

    6 WRAP Utility 를 이용한 Package 암호화

    6.1 현재 Crypt Package 내용 검색

    SQL> select * from dba_source where type IN ('PACKAGE', 'PACKAGE BODY') and name in ('CRYPT');

    OWNER NAME TYPE LINE TEXT

    ------------------------------ ------------------------------ ------------ ---------- ----------------------------------------------------------------------

    SYS CRYPT PACKAGE 1 PACKAGE Crypt AS

    SYS CRYPT PACKAGE 2 FUNCTION encrypt( Str VARCHAR2 ) RETURN VARCHAR2;

    SYS CRYPT PACKAGE 3 FUNCTION decrypt( xCrypt VARCHAR2 ) RETURN VARCHAR2;

    SYS CRYPT PACKAGE 4 END Crypt2;

    Package의 내용을 간단한 검색으로 확인할 수 있으며 가장 중요한 키 값이 노출됩니다.

    WRAP Utility 를 이용하여 Package를 암호화 하겠습니다.

    6.2 Package Wrap SQL> CREATE OR REPLACE PACKAGE cryptIT AS

    2 FUNCTION ngy_e_hwan(v_string in varchar2) return varchar2;

    3 FUNCTION ngy_d_hwan(v_str in varchar2) return varchar2;

    4 END CryptIT;

    5 /

  • 기술지원

    Oracle 데이터 암호화 Package 작성자:이 대 혁 Version: 1.0 최종 수정일: 2014-02-06

    26/31

    Package created.

    SQL> CREATE OR REPLACE PACKAGE BODY CryptIT AS

    2 crypted_string VARCHAR2(2000);

    3

    4 function ngy_d_hwan(v_str in varchar2) return varchar2 is

    5 decrypted_raw raw(2000);

    6 encryption_type PLS_INTEGER := SYS.DBMS_CRYPTO.ENCRYPT_DES +

    7 SYS.DBMS_CRYPTO.CHAIN_CBC + SYS.DBMS_CRYPTO.PAD_PKCS5;

    8 v_key raw(128) := utl_i18n.string_to_raw( 'unione', 'AL16UTF16' );

    9 begin

    10 decrypted_raw := DBMS_CRYPTO.Decrypt

    11 (

    12 src => HEXTORAW(v_str),

    13 typ => encryption_type,

    14 key => v_key

    15 );

    16 return UTL_I18N.RAW_TO_CHAR (decrypted_raw, 'AL16UTF16');

    17 end ngy_d_hwan;

    18

    19 function ngy_e_hwan(v_string in varchar2) return varchar2 is

    20 encrypted_raw RAW (2000);

  • 기술지원

    Oracle 데이터 암호화 Package 작성자:이 대 혁 Version: 1.0 최종 수정일: 2014-02-06

    27/31

    21 encryption_type PLS_INTEGER := SYS.DBMS_CRYPTO.ENCRYPT_DES +

    22 SYS.DBMS_CRYPTO.CHAIN_CBC + SYS.DBMS_CRYPTO.PAD_PKCS5;

    23 v_key raw(128) := utl_i18n.string_to_raw('unione', 'AL16UTF16' );

    24 begin

    25 encrypted_raw := DBMS_CRYPTO.ENCRYPT

    26 (

    27 src => UTL_I18N.STRING_TO_RAW (v_string,'AL16UTF16'),

    28 typ => encryption_type,

    29 key => v_key

    30 );

    31 return RAWTOHEX(encrypted_raw);

    32 end ngy_e_hwan;

    33 end CryptIT;

    34 /

    Package body created.

    6.3 Wrap 을 이용한 Package 암호화

    /oracle $wrap iname=pcrypt.sql oname=pcrypt2.sql

    PL/SQL Wrapper: Release 10.2.0.5.0- 64bit Production on Wed Jan 29 01:03:17 2014

  • 기술지원

    Oracle 데이터 암호화 Package 작성자:이 대 혁 Version: 1.0 최종 수정일: 2014-02-06

    28/31

    Copyright (c) 1993, 2004, Oracle. All rights reserved.

    Processing pcrypt.sql to pcrypt2.sql

    /oracle $wrap iname=pcrypt_body.sql oname=pcrypt_body2.sql

    PL/SQL Wrapper: Release 10.2.0.5.0- 64bit Production on Wed Jan 29 01:03:42 2014

    Copyright (c) 1993, 2004, Oracle. All rights reserved.

    Processing pcrypt_body.sql to pcrypt_body2.sql

    /oracle $sqlplus / as sysdba

    SQL*Plus: Release 10.2.0.5.0 - Production on Wed Jan 29 01:12:10 2014

    Copyright (c) 1982, 2010, Oracle. All Rights Reserved.

    Connected to:

    Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - 64bit Production

    With the Partitioning, OLAP, Data Mining and Real Application Testing options

    SQL> @pcrypt.sql

  • 기술지원

    Oracle 데이터 암호화 Package 작성자:이 대 혁 Version: 1.0 최종 수정일: 2014-02-06

    29/31

    Package created.

    SQL> @pcrypt_body.sql

    Package body created.

    6.4 Wrap 되어진 Package 내용 확인

    SQL> select * from dba_source where type IN ('PACKAGE', 'PACKAGE BODY') and name in ('CRYPT');

    OWNER NAME TYPE LINE TEXT

    ---------- ---------- ------------ ---------- ----------------------------------------------------------------------

    SYS CRYPT PACKAGE 1 a000000

    34e

    abcd

    abcd

    abcd

    abcd

    abcd

    abcd

    abcd

    abcd

  • 기술지원

    Oracle 데이터 암호화 Package 작성자:이 대 혁 Version: 1.0 최종 수정일: 2014-02-06

    30/31

    abcd

    abcd

    abcd

    abcd

    abcd

    abcd

    abcd

    9

    93 9e

    CuqDIxANarzBcTj+/odQqrmX7Q8wgwLZf56pfHSmZxcP98zqsdyoPN/nLRrMUvwfonHk7Yx7

    vhxx5qt/MA6Gg67f3XEoA8gIFMo41bzblGOT8t8Bvd3hmcXpd+JEgd8eHbm6+OpzQocjylXx

    Lb78OQhoFnE=

    DBMS_CRYPTO Package 도 같은 방법으로 wrap 가능합니다.

    Package 를 조회하면 Package 명은 출력이 되지만 Package Body 내용은 출력이 되지 않습니다.

    때문에 Package 명과 Body(Function) 명을 같이 알고 있어야 암/복호화가 가능합니다.

    7 암호화 컬럼의 Index 활용 인덱스 사용 가능(o) 인덱스 사용 불가능(x)

    Select * From crypto_test

    Where 주민등록번호= encrypt('111111-1111111'); Select * From crypto_test

    Where decrypt(주민등록번호)='111111-1111111';

  • 기술지원

    Oracle 데이터 암호화 Package 작성자:이 대 혁 Version: 1.0 최종 수정일: 2014-02-06

    31/31

    일반적으로 컬럼 사용시 암호화하면 인덱스 사용 불가합니다.

    컬럼의 값을 확인하기 위해 컬럼에 복호화를 해야하기 때문입니다.

    제한 되지만 위의 표와 같은 방법으로 인덱스를 사용할 수 있습니다.

    1 테스트 환경 2 ORACLE 암호화3 DBMS_CRYPTO3.1 DBMS_CRYPTO 설정3.1.1 Package 생성3.1.2 권한 부여3.1.3 Function 생성3.1.4 샘플 데이터 생성

    3.2 DBMS_CRYPTO 를 이용한 암호화3.3 Decryt Function 을 사용한 복호화 방법3.4 Crypto insert 작업

    4 FUNCTION, PACKAGE5 WRAP Utility 를 이용한 PL/SQL Source 암호화5.1 Function 암호화 후 Function 조회

    6 WRAP Utility 를 이용한 Package 암호화6.1 현재 Crypt Package 내용 검색6.2 Package Wrap6.3 Wrap 을 이용한 Package 암호화6.4 Wrap 되어진 Package 내용 확인

    7 암호화 컬럼의 Index 활용