powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Convert BLOB(Oracle) to hex String (Java)
4 сообщений из 4, страница 1 из 1
Convert BLOB(Oracle) to hex String (Java)
    #39216224
Hoi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hoi
Гость
дорабатываю механизм цифровой подписи. Данные и подписи хранятся в базе, общение с криптосервером в Java. Подпись хранится в таблице в виде BLOB поля.
В утрированном виде логика такая:
Отдаю блок данных на подпись и Java код, выполнив необходимые провекри и подписав его следующим блоком записывает подпись в базу
String query = "INSERT INTO SIGNS (SIGN) VALUES (?)";
PreparedStatement statement = null;
statement = this.tools.prepareStatement(query);
statement.setString(1, signature);
statement.executeUpdate();

Позднее мне нужно проверить подпись и я зову процедуру, объявленную в Oracle следующим образом
procedure VerifySign (signature in BLOB,
certificate out varchar2) as
language java name 'verifySign (oracle.sql.BLOB,
java.lang.String[])';

В Java в функции verifySign необходимо (по определенным причинам) BLOB перевести в String
Делаю это следующим образом:
String Signature;
byte[] ArrSign = BLOBsignature.getBytes();
char[] val = new char[2 * ArrSign.length];
final char[] hexTemplate = "0123456789ABCDEF".toCharArray();
for (int i = 0; i < ArrSign.length; i++)
{
int b = ArrSign[i] & 0xff;
val[2 * i] = hexTemplate[b >>> 4];
val[2 * i + 1] = hexTemplate[b & 0x0F];
}
Signature = String.valueOf(val);

Проблема всего этого в том, что подпись после того как криптосервер ее положил в базу выглядит примерно так (начало):
308203DB06092A864886F7...
А после того, как я ее преобразую из BLOB в String в начало дописывается какой-то код:
04430001010C080000010000000100000326059E00045EEC00045EEB0008000800000001308203DB06092A864886F70D00000000031DB52400000002000800003101014009FA1A9A3200000000045EEB05C002A5000003EF09000000000003DF000000000001

Что я делаю неправильно?
Что это префикс к подписи и как от него избавится?
Может это локатор дописывается в начало самого блоба, но это странно, раз уж все равно передаем его целиком через параметр.
...
Рейтинг: 0 / 0
Convert BLOB(Oracle) to hex String (Java)
    #39216283
trace.log
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Hoiдорабатываю механизм цифровой подписи. Данные и подписи хранятся в базе, общение с криптосервером в Java. Подпись хранится в таблице в виде BLOB поля.
В утрированном виде логика такая:
Отдаю блок данных на подпись и Java код, выполнив необходимые провекри и подписав его следующим блоком записывает подпись в базу
String query = "INSERT INTO SIGNS (SIGN) VALUES (?)";
PreparedStatement statement = null;
statement = this.tools.prepareStatement(query);
statement.setString(1, signature);
statement.executeUpdate();

Позднее мне нужно проверить подпись и я зову процедуру, объявленную в Oracle следующим образом
procedure VerifySign (signature in BLOB,
certificate out varchar2) as
language java name 'verifySign (oracle.sql.BLOB,
java.lang.String[])';

В Java в функции verifySign необходимо (по определенным причинам) BLOB перевести в String
Делаю это следующим образом:
String Signature;
byte[] ArrSign = BLOBsignature.getBytes();
char[] val = new char[2 * ArrSign.length];
final char[] hexTemplate = "0123456789ABCDEF".toCharArray();
for (int i = 0; i < ArrSign.length; i++)
{
int b = ArrSign[i] & 0xff;
val[2 * i] = hexTemplate[b >>> 4];
val[2 * i + 1] = hexTemplate[b & 0x0F];
}
Signature = String.valueOf(val);

Проблема всего этого в том, что подпись после того как криптосервер ее положил в базу выглядит примерно так (начало):
308203DB06092A864886F7...
А после того, как я ее преобразую из BLOB в String в начало дописывается какой-то код:
04430001010C080000010000000100000326059E00045EEC00045EEB0008000800000001308203DB06092A864886F70D00000000031DB52400000002000800003101014009FA1A9A3200000000045EEB05C002A5000003EF09000000000003DF000000000001

Что я делаю неправильно?
Что это префикс к подписи и как от него избавится?
Может это локатор дописывается в начало самого блоба, но это странно, раз уж все равно передаем его целиком через параметр.
Используй теги, а то ничего не понятно:

дорабатываю механизм цифровой подписи. Данные и подписи хранятся в базе, общение с криптосервером в Java. Подпись хранится в таблице в виде BLOB поля.
В утрированном виде логика такая:
Отдаю блок данных на подпись и Java код, выполнив необходимые провекри и подписав его следующим блоком записывает подпись в базу
Код: sql
1.
2.
3.
4.
5.
String query = "INSERT INTO SIGNS (SIGN) VALUES (?)";
 PreparedStatement statement = null;
 statement = this.tools.prepareStatement(query);
 statement.setString(1, signature);
 statement.executeUpdate();


Позднее мне нужно проверить подпись и я зову процедуру, объявленную в Oracle следующим образом
Код: sql
1.
2.
3.
4.
procedure VerifySign  (signature     in BLOB,
					   certificate   out varchar2) as
  language java name 'verifySign (oracle.sql.BLOB,
								  java.lang.String[])';


В Java в функции verifySign необходимо (по определенным причинам) BLOB перевести в String
Делаю это следующим образом:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
	String Signature;
	byte[] ArrSign = BLOBsignature.getBytes();
	char[] val = new char[2 * ArrSign.length];
	final char[] hexTemplate = "0123456789ABCDEF".toCharArray();
	for (int i = 0; i < ArrSign.length; i++)
	{
		int b = ArrSign[i] & 0xff;
		val[2 * i] = hexTemplate[b >>> 4];
		val[2 * i + 1] = hexTemplate[b & 0x0F];
	}
	Signature = String.valueOf(val);


Проблема всего этого в том, что подпись после того как криптосервер ее положил в базу выглядит примерно так (начало):
308203DB06092A864886F7...
А после того, как я ее преобразую из BLOB в String в начало дописывается какой-то код:
04430001010C080000010000000100000326059E00045EEC00045EEB0008000800000001308203DB06092A864886F70D00000000031DB52400000002000800003101014009FA1A9A3200000000045EEB05C002A5000003EF09000000000003DF000000000001

Что я делаю неправильно?
Что это префикс к подписи и как от него избавится?
Может это локатор дописывается в начало самого блоба, но это странно, раз уж все равно передаем его целиком через параметр.
...
Рейтинг: 0 / 0
Convert BLOB(Oracle) to hex String (Java)
    #39216302
Hoi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hoi
Гость
Спасибо. Учту.

Опытным путем выяснил, что если перевод из BLOB в byte[] делать так:
Код: java
1.
byte[] ArrSign = BLOBsignature.getBytes(1, BLOBsignature.getLength());


то все работает нормально.

Видать getBytes() делает что-то дополнительное с блобом.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Convert BLOB(Oracle) to hex String (Java)
    #39494319
Hoi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hoi
Гость
Истина оказалась где-то рядом...
В итоге написал так:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
	public static byte[] BLOBToByteArray(final BLOB data) throws Exception {
		byte[] dataBytes;

		// перегоним данные из BLOB формата byte[] - только через потоки
		// функции data.getBytes в этом случае возвращают неверные значения
		// data.getBytes() возвращает несколько первых байт (у меня было 40) данных локатора блоба (не уверен, что это именно локатор, но точно не данные).
		// data.getBytes(1, (int)data.length()) возвращает несколько первых байт (но не все! для больших блобов) самих данных.
		try {
			byte[] buffer = new byte[8092];
			int n;

			InputStream in = data.getBinaryStream();
			ByteArrayOutputStream out = new ByteArrayOutputStream();
			while ((n = in.read(buffer)) > 0) {
				out.write(buffer, 0, n);
			}
			in.close();
			out.flush();
			dataBytes = out.toByteArray();
			out.close();

			return dataBytes;
		} catch (Exception e) {
			// обработка ошибки
			throw new Exception(e.getMessage());
		}
	}
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Convert BLOB(Oracle) to hex String (Java)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]