Ключевое слово в защите информации
КЛЮЧЕВОЕ СЛОВО
в защите информации
Получить ГОСТ 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
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.