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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline Zryv  
#1 Оставлено : 1 июня 2022 г. 9:50:21(UTC)
Zryv

Статус: Новичок

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

Здравствуйте

Разбираюсь с проверкой подписи на Java и столкнулся с такой вот проблемой

Есть подпись сформированная на клиенте через cadesplugin_api.js следующим образом

1) Получаем хэш подписываемого контента
(В качестве контента засылается строка "test")

var oHashedData = cadesplugin.CreateObject("CAdESCOM.HashedData");
oHashedData.Algorithm = window.cadesplugin.CADESCOM_HASH_ALGORITHM_CP_GOST_3411_2012_256;
oHashedData.DataEncoding = window.cadesplugin.CADESCOM_BASE64_TO_BINARY;
oHashedData.Hash(content); //"test"
var hash = oHashedData.Value;
resolve(hash);

2) Подписываем тестовым сертификатом

var oSigner = window.cadesplugin.CreateObject("CAdESCOM.CPSigner");
oSigner.Certificate = cert;
var oSignedData = window.cadesplugin.CreateObject("CAdESCOM.CadesSignedData");
oSignedData.ContentEncoding = window.cadesplugin.CADESCOM_BASE64_TO_BINARY;
var oHashedData = window.cadesplugin.CreateObject("CAdESCOM.HashedData");
oHashedData.Algorithm = window.cadesplugin.CADESCOM_HASH_ALGORITHM_CP_GOST_3411_2012_256;
oHashedData.SetHashValue(hash);
var sSignedData = oSignedData.SignHash(oHashedData, oSigner, window.cadesplugin.CADESCOM_CADES_BES);
resolve(sSignedData);

3) Полученную подпись проверяем на стороне сервера
Есть реализация на NET. для проверки этой подписи с помощью библиотеки CADESCOM
где des - сформированная на шаге 2 подпись

oSignedData = new CadesSignedData();
oSignedData.ContentEncoding = CADESCOM_CONTENT_ENCODING_TYPE.CADESCOM_BASE64_TO_BINARY;
oSignedData.Content = contentBase64; //"test" в base64
oSignedData.VerifyCades(des, CADESCOM_CADES_TYPE.CADESCOM_CADES_BES, true); //

Проверка тут успешно проходит и никаких проблем

Пытаюсь сделать похожее на java, попытки вылились в следующий код

Security.addProvider(new JCP());
byte[] text = Base64.getEncoder().encode("test".getBytes(StandardCharsets.UTF_8));
byte[] des = Base64.getMimeDecoder().decode(signed); // signed - подпись сформированная на шаге 2
CAdESSignature sig = new CAdESSignature(des, text , CAdESType.CAdES_BES, true);
sig.verify(null);

Собственно, на последнем шаге мне вываливается CADESException org.bouncycastle.cms.CMSSignerDigestMismatchException: message-digest attribute value does not match calculated value

Можете объяснить, что я делаю не так?
Offline Евгений Афанасьев  
#2 Оставлено : 1 июня 2022 г. 10:40:36(UTC)
Евгений Афанасьев

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

Группы: Участники
Зарегистрирован: 06.12.2008(UTC)
Сообщений: 3,963
Российская Федерация
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 704 раз в 665 постах
Здравствуйте, попробуйте UTF-16LE, https://support.cryptopr...etsja-v-kriptoarmcryptcp
Offline Андрей *  
#3 Оставлено : 1 июня 2022 г. 10:43:43(UTC)
Андрей *

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

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 13,340
Мужчина
Российская Федерация

Сказал «Спасибо»: 550 раз
Поблагодарили: 2212 раз в 1727 постах
Цитата:
oHashedData.DataEncoding = window.cadesplugin.CADESCOM_BASE64_TO_BINARY;
oHashedData.Hash(content); //"test"


content = "test"
или
content = "dGVzdA=="

?
Техническую поддержку оказываем тут
Наша база знаний
Offline Евгений Афанасьев  
#4 Оставлено : 1 июня 2022 г. 10:46:56(UTC)
Евгений Афанасьев

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

Группы: Участники
Зарегистрирован: 06.12.2008(UTC)
Сообщений: 3,963
Российская Федерация
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 704 раз в 665 постах
Надо сначала декодировать из base64, полагаю.
Offline Евгений Афанасьев  
#5 Оставлено : 1 июня 2022 г. 10:50:09(UTC)
Евгений Афанасьев

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

Группы: Участники
Зарегистрирован: 06.12.2008(UTC)
Сообщений: 3,963
Российская Федерация
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 704 раз в 665 постах
Вот тут что-то странное:
byte[] text = Base64.getEncoder().encode("test".getBytes(StandardCharsets.UTF_8))
Зачем кодировать в base64, ведь плагин подписал test, а не его base64 представление. А CadesSignature в java работает с не-base64. Base64 нужен плагину, т. к. он, если не ошибаюсь, не работает с binary. Сделайте
byte[] text = "test".getBytes(StandardCharsets.UTF_16LE)
для CadesSignature.

Отредактировано пользователем 1 июня 2022 г. 10:50:58(UTC)  | Причина: Не указана

RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.