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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline domian12  
#1 Оставлено : 2 марта 2012 г. 20:47:14(UTC)
domian12

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

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

Доброго времени суток.
Для работы с КриптоПРО CSP использую Sharpei.

Столкнулся с проблемой вроде бы на ровном месте.
Программа принимает параметры: имя сертификата и пароль контейнера, в котором сертификат расположен.
Первым действием ищется соответствующий сертификат по имени, а потом в Gost3410CryptoServiceProvider вписываю принятый пароль.
По Умолчанию, если пароль задан неверно, то при открытии ключа подписи у контейнера появится GUI окно с предложением ввести пароль.
Следовательно пароль перед этим нужно проверить программно - если он неверен, то выдать ошибку.

Как проверить пароль на корректность? Никаких всплывающих окно не должно быть.

Пример кода:

Цитата:

X509Certificate2 certificate2 = ... ;
string containerPass = "пароль";
var provider = (Gost3410CryptoServiceProvider)certificate2.PrivateKey;
var secure = new SecureString();

// проверить пароль

foreach (char charPass in containerPass)
{
secure.AppendChar(charPass);
}
provider.SetContainerPassword(secure);


Читал соответствующий пост. Но на данный момент затрудняюсь реализовать проверку.
Буду рад если подскажете решение.

Offline domian12  
#2 Оставлено : 2 марта 2012 г. 20:50:16(UTC)
domian12

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

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

И ещё вопрос в добавление. Серийный номер сертификата поле уникальное? Т.е. второго такого же номера на машине не может быть установлено?
В данный момент поиск сертификата идёт по SubjectName.
Offline Андрей Писарев  
#3 Оставлено : 2 марта 2012 г. 20:54:18(UTC)
Андрей *

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

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

Сказал «Спасибо»: 579 раз
Поблагодарили: 2307 раз в 1807 постах
domian12 написал:
И ещё вопрос в добавление. Серийный номер сертификата поле уникальное? Т.е. второго такого же номера на машине не может быть установлено?
В данный момент поиск сертификата идёт по SubjectName.


уникальный - в пределах выдавшего ЦС

используй - отпечаток сертификата (thumbprint) для поиска...

Отредактировано пользователем 2 марта 2012 г. 20:55:35(UTC)  | Причина: Не указана

Техническую поддержку оказываем тут
Наша база знаний
Offline domian12  
#4 Оставлено : 2 марта 2012 г. 22:12:42(UTC)
domian12

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

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

Андрей *, спасибо за информацию. Позже проверю.
Сейчас интересует проверка пароля.

Пока сделал так:


Код:

string ContainerPass = <пароль>;

         ...
        
        private static void FillcontainerPassword(X509Certificate2 certificate2)
        {
            var provider = (Gost3410CryptoServiceProvider)certificate2.PrivateKey;
            var secure = new SecureString();

            // заполняем пароль для контейнера, хранящего сертификат
            foreach (char charPass in ContainerPass)
            {
                secure.AppendChar(charPass);
            } 
//            secure.AppendChar('c');//ложный символ в пароль для проверки на false
            provider.SetContainerPassword(secure);
            CheckPassword(provider);
        }

        ...

        private static bool CheckPassword(Gost3410CryptoServiceProvider provider)
        {
            var encoding = new System.Text.UTF8Encoding();
            byte[] passBytes = encoding.GetBytes(ContainerPass);
            byte[] dummyHash = new byte[32];
            Array.Copy(passBytes, dummyHash, passBytes.Length);
            
            byte[] signHash = provider.SignHash(dummyHash);
            bool result = provider.VerifyHash(dummyHash, signHash);

            return result;
        }


На данный момент код работает если пароль вводится такой же как и у контейнера. Исправно возвращается result=true.
Если пароль сделать неверный, я умышленно добавляю в него лишний char 'c', то в момент вызова
Код:
byte[] signHash = provider.SignHash(dummyHash);


всплывает окно с предложением ввести верный пароль (осталось 2 попытки). Если ввожу неверный пароль, то генерируется исключение:
Цитата:
System.Security.Cryptography.CryptographicException: Нет доступа к карте. Введен неправильный PIN-код.

в CryptoPro.Sharpei.COMCryptography.SignValue(SafeProvHandleCP hProv, Int32 keyNumber, Byte[] rgbHash, Int32 dwFlags)
в CryptoPro.Sharpei.Gost3410CryptoServiceProvider.SignHash(Byte[] hash)


Предполагаю, что где-то нужно явно указать, чтобы не всплывали GUI-окна при работе приложения.
Ах, да. Я смогу всё-таки получить false в ответ на проверку или ловить Exception?

Отредактировано пользователем 2 марта 2012 г. 22:14:24(UTC)  | Причина: Не указана

Offline Павел Смирнов  
#5 Оставлено : 5 марта 2012 г. 11:25:35(UTC)
Павел Смирнов

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

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

Сказал(а) «Спасибо»: 1 раз
Поблагодарили: 48 раз в 44 постах
Делаете как в п.3 в) в FAQ, затем создаёте объект CspParameters, заполняя его по полученному CspKeyContainerInfo и не забыв флаг CspProviderFlags.NoPrompt, и действуете далее как в п.3 б) там же.
Техническую поддержку оказываем тут.
Наша база знаний.
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.