Previous Entry Share Next Entry
GNU Crypto for Oracle 10g
itjustme_tech
При моём не знании Java удалось за несколько часов прикрутить GNU Crypto к Oracle 10g.
Зачем это надо? Мне надо было получать sha256 для blob'ов.
Всё, естественно, под Linux.

Из GNU Crypto берем скомпилированный вариант, файлы - gnu-crypto.jar, javax-crypto.jar, javax-security.jar.
Закидываем их на сервер. Пользователю, которому всё это понадобится, выдаём права:

grant javauserpriv to user1;


На сервере в консоли пользователем, который владеет базой, делаем:

 loadjava -u user1/*** -v -resolve *.jar


Вместо *** - пароль (я тут совсем недавно узнал, что если в начале строки пробел, то команда не попадает в историю).

Заходим в оракл пользователем user1, выполняем:

CREATE OR REPLACE AND RESOLVE JAVA SOURCE NAMED "GnuSha256" as
import java.io.*;
import java.sql.*;
import gnu.crypto.hash.Sha256;

public class GnuSha256
{
  final protected static char[] hexArray = "0123456789ABCDEF".toCharArray();
  
  private static String bytesToHex(byte[] bytes) {
      char[] hexChars = new char[bytes.length * 2];
      int v;
      for ( int j = 0; j < bytes.length; j++ ) {
          v = bytes[j] & 0xFF;
          hexChars[j * 2] = hexArray[v >>> 4];
          hexChars[j * 2 + 1] = hexArray[v & 0x0F];
      }
      return new String(hexChars);
  }

  public static String Sha256(oracle.sql.BLOB srcBlob) {
    try {
      InputStream inBuffer = srcBlob.getBinaryStream();
      Sha256 sha = new Sha256();
      byte[] tmpBuffer = new byte[1024];
      int n;
      while ((n = inBuffer.read(tmpBuffer)) >= 0) {
          sha.update(tmpBuffer, 0, n);
      }
      return bytesToHex(sha.digest());
    }
    catch (SQLException e) {
      System.err.println(e);
    }
    catch (IOException e) {
      System.err.println(e);
    }
    return "";
  }
};
/


и

create or replace function gnusha256(string in blob) return varchar2 as
language java name 'GnuSha256.Sha256(oracle.sql.BLOB) return String';
/


Теперь sha256 для blob'а может быть полученно так:

select gnusha256(a.data) from a where rownum = 1;


Результат был проверен с помощью QCryptographicHash из библиотеки Qt 5.1.1.
Tags: , ,

?

Log in

No account? Create an account