Статус: Новичок
Группы: Участники
Зарегистрирован: 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);
Читал соответствующий пост. Но на данный момент затрудняюсь реализовать проверку. Буду рад если подскажете решение.
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 01.03.2012(UTC) Сообщений: 7
|
И ещё вопрос в добавление. Серийный номер сертификата поле уникальное? Т.е. второго такого же номера на машине не может быть установлено? В данный момент поиск сертификата идёт по SubjectName.
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,753   Сказал «Спасибо»: 579 раз Поблагодарили: 2307 раз в 1807 постах
|
domian12 написал:И ещё вопрос в добавление. Серийный номер сертификата поле уникальное? Т.е. второго такого же номера на машине не может быть установлено? В данный момент поиск сертификата идёт по SubjectName. уникальный - в пределах выдавшего ЦС используй - отпечаток сертификата (thumbprint) для поиска... Отредактировано пользователем 2 марта 2012 г. 20:55:35(UTC)
| Причина: Не указана |
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 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)
| Причина: Не указана
|
|
|
|
Статус: Вам и не снилось
Группы: Администраторы
Зарегистрирован: 24.12.2007(UTC) Сообщений: 831 Откуда: Крипто-Про
Сказал(а) «Спасибо»: 1 раз Поблагодарили: 48 раз в 44 постах
|
Делаете как в п.3 в) в FAQ, затем создаёте объект CspParameters, заполняя его по полученному CspKeyContainerInfo и не забыв флаг CspProviderFlags.NoPrompt, и действуете далее как в п.3 б) там же. |
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close