Ключевое слово в защите информации
КЛЮЧЕВОЕ СЛОВО
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

2 Страницы12>
Опции
К последнему сообщению К первому непрочитанному
Offline EVoynov  
#1 Оставлено : 9 июля 2014 г. 12:51:07(UTC)
EVoynov

Статус: Активный участник

Группы: Участники
Зарегистрирован: 20.10.2011(UTC)
Сообщений: 45
Откуда: Moscow

Сказал(а) «Спасибо»: 7 раз
Добрый день!

В ветке http://www.cryptopro.ru/...ts&m=50055#post50055 рекомендовали написать еще в эту ветку.

Из-за того, что подписание проводится через browser-plugin, а проверка в JCP.
Подача подписываемых/проверяемых данных происходит по-разному:
browser-plugin - установка ContentEncoding=CADESCOM_BASE64_TO_BINARY и подача в Content Base64-строки.
JCP - установка происходит в виде byte[]

Вопрос - как правильно (идентично тому, как это делает api cades) преобразовать Base64-строку в byte[]?

Используемый класс сейчас во вложении.
Подпись проверку в JCP не проходит (message-digest attribute value does not match calculated value).
Вложение(я):
Base64.txt (23kb) загружен 9 раз(а).

У Вас нет прав для просмотра или загрузки вложений. Попробуйте зарегистрироваться.
Offline Новожилова Елена  
#2 Оставлено : 9 июля 2014 г. 13:18:45(UTC)
Новожилова Елена

Статус: Сотрудник

Группы: Администраторы, Участники
Зарегистрирован: 10.12.2008(UTC)
Сообщений: 924
Женщина
Откуда: Крипто-Про

Поблагодарили: 99 раз в 95 постах
Давайте сначала:

1. У вас есть исходный документ D, который вы подписываете. Это и есть тот массив byte[], который вы будете передавать в JCP для проверки. Никаких кодирований в/из BASE64 для этого делать не надо.

2. В плагин произвольные бинарные данные передать из браузера просто и надежно нельзя, поэтому при создании подписи для бинарных данных нужно их предварительно закодировать в BASE64 и передать в плагин D_BASE64. При создании подписи D_BASE64 будет декодирован в D и в таком виде подписан.
thanks 2 пользователей поблагодарили Новожилова Елена за этот пост.
stekolschikov_stas оставлено 29.05.2015(UTC), heavyside оставлено 26.11.2015(UTC)
Offline EVoynov  
#3 Оставлено : 9 июля 2014 г. 13:52:40(UTC)
EVoynov

Статус: Активный участник

Группы: Участники
Зарегистрирован: 20.10.2011(UTC)
Сообщений: 45
Откуда: Moscow

Сказал(а) «Спасибо»: 7 раз
Речь о подписании документа И его строковых метаданных, хранимых в системе в БД.

Алгоритм подготовки и самой подписи сейчас такой:
1 (Java). Приложение готовит 2 base64-строки:
а) Метаданные сконкатенированные в одну строку и преобразованные в Base64-строку
б) Контент документа (массив байт) преобразованный в Base64-строку. Если контент отсутствует, то вместо Base64-строки просто строка "null".
2 (JavaScript). Строки из п.1 конкатенируются и подаются в Content в javascript-коде.
3 (JavaScript). Вызывается подписание.

Алгоритм проверки подписи через JCP:
1 (Java). Приложение готовит 2 base64-строки:
а) Метаданные сконкатенированные в одну строку и преобразованные в Base64-строку
б) Контент документа (массив байт) преобразованный в Base64-строку. Если контент отсутствует, то вместо Base64-строки просто строка "null".
2 (Java). Строки из п.1 конкатенируются.
3 (Java). Производится преобразование строки из п.2 в массив байт (byte[])
4 (Java). Вызывается проверка подписи.
5 (Java). Получаю ошибку (message-digest attribute value does not match calculated value).

Мой вопрос был в том - как правильно в п. 3 "Производится преобразование строки из п.2 в массив байт (byte[])" провести преобразование?
Как видно из приведенных алгоритмов в JavaScript это преобразование производится "за меня" в api cades.


P.s. Алгоритм проверки подписи через плагин:
1 (Java). Приложение готовит 2 base64-строки:
а) Метаданные сконкатенированные в одну строку и преобразованные в Base64-строку
б) Контент документа (массив байт) преобразованный в Base64-строку. Если контент отсутствует, то вместо Base64-строки просто строка "null".
2 (JavaScript). Строки из п.1 конкатенируются и подаются в Content в javascript-коде.
4 (JavaScript). Вызывается проверка подписи.
5 (JavaScript). Подпись верна.

Отредактировано пользователем 9 июля 2014 г. 13:59:06(UTC)  | Причина: добавил действующий алгоритм проверки подписи через плагин

Offline Новожилова Елена  
#4 Оставлено : 9 июля 2014 г. 15:51:57(UTC)
Новожилова Елена

Статус: Сотрудник

Группы: Администраторы, Участники
Зарегистрирован: 10.12.2008(UTC)
Сообщений: 924
Женщина
Откуда: Крипто-Про

Поблагодарили: 99 раз в 95 постах
В алгоритме подготовки и самой подписи вызывает сомнение пункт 2.
При перекодировании в BASE64 кодируются 3 байта в 4 символа. Если общая длина данных не кратна трем, то в результате получаются только первые два или три символа строки, а выходная строка дополняется двумя или одним символами «=». Это предотвращает добавление дополнительных битов к восстановленным данным.
То есть BASE64(a+b) будет равно BASE64(a) + BASE64(b) только если a кратно трем.

Нужно сначала сконкактенировать строки (метаданные + документ), а потом переводить результат в BASE64.

При проверке - сконкактенировать строки и в BASE64 не переводить.

Или стоит задача подписать не "метаданные + документ", а "метаданные + документ закодированные в BASE64"?
Offline EVoynov  
#5 Оставлено : 9 июля 2014 г. 16:27:50(UTC)
EVoynov

Статус: Активный участник

Группы: Участники
Зарегистрирован: 20.10.2011(UTC)
Сообщений: 45
Откуда: Moscow

Сказал(а) «Спасибо»: 7 раз
К сожалению, п.2 мы изменить не можем, системе более 5 лет и она функционирует именно так.

"Алгоритм подготовки и самой подписи" и "Алгоритм проверки подписи через плагин" работают корректно и по ним вопросов нет.

Теперь появилась задача по реализации "Алгоритм проверки подписи через JCP", т.к. появилась необходимость проверку ЭЦП реализовать в ассинхронном режиме на сервере.

Итого: стоит задача "проверить <метаданные_BASE64>+<документ_BASE64|null> через JCP".
Offline Новожилова Елена  
#6 Оставлено : 9 июля 2014 г. 16:38:42(UTC)
Новожилова Елена

Статус: Сотрудник

Группы: Администраторы, Участники
Зарегистрирован: 10.12.2008(UTC)
Сообщений: 924
Женщина
Откуда: Крипто-Про

Поблагодарили: 99 раз в 95 постах
Задача как стоит?

(a) подписать "метаданные + документ" или (b) подписать "метаданные закодированные в BASE64 + документ закодированный в BASE64" ?

Если задача стоит как (a) то декодируете обе строки, склеиваете, кодируете заново результат, подписываете. При проверке аналогично: декодируете, склеиваете, передаете на проверку.

Если задача стоит как (b) то при создании подписи конкактенированные BASE64-строки кодируете в BASE64 еще раз, подписываете. При проверке - передаете просто конкактенированные BASE64-строки.

Или вы не можете менять процесс создания подписи вообще?
Offline EVoynov  
#7 Оставлено : 9 июля 2014 г. 17:45:54(UTC)
EVoynov

Статус: Активный участник

Группы: Участники
Зарегистрирован: 20.10.2011(UTC)
Сообщений: 45
Откуда: Moscow

Сказал(а) «Спасибо»: 7 раз
Автор: Новожилова Елена Перейти к цитате
Или вы не можете менять процесс создания подписи вообще?


Не можем менять вообще, т.к. в системе уже тысячи подписей созданных по описанному мной алгоритму.

Автор: Новожилова Елена Перейти к цитате
При проверке - передаете просто конкактенированные BASE64-строки.


При проверке я должен передавать массив байт (byte[]), мой изначальный вопрос - как правильно сделать преобразование между:

String(<метаданные_BASE64>+<документ_BASE64|null>) => byte[]

Offline Новожилова Елена  
#8 Оставлено : 9 июля 2014 г. 18:24:29(UTC)
Новожилова Елена

Статус: Сотрудник

Группы: Администраторы, Участники
Зарегистрирован: 10.12.2008(UTC)
Сообщений: 924
Женщина
Откуда: Крипто-Про

Поблагодарили: 99 раз в 95 постах
Попробуйте вырезать символы "=" _в_середине_ этой строки и потом декодировать в массив байт. Или просто игнорировать данные символы при декодировании.
В целом - подписи в системе формируются неправильно.

Отредактировано пользователем 9 июля 2014 г. 18:26:24(UTC)  | Причина: Не указана

Offline EVoynov  
#9 Оставлено : 9 июля 2014 г. 18:38:20(UTC)
EVoynov

Статус: Активный участник

Группы: Участники
Зарегистрирован: 20.10.2011(UTC)
Сообщений: 45
Откуда: Moscow

Сказал(а) «Спасибо»: 7 раз
Автор: Новожилова Елена Перейти к цитате
потом декодировать в массив байт


java.lang.String#getBytes(java.nio.charset.Charset#defaultCharset())
или
Base64.decode(java.lang.String)

?

Отредактировано пользователем 9 июля 2014 г. 18:40:19(UTC)  | Причина: Не указана

Offline Новожилова Елена  
#10 Оставлено : 9 июля 2014 г. 18:41:50(UTC)
Новожилова Елена

Статус: Сотрудник

Группы: Администраторы, Участники
Зарегистрирован: 10.12.2008(UTC)
Сообщений: 924
Женщина
Откуда: Крипто-Про

Поблагодарили: 99 раз в 95 постах
Я думаю, второй вариант :-)
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
2 Страницы12>
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.