Tina Admin

Similar documents
SQL Developer Connect to TimesTen 유니원아이앤씨 DB 기술지원팀 2010 년 07 월 28 일 문서정보 프로젝트명 SQL Developer Connect to TimesTen 서브시스템명 버전 1.0 문서명 작성일 작성자

Microsoft Word - [Unioneinc] 특정컬럼의 통계정보 갱신_ _ldh.doc

목차 BUG offline replicator 에서유효하지않은로그를읽을경우비정상종료할수있다... 3 BUG 각 partition 이서로다른 tablespace 를가지고, column type 이 CLOB 이며, 해당 table 을 truncate

13주-14주proc.PDF

ALTIBASE HDB Patch Notes

10.ppt

목차 BUG 문법에맞지않는질의문수행시, 에러메시지에질의문의일부만보여주는문제를수정합니다... 3 BUG ROUND, TRUNC 함수에서 DATE 포맷 IW 를추가지원합니다... 5 BUG ROLLUP/CUBE 절을포함하는질의는 SUBQUE

리눅스 free 메모리의이해 엑셈컨설팅본부 /DB 컨설팅팀임경석 개요 리눅스환경에서메모리사용률을모니터링하기위해명령어를실행하다보면시스템을기동한지얼마되지않아 free 영역의지표가급격히줄어드는것을쉽게확인할수있다. 리눅스어드민경험이있는사람이라면이것이무엇을의미하는지알수있지만그렇

목차 BUG DEQUEUE 의 WAIT TIME 이 1 초미만인경우, 설정한시간만큼대기하지않는문제가있습니다... 3 BUG [qp-select-pvo] group by 표현식에있는컬럼을참조하는집합연산이존재하지않으면결괏값오류가발생할수있습니다... 4

ORANGE FOR ORACLE V4.0 INSTALLATION GUIDE (Online Upgrade) ORANGE CONFIGURATION ADMIN O

MS-SQL SERVER 대비 기능

Tina Admin

MySQL-.. 1


Microsoft PowerPoint - 10Àå.ppt

DBMS & SQL Server Installation Database Laboratory

Intra_DW_Ch4.PDF

목차 1. 제품 소개 특징 개요 Function table 기능 소개 Copy Compare Copy & Compare Erase

강의 개요

The Self-Managing Database : Automatic Health Monitoring and Alerting

문서 템플릿

歯sql_tuning2

Microsoft PowerPoint - 6.pptx

내지시안c00?淪Α?274痴

<4D F736F F D203033C6C4C6BCBCC72DB8AEBFC0B1D7B9E6B9FD2E646F63>

untitled

歯PLSQL10.PDF

FD¾ØÅÍÇÁ¶óÀÌÁî(Àå¹Ù²Þ)-ÀÛ¾÷Áß

PRO1_09E [읽기 전용]

본문서는 초급자들을 대상으로 최대한 쉽게 작성하였습니다. 본문서에서는 설치방법만 기술했으며 자세한 설정방법은 검색을 통하시기 바랍니다. 1. 설치개요 워드프레스는 블로그 형태의 홈페이지를 빠르게 만들수 있게 해 주는 프로그램입니다. 다양한 기능을 하는 플러그인과 디자인

ETL_project_best_practice1.ppt

윈도우시스템프로그래밍

Chap7.PDF

Bind Peeking 한계에따른 Adaptive Cursor Sharing 등장 엑셈컨설팅본부 /DB 컨설팅팀김철환 Bind Peeking 의한계 SQL 이최초실행되면 3 단계의과정을거치게되는데 Parsing 단계를거쳐 Execute 하고 Fetch 의과정을통해데이터

vm-웨어-01장

@OneToOne(cascade = = "addr_id") private Addr addr; public Emp(String ename, Addr addr) { this.ename = ename; this.a

Tablespace On-Offline 테이블스페이스 온라인/오프라인

PowerPoint Presentation

목차 1. 보안지갑 Wallet) Data 암호화 컬럼암호화 Column Encryption) 테이블스페이스암호화 Tablespace Encryption) 암호화 Package DBMS

다양한 예제로 쉽게 배우는 오라클 SQL 과 PL/SQL

Microsoft Word - SQL튜닝_실습교재_.doc

초보자를 위한 ADO 21일 완성

3 S Q L A n t i p a t t e r n s Trees/intro/parent.sql CREATE TABLE Comments ( comment_id SERIAL PRIMARY KEY, parent_id BIGINT UNSIGNED, comment TEXT

Slide 1

(......).hwp

untitled

Data Sync Manager(DSM) Example Guide Data Sync Manager (DSM) Example Guide DSM Copyright 2003 Ari System, Inc. All Rights reserved. Data Sync Manager

PowerPoint 프레젠테이션

Oracle Database 10g: Self-Managing Database DB TSC

最即時的Sybase ASE Server資料庫診斷工具

Microsoft PowerPoint - ch07.ppt

Integ

vm-웨어-앞부속

MySQL-Ch10

컴파일러

1217 WebTrafMon II

TITLE

다양한 예제로 쉽게 배우는 오라클 SQL 과 PL/SQL

8 장데이터베이스 8.1 기본개념 - 데이터베이스 : 데이터를조직적으로구조화한집합 (cf. 엑셀파일 ) - 테이블 : 데이터의기록형식 (cf. 엑셀시트의첫줄 ) - 필드 : 같은종류의데이터 (cf. 엑셀시트의각칸 ) - 레코드 : 데이터내용 (cf. 엑셀시트의한줄 )

Oracle hacking 작성자 : 임동현 작성일 2008 년 10 월 11 일 ~ 2008 년 10 월 19 일 신규작성 작성내용

Tina Admin

WINDOW FUNCTION 의이해와활용방법 엑셈컨설팅본부 / DB 컨설팅팀정동기 개요 Window Function 이란행과행간의관계를쉽게정의할수있도록만든함수이다. 윈도우함수를활용하면복잡한 SQL 들을하나의 SQL 문장으로변경할수있으며반복적으로 ACCESS 하는비효율역

APOGEE Insight_KR_Base_3P11

다음 사항을 꼭 확인하세요! 도움말 안내 - 본 도움말에는 iodd2511 조작방법 및 활용법이 적혀 있습니다. - 본 제품 사용 전에 안전을 위한 주의사항 을 반드시 숙지하십시오. - 문제가 발생하면 문제해결 을 참조하십시오. 중요한 Data 는 항상 백업 하십시오.

KEEP BUFFER 활용방안 엑셈컨설팅본부 /DB 컨설팅팀장정민 개요 Oracle 은유저가요청한작업을빠르게처리하기위해 Buffer Cache 라는것을사용한다. Buffer Cache 는 SGA 에위치하고있으며, 오라클인스턴스에접속하는모든프로세스에의해공유된다. 이 Bu

토익S-채용사례리플렛0404

API STORE 키발급및 API 사용가이드 Document Information 문서명 : API STORE 언어별 Client 사용가이드작성자 : 작성일 : 업무영역 : 버전 : 1 st Draft. 서브시스템 : 문서번호 : 단계 : Docum

Spotlight on Oracle V10.x 트라이얼프로그램설치가이드 DELL SOFTWARE KOREA

Contents I. 칼라스 네트워크 플레이어란 1. Pc-Fi를 넘어서 발전한 차세대 음악 플레이어 칼라스 네트워크 플레이어의 장점 3. 시스템 기본 구성

Spring Boot/JDBC JdbcTemplate/CRUD 예제

InsertColumnNonNullableError(#colName) 에해당하는메시지출력 존재하지않는컬럼에값을삽입하려고할경우, InsertColumnExistenceError(#colName) 에해당하는메시지출력 실행결과가 primary key 제약에위배된다면, Ins

PowerPoint Presentation

PowerPoint 프레젠테이션

I T C o t e n s P r o v i d e r h t t p : / / w w w. h a n b i t b o o k. c o. k r


Jerry Held

Chapter 1

공개 SW 기술지원센터

오라클 데이터베이스 10g 핵심 요약 노트

한글사용설명서

Microsoft Word - s.doc

No

Assign an IP Address and Access the Video Stream - Installation Guide

FileMaker 15 ODBC 및 JDBC 설명서

PowerPoint Template

90

,,,,,, (41) ( e f f e c t ), ( c u r r e n t ) ( p o t e n t i a l difference),, ( r e s i s t a n c e ) 2,,,,,,,, (41), (42) (42) ( 41) (Ohm s law),

<목 차 > 제 1장 일반사항 4 I.사업의 개요 4 1.사업명 4 2.사업의 목적 4 3.입찰 방식 4 4.입찰 참가 자격 4 5.사업 및 계약 기간 5 6.추진 일정 6 7.사업 범위 및 내용 6 II.사업시행 주요 요건 8 1.사업시행 조건 8 2.계약보증 9 3

pdf

public key private key Encryption Algorithm Decryption Algorithm 1

ODS-FM1

Simplify your Job Automatic Storage Management DB TSC

목 차

< FC1A6BEC8BFE4C3BBBCAD2E687770>

Portal_9iAS.ppt [읽기 전용]

결과보고서

Tina Admin

Tibero

Copyright 2012, Oracle and/or its affiliates. All rights reserved.,.,,,,,,,,,,,,.,...,. U.S. GOVERNMENT END USERS. Oracle programs, including any oper

Ç¥Áö

Transcription:

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

재개정이력 일자내용수정인버전 문서배포이력 발신자수신자배포목적일자비고 2/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 3/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 4/31

cpu MHz : 3292.410 cache size fpu fpu_exception : 3072 KB : yes : yes cpuid level : 13 wp flags : yes : 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: MemFree: Buffers: Cached: 1503640 kb 30732 kb 165888 kb 925140 kb 5/31

SwapCached: Active: Inactive: HighTotal: HighFree: LowTotal: LowFree: SwapTotal: SwapFree: Dirty: Writeback: AnonPages: Mapped: Slab: PageTables: NFS_Unstable: Bounce: CommitLimit: 0 kb 712940 kb 624848 kb 0 kb 0 kb 1503640 kb 30732 kb 4192956 kb 4192956 kb 4 kb 0 kb 246752 kb 262804 kb 73504 kb 37204 kb 0 kb 0 kb 4944776 kb Committed_AS: 2143132 kb VmallocTotal: 34359738367 kb 6/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 를이용하여테이블의컬럼을암호화할수있습니다. 7/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. 8/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 9/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; 10/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 11/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'); 12/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); 13/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 ; 14/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 15/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 16/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 ; 번호성명 주민등록번호 17/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; 18/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); 19/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 20/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 21/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 22/31

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 23/31

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만으로암호화 / 복호화작업이가능하므로 function source의암호화는의미가퇴색되게됩니다. 24/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 / 25/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); 26/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 27/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 28/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 29/31

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) Select * From crypto_test Where 주민등록번호 = encrypt('111111-1111111'); 인덱스사용불가능 (x) Select * From crypto_test Where decrypt( 주민등록번호 )='111111-1111111'; 30/31

일반적으로컬럼사용시암호화하면인덱스사용불가합니다. 컬럼의값을확인하기위해컬럼에복호화를해야하기때문입니다. 제한되지만위의표와같은방법으로인덱스를사용할수있습니다. 31/31