oracle 데이터 암호화unioneinc.co.kr/upload/board/[unioneinc]cryptopackage...2014/02/06 ·...
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 활용