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

Уведомление

Icon
Error

3 Страницы123>
Опции
К последнему сообщению К первому непрочитанному
Offline user111  
#1 Оставлено : 21 августа 2015 г. 8:53:27(UTC)
user111

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

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

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

Есть задача подписать pdf на стороне клиента. Сделал решение, которое работает на алгоритмах SHA1 RSA. Пытаюсь заставить его работать на ГОСТ алгоритмах, но при проверке подписи в Adobe Reader, контент документа изменен и подпись не действительна.

Работает так. Клиенту на подпись отправляется AuthenticatedAttributeBytes:

Код:

                var sgn = new PdfPKCS7(null, new[] {cert}, "SHA1", false);
                Stream data = sap.GetRangeStream();

                HashAlgorithm myhash = HashAlgorithm.Create("GOST3411");
                byte[] messageHash = myhash.ComputeHash(data);
                
                var now = DateTime.Now;
                signaturedto = new SignatureDTO
                {
                    Hash = messageHash,
                    AuthenticatedAttributeBytes = sgn.getAuthenticatedAttributeBytes(messageHash, now, null, null, CryptoStandard.CADES),
                    Now = now,
                    SignatureAppearance = sap,
                    Sign = sgn,
                    Stream = os
                };


С помощью CAPICOM в IE клиента строка подписывается и отправляется на сервер. То что подписал пользователь помещается в newArray и далее:

Код:
   
                ClassPass.Result.Sign.SetExternalDigest(newArray, null, "RSA");
                byte[] encodedSig = ClassPass.Result.Sign.GetEncodedPKCS7(ClassPass.Result.Hash, ClassPass.Result.Now, null, null, null, CryptoStandard.CADES);
                byte[] paddedSig = new byte[8192];
                Array.Copy(encodedSig, 0, paddedSig, 0, encodedSig.Length);
                PdfDictionary pdfDic = new PdfDictionary();
                pdfDic.Put(PdfName.CONTENTS, new PdfString(paddedSig).SetHexWriting(true));
                ClassPass.Result.SignatureAppearance.Close(pdfDic);
                result = "Файл подписанного отношения сформирован и сохранен";
                return result;


таким образом, подпись считывается правильно, но хэш с исходным документом не совпадает. Я думаю проблема в SHA1 и RSA, которые остались от первоначального кода, но я не знаю как сделать это более правильно. В каком направлении копать?
Offline Boris@Serezhkin.com  
#2 Оставлено : 21 августа 2015 г. 9:02:50(UTC)
Boris@Serezhkin.com

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

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

Сказал(а) «Спасибо»: 4 раз
Поблагодарили: 11 раз в 10 постах
Проблема в том, что CAPICOM подписывает не совсем то что ей передают. Обсуждалось и не раз.
не помню точно, но вроде добавляет 0х00 после каждого исходного байта.
Offline user111  
#3 Оставлено : 21 августа 2015 г. 9:40:50(UTC)
user111

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

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

Сказал(а) «Спасибо»: 1 раз
Цитата:
Проблема в том, что CAPICOM подписывает не совсем то что ей передают. Обсуждалось и не раз.
не помню точно, но вроде добавляет 0х00 после каждого исходного байта.

Я сталкивался с несколькими проблемами в использовании CAPICOM и решил их.
До перехода на сертификаты с ГОСТ алгоритмами проблем уже не было и подписи определялись как действительные.
Если в двух словах, то проверяется четность отправляемых байт и отсутствие символов в UTF16 из-за которых возникают ошибки.
Offline user111  
#4 Оставлено : 24 августа 2015 г. 7:32:48(UTC)
user111

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

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

Сказал(а) «Спасибо»: 1 раз
Здравствуйте! Вопрос всё еще актуальный. Необходимо подписать pdf на стороне клиента, какие есть варианты?
Offline Максим Коллегин  
#5 Оставлено : 24 августа 2015 г. 8:40:09(UTC)
Максим Коллегин

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

Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC)
Сообщений: 6,453
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 38 раз
Поблагодарили: 748 раз в 643 постах
КриптоПро DSS Lite, например.

Отредактировано пользователем 24 августа 2015 г. 8:40:41(UTC)  | Причина: Не указана

Знания в базе знаний, поддержка в центре поддержки
Offline user111  
#6 Оставлено : 24 августа 2015 г. 9:09:08(UTC)
user111

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

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

Сказал(а) «Спасибо»: 1 раз
Автор: maxdm Перейти к цитате
КриптоПро DSS Lite, например.

Закрытый ключ при данном варианте должен храниться на сервере?

Offline Юрий  
#7 Оставлено : 24 августа 2015 г. 9:26:29(UTC)
Юрий

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

Группы: Участники
Зарегистрирован: 22.01.2008(UTC)
Сообщений: 675
Мужчина
Российская Федерация
Откуда: Йошкар-Ола

Сказал «Спасибо»: 3 раз
Поблагодарили: 95 раз в 68 постах
user111, а если бы у вас была библиотека, которая бы подписывала PDF прямо в браузере, с помощью чистого JavaScript, с хранением закрытого ключа только на клиенте, без отправки какой-либо информации на сервер (кроме запросов на OCSP и TSP ответы), то такая библиотека отвечала бы вашим задачам?
С уважением,
Юрий Строжевский
Offline user111  
#8 Оставлено : 24 августа 2015 г. 10:16:58(UTC)
user111

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

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

Сказал(а) «Спасибо»: 1 раз
Юрий, pdf файл находится на сервере и желательно, чтобы клиент подписывал только его хэш. Это нужно для того, чтобы клиент совершал минимум действий для подписи файла.
Offline Павел Смирнов  
#9 Оставлено : 24 августа 2015 г. 10:24:07(UTC)
Павел Смирнов

Статус: Вам и не снилось

Группы: Администраторы
Зарегистрирован: 24.12.2007(UTC)
Сообщений: 831
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 1 раз
Поблагодарили: 48 раз в 44 постах
В КриптоПро DSS Lite ключ хранится у клиента.
Техническую поддержку оказываем тут.
Наша база знаний.
Offline Юрий  
#10 Оставлено : 24 августа 2015 г. 10:24:13(UTC)
Юрий

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

Группы: Участники
Зарегистрирован: 22.01.2008(UTC)
Сообщений: 675
Мужчина
Российская Федерация
Откуда: Йошкар-Ола

Сказал «Спасибо»: 3 раз
Поблагодарили: 95 раз в 68 постах
Автор: user111 Перейти к цитате
Юрий, pdf файл находится на сервере и желательно, чтобы клиент подписывал только его хэш. Это нужно для того, чтобы клиент совершал минимум действий для подписи файла.

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