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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline Алексей Завьялов  
#1 Оставлено : 26 ноября 2009 г. 18:52:47(UTC)
Алексей Завьялов

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

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

Здравствуйте,

Я занимаюсь разработкой сервиса 24/7 с фукнционалом ЭЦП, соотвественно критичино чтобы не было блокировок на UI. Версия КриптоПро 3.0.

пользуюсь функцией CryptSetProvParam для установки пароля для доступа контейнеру
Хэндл CSP получаю CryptAcquireContext с флагом CRYPT_SILENT

Если пароль не верный CryptSetProvParam возвращает TRUE при этом GetLastError возвращает 0

В документации по CryptoApi написано, что при устанновленном CRYPT_SILENT все функции стреляют со специфичной ошибкой в GetLastError

У меня вопрос как отследить правильность введенного пароля?
Offline Максим Коллегин  
#2 Оставлено : 26 ноября 2009 г. 18:55:02(UTC)
Максим Коллегин

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

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

Сказал «Спасибо»: 37 раз
Поблагодарили: 720 раз в 624 постах
выполнить операцию с закрытым ключом.
Знания в базе знаний, поддержка в центре поддержки
Offline Алексей Завьялов  
#3 Оставлено : 26 ноября 2009 г. 19:29:02(UTC)
Алексей Завьялов

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

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

Оставил просто CryptSignMessage вот пример кода он тестовый без проверок

ZeroMemory(@SigParams, sizeof(CRYPT_SIGN_MESSAGE_PARA));
SigParams.cbSize := sizeof(CRYPT_SIGN_MESSAGE_PARA);
SigParams.dwMsgEncodingType := X509_ASN_ENCODING or PKCS_7_ASN_ENCODING;
SigParams.pSigningCert := pContext;
SigParams.HashAlgorithm.pszObjId := pContext^.pCertInfo^.SignatureAlgorithm.pszObjId;
SigParams.cMsgCert := 1;
SigParams.rgpMsgCert := @pContext;

MessageArray := @Buf;
MessageSizeArray := 15000;

if CryptSignMessage(@SigParams, True, 1, MessageArray, @MessageSizeArray, nil, cbSignedMessageBlob) then

Функция втихую отрабатывает при этом не спрашивает никаких паролей.
У меня вопрос получается если сертифкат имеет приватный ключ в контейнере то любой троян легко подпишет что угодно?
Offline Алексей Завьялов  
#4 Оставлено : 26 ноября 2009 г. 19:44:31(UTC)
Алексей Завьялов

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

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

Да вот что оказывается, что, если в диалоге поставить галочку запомнить пароль, то он действительно запоминатеся в реестре. и больше паорль не запрашивается.
Offline Алексей Завьялов  
#5 Оставлено : 26 ноября 2009 г. 20:09:01(UTC)
Алексей Завьялов

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

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

Уважаемый знатоки помогите пожалуйста разобраться с проблемой.
Не совсем понятно что имел в виду maxdm в своем комментарии.

Сформиулирую вопрос ещё:
При вызове упрощенной функции подписи CryptSignMessage запускается диалог с запоросом пароля. Как избежать этого диалога понятно (CryptSetProvParam).
Вопрос в том, как определить ситуацию, что пароль неправильный?
Offline Kirill Sobolev  
#6 Оставлено : 27 ноября 2009 г. 14:54:02(UTC)
Кирилл Соболев

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

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

Поблагодарили: 177 раз в 168 постах
Почитайте руководство программиста для CSP 3.0.
Цитата:
CPSignHash:
Возвращаемые значения
При успешном завершении функция возвращает TRUE, в противном случае возвращается FALSE. Если возвращается FALSE, соответствующий код ошибки (см. таблицу) может быть получен через функцию GetLastError().
...
SCARD_W_WRONG_CHV Пользователь ввел неправильный пароль или пароль, установленный функцией SetProvParam(), неправильный
Техническую поддержку оказываем тут
Наша база знаний
Offline Алексей Завьялов  
#7 Оставлено : 27 ноября 2009 г. 15:57:48(UTC)
Алексей Завьялов

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

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

Огромное спасибо за помощь.
В принципе CryptSignData также стреляет с ошибкой в getLastError, если неправильно задан пароль.

По ходу возник вопрос по CryptSignMessage - эта функция создает ЭЦП в формате pks#7 для этого в буфер заворачивается информация об открытом ключе.
Фактически эта фукнция упрощенная обертка вокруг функций CrpytHashData, CryptSignData

В примерах в мсдне написано что для экспорта открытого ключа используется что-то типа CryptGetUserKey, про которую написано следующее:

"This function is used only by the owner of the public/private key pairs and only when the handle of a cryptographic service provider (CSP) and its associated key container is available."

Так вот у меня вопрос что за пользователь, о котором здесь идет речь и не будет ли ошибок при вызове CryptSignMessage в контексте сервиса приложения из под пользователя?
Offline Kirill Sobolev  
#8 Оставлено : 27 ноября 2009 г. 18:29:13(UTC)
Кирилл Соболев

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

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

Поблагодарили: 177 раз в 168 постах
Цитата:
CryptSignData

Наверное, Вы имеете ввиду CryptSignHash, т.к. CryptoAPI не позволяет подписывать непосредственно данные.
Цитата:
Так вот у меня вопрос что за пользователь, о котором здесь идет речь и не будет ли ошибок при вызове CryptSignMessage в контексте сервиса приложения из под пользователя?

Здесь пользователь - это тот, кто имеет доступ к закрытому ключу, необходимому для создания подписи. Если ключ для пользователя, под которым работает сервис, недоступен, то ошибки конечно будут. Поэтому для сервисов ключи рекомендуется хранить в не в разделе пользователя, а в разделе локального компьютера.
Техническую поддержку оказываем тут
Наша база знаний
Offline Алексей Завьялов  
#9 Оставлено : 27 ноября 2009 г. 18:37:34(UTC)
Алексей Завьялов

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

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

Спасибо большое.
я нашел в документации ключ с которым нужно вызывать CryptAqcurieContext - CRYPT_MACHINE_KEYSET. всё вроде как работает, функции отрабатывают, диалог не появляется.

Ещё раз спасибо большое!!
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest (2)
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.