Статус: Новичок
Группы: Участники
Зарегистрирован: 26.11.2009(UTC) Сообщений: 7
|
Здравствуйте,
Я занимаюсь разработкой сервиса 24/7 с фукнционалом ЭЦП, соотвественно критичино чтобы не было блокировок на UI. Версия КриптоПро 3.0.
пользуюсь функцией CryptSetProvParam для установки пароля для доступа контейнеру Хэндл CSP получаю CryptAcquireContext с флагом CRYPT_SILENT
Если пароль не верный CryptSetProvParam возвращает TRUE при этом GetLastError возвращает 0
В документации по CryptoApi написано, что при устанновленном CRYPT_SILENT все функции стреляют со специфичной ошибкой в GetLastError
У меня вопрос как отследить правильность введенного пароля?
|
|
|
|
Статус: Сотрудник
Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC) Сообщений: 6,405  Откуда: КРИПТО-ПРО Сказал «Спасибо»: 37 раз Поблагодарили: 720 раз в 624 постах
|
выполнить операцию с закрытым ключом. |
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 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
Функция втихую отрабатывает при этом не спрашивает никаких паролей. У меня вопрос получается если сертифкат имеет приватный ключ в контейнере то любой троян легко подпишет что угодно?
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 26.11.2009(UTC) Сообщений: 7
|
Да вот что оказывается, что, если в диалоге поставить галочку запомнить пароль, то он действительно запоминатеся в реестре. и больше паорль не запрашивается.
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 26.11.2009(UTC) Сообщений: 7
|
Уважаемый знатоки помогите пожалуйста разобраться с проблемой. Не совсем понятно что имел в виду maxdm в своем комментарии.
Сформиулирую вопрос ещё: При вызове упрощенной функции подписи CryptSignMessage запускается диалог с запоросом пароля. Как избежать этого диалога понятно (CryptSetProvParam). Вопрос в том, как определить ситуацию, что пароль неправильный?
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 25.12.2007(UTC) Сообщений: 1,733  Откуда: КРИПТО-ПРО Поблагодарили: 177 раз в 168 постах
|
Почитайте руководство программиста для CSP 3.0. Цитата:CPSignHash: Возвращаемые значения При успешном завершении функция возвращает TRUE, в противном случае возвращается FALSE. Если возвращается FALSE, соответствующий код ошибки (см. таблицу) может быть получен через функцию GetLastError(). ... SCARD_W_WRONG_CHV Пользователь ввел неправильный пароль или пароль, установленный функцией SetProvParam(), неправильный
|
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 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 в контексте сервиса приложения из под пользователя?
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 25.12.2007(UTC) Сообщений: 1,733  Откуда: КРИПТО-ПРО Поблагодарили: 177 раз в 168 постах
|
Наверное, Вы имеете ввиду CryptSignHash, т.к. CryptoAPI не позволяет подписывать непосредственно данные. Цитата:Так вот у меня вопрос что за пользователь, о котором здесь идет речь и не будет ли ошибок при вызове CryptSignMessage в контексте сервиса приложения из под пользователя? Здесь пользователь - это тот, кто имеет доступ к закрытому ключу, необходимому для создания подписи. Если ключ для пользователя, под которым работает сервис, недоступен, то ошибки конечно будут. Поэтому для сервисов ключи рекомендуется хранить в не в разделе пользователя, а в разделе локального компьютера. |
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 26.11.2009(UTC) Сообщений: 7
|
Спасибо большое. я нашел в документации ключ с которым нужно вызывать CryptAqcurieContext - CRYPT_MACHINE_KEYSET. всё вроде как работает, функции отрабатывают, диалог не появляется.
Ещё раз спасибо большое!!
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close