Статус: Новичок
Группы: Участники
Зарегистрирован: 30.09.2009(UTC) Сообщений: 1 Откуда: Volgograd
|
Здравствуйте! Есть такой вопрос. Пользователь A через веб интерфейс подписывает (с помощью CAPICOM) и загружает файл на сервер. Сервер должен выполнить проверку ЭЦП прежде чем сохранить файл в БД, а также каждый раз, предоставляя пользователю Б возможность скачать этот файл проверять ЭЦП на случай подмены. Вопросы такие: 1. Как грамотно организовать получение сертификата пользователя А на стороне сервера? Видел получение из сессии, но соединение скорее всего будет не по SSL. 2. Даже вручную установив сертификат пользователя в хранилище система порождает исключение "Поставщик не смог выполнить действие, поскольку контекст был получен как "тихий"" в момент выполнения Gost.VerifyData. Что это означает? Код:
string StringSign =...
byte[] Data =...
UTF8Encoding ByteConverter = new UTF8Encoding();
Byte[] Sign = ByteConverter.GetBytes(StringSign);
var GostHash = new Gost3411CryptoServiceProvider();
var Gost = new Gost3410CryptoServiceProvider();
bool b = Gost.VerifyData(Data, GostHash, Sign);
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 24.12.2007(UTC) Сообщений: 390 Откуда: КриптоПро Поблагодарили: 2 раз в 2 постах
|
1. Все зависит от доверия сертификату. Если Вы доверяете абсолютно всем сертификатам, чьи центры находятся находятся в хранилище сервера, то можно передавать сертификат вместе с сообщением, а при проверке - строить и проверять цепочку. Если Вы доверяете только ограниченному набору пользователей, то придется доставать сертификат из хранилища доверенных пользователей. Если Вы доверяете любому пользователю, кто смог установить с сервером SSL соединение и при этом сообщение обязательно должно быть подписано этим сертификатом, то можно доставать и из SSL сессии. 2. Не понятно как приведенный выше код связан с сертификатами... Цитата:var Gost = new Gost3410CryptoServiceProvider(); bool b = Gost.VerifyData(Data, GostHash, Sign); Означает примерно следующее: 1. Открыть провайдер ГОСТ. 2. Так как в провайдере отсутствует ключ, на котором проверять, то сгенерировать случайный ключ. 3. Проверить на этом случайном ключе подпись с заданым hash. Сообщение "Поставщик не смог выполнить действие, поскольку контекст был получен как "тихий"" означает, что Sharpei с CSP попытались выдать окно (скорее всего при генерации секретного ключа), а выдача окон была запрещена. |
С уважением, Александр. |
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 16.12.2011(UTC) Сообщений: 2
|
Здравствуйте,
Не могли бы вы уточнить "2. Так как в провайдере отсутствует ключ, на котором проверять, то сгенерировать случайный ключ.", что это за ключ? ведь для проверки валидности подписи требуется открытый ключ, который содержится в подписи. Видимо это связано с тем что получаю я, а именно: при проверке подписи выводится окно с просьбой установки пароля на создаваемый контейнер..
Код следующий: var Gost = new Gost3410CryptoServiceProvider(); var GostHash = new Gost3411CryptoServiceProvider(); var isVerified = Gost.VerifyData(fileContent, GostHash, signedFileContent);
Помогите разобраться плиз!
|
|
|
|
Статус: Сотрудник
Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC) Сообщений: 6,390 Откуда: КРИПТО-ПРО Сказал «Спасибо»: 37 раз Поблагодарили: 714 раз в 619 постах
|
Могу посоветовать покурить примеры из SDK. Возвращаться через пару дней. |
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 16.12.2011(UTC) Сообщений: 2
|
Это было первое что я сделал =)
При использовании следующего:
var Gost = new Gost3410CryptoServiceProvider(); bool b = GostVerifyHash(fileContent, signedFileContent, Gost, "Gost3411");
Метод GostVerifyHash взял из примеров.. static bool GostVerifyHash(byte[] HashValue, byte[] SignedHashValue, AsymmetricAlgorithm key, string HashAlg) { try { //Создаем форматтер подписи с закрытым ключом из переданного //функции криптопровайдера. GostSignatureDeformatter Deformatter = new GostSignatureDeformatter(key);
//Устанавливаем хэш-алгоритм. Deformatter.SetHashAlgorithm(HashAlg);
//Проверяем подпись и возвращаем результат. return Deformatter.VerifySignature(HashValue, SignedHashValue); } catch (CryptographicException e) { Console.WriteLine(e.Message); return false; } }
возвращает ошибку: Размер значения хеш-функции GOST3411:32 байт(ов).
Причём если использовать Com объект CAdESCOM то подпись нормально проверяется
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close