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

Уведомление

Icon
Error

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

Статус: Участник

Группы: Участники
Зарегистрирован: 13.11.2015(UTC)
Сообщений: 20
Российская Федерация

Сказал(а) «Спасибо»: 14 раз
Добрый день. Суть задачи.
Есть сервер, где хранятся файлы (данные).
На клиенте производится подпись. Чтобы не гонять большие данные, на сервере высчитывается хэш (с помощью .Net Sharpei) и отправляется на клиента.
Клиент подписывает хэш с помощью Browser plug-in, и отправляет подписанный хэш на сервер.
На сервере у ServiceProvider, к примеру у Gost3410_2012_256CryptoServiceProvider, в методе VerifyHash я могу передать только хэш и подписанный хэш. Сертификат я не могу указать.
Правильно ли я понимаю, что:
1) В подписанном хэше уже есть информация об сертификате и поэтому сам сертификат с клиента присылать на сервер не требуется и для проверки сертификат не требуется?
2) Gost3410_2012_256CryptoServiceProvider (и др.) должны быть такие же на сервере, которыми подписывался хэш на клиенте? Как это лучше обеспечить? Может с клиента отправлять на сервер сертификат и из него можно как-то получить алгоритм для хэша?
3) Подписанный хэш я могу просто сохранить в текстовый файл с расширением .sig - и это будет моя открепленная подпись документа?

Отредактировано пользователем 19 апреля 2019 г. 10:11:03(UTC)  | Причина: Не указана

Offline Артём Макаров  
#2 Оставлено : 19 апреля 2019 г. 12:34:38(UTC)
Артём Макаров

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

Группы: Участники
Зарегистрирован: 20.02.2017(UTC)
Сообщений: 217

Сказал(а) «Спасибо»: 4 раз
Поблагодарили: 63 раз в 59 постах
Добрый день.

Объекты *CryptoServiceProvider характеризуют открытый или закрытый ключ сертификата.

Для проверки хэша вы должна создать объект CryptoServiceProvider используя соответствующий открытый ключ клиента, после чего проверить подпись для хэша.

В хэше никакой информации нет, это лишь последовательность байт с хэш значением для документа.
Техническую поддержку оказываем тут
Наша база знаний
thanks 1 пользователь поблагодарил Артём Макаров за этот пост.
Kilya оставлено 19.04.2019(UTC)
Offline Kilya  
#3 Оставлено : 19 апреля 2019 г. 12:55:52(UTC)
Kilya

Статус: Участник

Группы: Участники
Зарегистрирован: 13.11.2015(UTC)
Сообщений: 20
Российская Федерация

Сказал(а) «Спасибо»: 14 раз
Автор: Артём Макаров Перейти к цитате
Добрый день.

Объекты *CryptoServiceProvider характеризуют открытый или закрытый ключ сертификата.

Для проверки хэша вы должна создать объект CryptoServiceProvider используя соответствующий открытый ключ клиента, после чего проверить подпись для хэша.

В хэше никакой информации нет, это лишь последовательность байт с хэш значением для документа.


У меня от клиента на сервер пришел ПОДПИСАННЫЙ хэш. Там же есть информация о сертификате? Иначе как метод
Код:
public bool VerifyHash(byte[] hash, byte[] signature);

проверку осуществляет?

И все остался вопрос, как мне подписанный хэш привратить в открепленную подпись (файл *.sig)?
Offline two_oceans  
#4 Оставлено : 19 апреля 2019 г. 13:04:15(UTC)
two_oceans

Статус: Эксперт

Группы: Участники
Зарегистрирован: 05.03.2015(UTC)
Сообщений: 1,602
Российская Федерация
Откуда: Иркутская область

Сказал(а) «Спасибо»: 110 раз
Поблагодарили: 395 раз в 366 постах
По схеме нюанс - если в сертификате есть фио, снилс, то пользователю надо показать подписываемое в каком-либо виде иначе это будет идти в разрез с законодательством.

По вопросам - принципе все так и есть. Разве что надо уточнить, что есть "значение подписи" (для ГОСТ оно в 2 раза длинее чем значение хэша, то есть 64-128 байт, используется на уровне низкоуровневого CryptoAPI, по сути это зашифрованное закрытым ключом значение хэша) и есть подпись "в сборе" (отличимо длинее обычно от 500 байт до нескольких килобайт) - включающая значение подписи и еще много чего: может включать сертификат, может включать цепочку сертификатов без корневого или с корневым, дополнительные данные (например, штамп доверенного времени, списки отзыва на момент подписания), могут даже включаться исходные данные. Если исходные данные присутствуют, то это присоединенная подпись, если данные отсутствуют, то отсоединенная (открепленная) подпись. Похоже что под "подписанный хэш" Вы имеете в виду "подпись в сборе".

1) Если содержится сертификат в "подписи в сборе", то отдельно его передавать нет необходимости. Если только "значение подписи" в низкоуровневые функции, то нужно передавать дескриптор открытого ключа, полученный импортом кусочка с открытым ключом из контекста сертификата.

2) Да, для ГОСТ есть однозначное соответствие между алгоритмом хэширования и алгоритмом подписи. В сертификате/контексте сертификата есть поле оида алгоритма открытого ключа и к нему 2 поля параметров: оид параметров алгоритма хэширования и оид параметров алгоритма подписи. Не вдаваясь в подробности - у алгоритмов открытого ключа значений меньше, поэтому я бы посоветовал ориентироваться на него. Подробнее я уже на этом форуме уточнял, наверно это четвертый или пятый подобный вопрос с августа прошлого года.

Обратите внимание, что в сертификате есть еще поля алгоритм подписи и алгоритм хэширования, их не нужно использовать, так как они указывают на алгоритмы ключа удостоверяющего центра (УЦ) и теоретически могут отличаться от алгоритма ключа самого сертификата. У аккредитованных УЦ ФСБ и Минкомсвязь принудительно ввели соответствие, но любые неаккредитованные УЦ (для тестовых сертификатов и т.д.) могут подписать сертификат клиента ГОСТ-2012 сертификатом УЦ ГОСТ-2001 и ввести в заблуждение программы, смотрящие не то поле.

3) Если получили "подпись в сборе", то в целом да. Если получили только значение, то нет.

Обратите внимание, что для пересылки туда-обратно данные обычно кодируются в base64. А плагин вообще почти всегда принимает и отдает данные в base64. Поэтому файл подписи по-хорошему должен быть не текстовый, а двоичный - записать в файл нужно двоичные данные после декодирования из base64. Однако некоторые средства проверки подписи принимают подпись и в кодировке base64. В тот же плагин нужно посылать кодированное значение. С текстовым вариантом подписи в base64 главное не забыть, что данные в файле уже кодированы и не закодировать по ошибке еще разок. Обычно есть список требований для конкретного случая и там указывается допустимость кодировки в файле подписи. Хотя есть и печальные случаи когда люди знают только слова "усиленная квалифицированная электронная подпись", но не могут пояснить детали.

Присоединенная подпись всегда больше чем исходные данные, так как их содержит. Поэтому если получили "подпись в сборе" и она меньше исходных данных, то это отсоединенная подпись.

Отредактировано пользователем 19 апреля 2019 г. 13:07:20(UTC)  | Причина: Не указана

thanks 1 пользователь поблагодарил two_oceans за этот пост.
Kilya оставлено 19.04.2019(UTC)
Offline Kilya  
#5 Оставлено : 19 апреля 2019 г. 13:49:30(UTC)
Kilya

Статус: Участник

Группы: Участники
Зарегистрирован: 13.11.2015(UTC)
Сообщений: 20
Российская Федерация

Сказал(а) «Спасибо»: 14 раз
Автор: two_oceans Перейти к цитате

Спасибо за развернутый ответ. Почти все понял.

Документация по криптопро .net скудная, поэтому я не совсем понимаю что получаю на каком этапе. Попробую еще раз расписать.
1) На сервере есть файл, к примеру pdf. Я его считываю как массив байт. На сервере из этого массива байт я формирую хэш в массив и преобразую в строку

Код:
private string TestMethod(byte[] content)
{
    var algorithm = new Gost3411CryptoServiceProvider();
    byte[] hash = algorithm.ComputeHash(content);            
    StringBuilder hex = new StringBuilder(hash.Length * 2);
    foreach (byte b in hash)
        hex.AppendFormat("{0:x2}", b);
    return hex.ToString();
}


2) На клиент пришла строка хэша. Мы ее подписываем согласно примеру пример
По примеру на руках в итоге имеем подписанное сообщение
Код:
var sSignedMessage = yield oSignedData.SignCades(oSigner, CADESCOM_CADES_BES);


Как я понимаю, т.к. тут нет самого файла pdf, а только хэш, то мы получили как результат "открепленную подпись", верно?
Она содержит в себе подписанный хэш и информацию о сертификате. Так?

3) Результат шага 2 отправляем на сервер. Надо ли отправлять и сертификат?
Результат (подписанный хэш) надо проверить на подлинность (тут пока не разобрался до конца как это сделать). И если все хорошо, то сохранить рядом с исходным файлом как открепленную подпись, т.к. файл *.sig.
Верно я понимаю, что результат шага 2 я могу просто сохранить в файл *.sig? Это же есть моя открепленная подпись?

Отредактировано пользователем 19 апреля 2019 г. 14:21:21(UTC)  | Причина: Не указана

Offline Андрей Писарев  
#6 Оставлено : 19 апреля 2019 г. 14:12:40(UTC)
Андрей *

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

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

Сказал «Спасибо»: 549 раз
Поблагодарили: 2208 раз в 1723 постах
Здравствуйте.

В указанном примере не используется вызов SignCades.


Цитата:
а только хэш, то мы получили как результат "открепленную подпись", верно?


Если правильно использован пример - на выходе отсоединенная подпись.

Теперь Вы можете проверить её, используя исходный pdf и, например, КриптоАРМ.

Техническую поддержку оказываем тут
Наша база знаний
thanks 1 пользователь поблагодарил Андрей * за этот пост.
Kilya оставлено 19.04.2019(UTC)
Offline Kilya  
#7 Оставлено : 19 апреля 2019 г. 14:23:59(UTC)
Kilya

Статус: Участник

Группы: Участники
Зарегистрирован: 13.11.2015(UTC)
Сообщений: 20
Российская Федерация

Сказал(а) «Спасибо»: 14 раз
Автор: Андрей Писарев Перейти к цитате
Здравствуйте.

В указанном примере не используется вызов SignCades.


Цитата:
а только хэш, то мы получили как результат "открепленную подпись", верно?


Если правильно использован пример - на выходе отсоединенная подпись.

Теперь Вы можете проверить её, используя исходный pdf и, например, КриптоАРМ.



Изменил ссылку, не туда указал. Другой пример используем, где используется SignCades.
А могу я проверить подпись полученную, используя исходный pdf, но не КриптопроАрм, а средствами Криптопро .Net? Правильно смотрю на .Net SDK\Examples\simple\CMS\VerifyDetached ?
Offline Андрей Писарев  
#8 Оставлено : 19 апреля 2019 г. 15:18:49(UTC)
Андрей *

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

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

Сказал «Спасибо»: 549 раз
Поблагодарили: 2208 раз в 1723 постах
Автор: Kilya Перейти к цитате

Изменил ссылку, не туда указал. Другой пример используем, где используется SignCades.


Должны использовать: Вычисление подписи по хэш-значению

SignCades будет от данных (в данном случае уже вами вычисленный на сервере хеш)
вычислять хеш и именно его подписывать.
Техническую поддержку оказываем тут
Наша база знаний
Offline Андрей Писарев  
#9 Оставлено : 19 апреля 2019 г. 15:19:42(UTC)
Андрей *

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

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

Сказал «Спасибо»: 549 раз
Поблагодарили: 2208 раз в 1723 постах
Цитата:
А могу я проверить подпись полученную, используя исходный pdf, но не КриптопроАрм, а средствами Криптопро .Net? Правильно смотрю на .Net SDK\Examples\simple\CMS\VerifyDetache


Да, если правильно использовали подписание по хешу, а не через SignCades.
Техническую поддержку оказываем тут
Наша база знаний
Offline Kilya  
#10 Оставлено : 19 апреля 2019 г. 16:00:12(UTC)
Kilya

Статус: Участник

Группы: Участники
Зарегистрирован: 13.11.2015(UTC)
Сообщений: 20
Российская Федерация

Сказал(а) «Спасибо»: 14 раз
Автор: Андрей Писарев Перейти к цитате
Цитата:
А могу я проверить подпись полученную, используя исходный pdf, но не КриптопроАрм, а средствами Криптопро .Net? Правильно смотрю на .Net SDK\Examples\simple\CMS\VerifyDetache


Да, если правильно использовали подписание по хешу, а не через SignCades.


Пытаемся подписать хэш
Код:
const sSignedMessage = yield oSignedData.SignHash(cfg.hashAlg, oSigner, CADESCOM_CADES_BES);


Получаем ошибку:
Цитата:
Uncaught (in promise) Failed to create signature. Error: Параметр задан неверно. (0x80070057)
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
2 Страницы12>
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.