사용자 도구

사이트 도구


database:oracle:dbms_crypto

차이

문서의 선택한 두 판 사이의 차이를 보여줍니다.

차이 보기로 링크

양쪽 이전 판 이전 판
다음 판
이전 판
database:oracle:dbms_crypto [2020/08/11 14:07]
kwon37xi [Oracle 암호화 -> Java 복호화]
database:oracle:dbms_crypto [2020/08/11 16:49] (현재)
kwon37xi [Oracle 암호화 -> Java 복호화]
줄 16: 줄 16:
 -- grant execute on dbms_obfuscation_toolkit to public; -- grant execute on dbms_obfuscation_toolkit to public;
 </code> </code>
 +
 +===== 함수 =====
 +  * ''DBMS_CRYPTO.ENCRYPT'' : 암호화 수행. 암호화 데이터 인자로 byte 배열(RAW)를 받음. byte 배열(RAW) 반환.
 +  * ''DBMS_CRYPTO.DECRYPT'' : 복호화 수행. 복호화 데이터 인자로 hex 문자열 받음. byte 배열(RAW) 반환.
  
 ===== DBMS_CRYOPTO 상수 읽기 ===== ===== DBMS_CRYOPTO 상수 읽기 =====
줄 21: 줄 25:
  
 <code sql> <code sql>
- begin +begin 
-   dbms_output.put_line(dbms_crypto.DES_CBC_PKCS5); +    dbms_output.put_line(dbms_crypto.DES_CBC_PKCS5); 
- end; +end; 
- /+/
 </code> </code>
  
줄 45: 줄 49:
  
 ===== Oracle 암호화 -> Java 복호화 ===== ===== Oracle 암호화 -> Java 복호화 =====
 +  * Oracle은 표준 암호화를 사용하기 때문에 표준을 이해하면 Java 전환이 어렵지 않다.
 +  * [[https://www.esentri.com/oracle-dbms_crypto-to-java-the-first-steps/|Oracle DBMS_Crypto to Java: The First Steps - esentri AG]] : Java <-> Oracle 상호간 암호화/복호화에 대한 기본 이론. 
 +
 <code sql> <code sql>
 +
 +-- byte 배열(RAW) 결과
 select DBMS_CRYPTO.encrypt(UTL_RAW.CAST_TO_RAW ('Secret Data'), 4353 select DBMS_CRYPTO.encrypt(UTL_RAW.CAST_TO_RAW ('Secret Data'), 4353
 , UTL_RAW.CAST_TO_RAW ('MYKEY123'),UTL_RAW.CAST_TO_RAW('01234567')) from dual; , UTL_RAW.CAST_TO_RAW ('MYKEY123'),UTL_RAW.CAST_TO_RAW('01234567')) from dual;
 +
 +-- VARCHAR2 로 cast 하면 hex 문자열이 나온다.
 +SELECT CAST(DBMS_CRYPTO.encrypt(UTL_RAW.CAST_TO_RAW ('Secret Data'), 4353, UTL_RAW.CAST_TO_RAW ('MYKEY123'),UTL_RAW.CAST_TO_RAW('01234567')) AS VARCHAR2(100)) FROM dual;
 +-- 결과 : 963C9ABD5C20382996DF9E0849F28C45
 </code> </code>
   * ''UTL_RAW.CAST_TO_RAW ('Secret Data')'' 암호화할 데이터(''Secret Data'')를 binary로   * ''UTL_RAW.CAST_TO_RAW ('Secret Data')'' 암호화할 데이터(''Secret Data'')를 binary로
     * 유니코드의 경우 ''UTL_I18N.STRING_TO_RAW('암호화할 데이터', 'AL32UTF8')'' 형태로 ''UTF-8'' byte로.     * 유니코드의 경우 ''UTL_I18N.STRING_TO_RAW('암호화할 데이터', 'AL32UTF8')'' 형태로 ''UTF-8'' byte로.
 +    * 유니코드에서 RAW(byte[])를 다시 문자열로 변경은 ''UTL_I18N.RAW_TO_CHAR('RAW 데이터', 'AL32UTF8')''
   * ''4353'' 알고리즘 ID : ''dbms_crypto.DES_CBC_PKCS5'' 값이다. 이는 사실 여러 알고리즘을 나타내는''DBMS_CRYPTO.상수'' 들의 합이다.   * ''4353'' 알고리즘 ID : ''dbms_crypto.DES_CBC_PKCS5'' 값이다. 이는 사실 여러 알고리즘을 나타내는''DBMS_CRYPTO.상수'' 들의 합이다.
   * ''UTL_RAW.CAST_TO_RAW ('MYKEY123')'' : 비밀번호(Key) binary   * ''UTL_RAW.CAST_TO_RAW ('MYKEY123')'' : 비밀번호(Key) binary
줄 59: 줄 73:
 public void testDecryption() { public void testDecryption() {
   String CIPHER = "DES/CBC/PKCS5Padding";   String CIPHER = "DES/CBC/PKCS5Padding";
-  byte[] key = DatatypeConverter.parseHexBinary("4D594B4559313233");+   
 +  byte[] key = DatatypeConverter.parseHexBinary("4D594B4559313233"); // "MYKEY123".getBytes("UTF-8") 와 같다.
   byte[] value =   byte[] value =
-     DatatypeConverter.parseHexBinary("24FC80D150E224F2E8CE83229F38B607ADAF312BCB1B4A55");+     DatatypeConverter.parseHexBinary("963C9ABD5C20382996DF9E0849F28C45"); // 암호화 결과의 hex 
   String INIT_VECTOR =   String INIT_VECTOR =
      new String(DatatypeConverter.parseHexBinary("3031323334353637"));      new String(DatatypeConverter.parseHexBinary("3031323334353637"));
줄 87: 줄 102:
     e.printStackTrace();     e.printStackTrace();
   }   }
-  System.out.println("Result " + result);+  System.out.println("Result " + result); //   Result Secret Data
 } }
 +</code>
 +  * Java 에서는 ''AES256''을 사용하라면 [[java:jce|Java JCE(Java Cryptography Extension)]] 를 설치해야한다. 
 +  * Java 에서는 hex 를 byte 배열 로 다시 변환하려면 ''javax.xml.bind.DatatypeConverter#parseHexBinary'' 를 사용한다.
 +  * 반대로 Java 에서 byte 배열을 hex 로 변환하기 - [[https://stackoverflow.com/questions/9655181/how-to-convert-a-byte-array-to-a-hex-string-in-java|bytearray - How to convert a byte array to a hex string in Java? - Stack Overflow]]
 +
 +<code sh>
 +byte bytes[] = {(byte)0, (byte)0, (byte)134, (byte)0, (byte)61};
 +String hex = javax.xml.bind.DatatypeConverter.printHexBinary(bytes);
 +
 +// 혹은 apache commons codec
 +import org.apache.commons.codec.binary.Hex;
 +...
 +Hex.encodeHexString(someByteArray));
 </code> </code>
 ===== 참조 ===== ===== 참조 =====
줄 94: 줄 122:
   * [[http://kkujunhee.net/bbs/board.php?bo_table=db&wr_id=49|DBMS_CRYPTO 암호화 라이브러리 추가하기 > 데이터베이스 | kkujunhee.net]]   * [[http://kkujunhee.net/bbs/board.php?bo_table=db&wr_id=49|DBMS_CRYPTO 암호화 라이브러리 추가하기 > 데이터베이스 | kkujunhee.net]]
   * [[http://www.gurubee.net/lecture/1200|오라클에서의 데이터 암호화 기능]]   * [[http://www.gurubee.net/lecture/1200|오라클에서의 데이터 암호화 기능]]
-  * [[https://www.esentri.com/oracle-dbms_crypto-to-java-the-first-steps/|Oracle DBMS_Crypto to Java: The First Steps - esentri AG]] : Java <-> Oracle 상호간 암호화/복호화 
   * [[https://dzone.com/articles/data-encryptiondecryption-with-oracle|Data Encryption and Decryption With Oracle - DZone Database]]   * [[https://dzone.com/articles/data-encryptiondecryption-with-oracle|Data Encryption and Decryption With Oracle - DZone Database]]
   * [[https://www.programcreek.com/java-api-examples/javax.crypto.Cipher|Java Code Examples for javax.crypto.Cipher]]   * [[https://www.programcreek.com/java-api-examples/javax.crypto.Cipher|Java Code Examples for javax.crypto.Cipher]]
database/oracle/dbms_crypto.1597122444.txt.gz · 마지막으로 수정됨: 2020/08/11 14:07 저자 kwon37xi