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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline Maxim Korobov  
#1 Оставлено : 19 мая 2010 г. 20:59:25(UTC)
Maxim Korobov

Статус: Активный участник

Группы: Участники
Зарегистрирован: 19.02.2008(UTC)
Сообщений: 66
Откуда: Москва

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

Стоит задача написать консольную утилиту, которая принимала бы параметры закрытого ключа и некий текст, зашифрованный открытым ключом, а на выходе в консоль выводила оригинальный текст. Причём возможны варианты когда используют утилиту в пакетном (*.bat) режиме в цикле, например, 20 раз. При этом важна скорость обработки.

Я сделал первый вариант. В нём при каждом вызове утилиты перечисляются доступные контейнеры, выбирается нужный, вводится пароль контейнера (который передаётся в утилиту через параметры запуска), создаётся контекст закрытого ключа, вызывается функция CryptDecryptMessage. На всё уходит около 8-10 секунд, что недостаточно быстро, необходимо на порядок быстрее.

Поэтому, я разделил задачу на 3 этапа:
1. Инициализация ключа. Выполняется 1 раз. Всё до создания контекста закрытого ключа включительно;
2. Расшифровка. Выполняется много раз. Функция CryptDecryptMessage (дважды, разумеется);
3. Очистка памяти. Выполняется 1 раз.

Поскольку CryptDecryptMessage не использует токен, желаемый результат достигается. Работает моментально. А токен вообще можно отключить от рабочей станции...

Вопросы к знатокам: насколько безопасно и надёжно хранить закрытый ключ в оперативной памяти? Есть ли другой способ (не связанный с выбором "более быстрого" носителя, чем рутокен).
Offline Maxim Korobov  
#2 Оставлено : 24 мая 2010 г. 15:41:43(UTC)
Maxim Korobov

Статус: Активный участник

Группы: Участники
Зарегистрирован: 19.02.2008(UTC)
Сообщений: 66
Откуда: Москва

Насколько я понял, для повышения безопасности такого решения стоит в контрольной панели Крипто-ПРО на вкладке Security указать хранение ключей не в памяти приложения, а в сервисе хранения ключей ("Keys Storage Service").
Offline Maxim Korobov  
#3 Оставлено : 28 мая 2010 г. 18:34:27(UTC)
Maxim Korobov

Статус: Активный участник

Группы: Участники
Зарегистрирован: 19.02.2008(UTC)
Сообщений: 66
Откуда: Москва

Пробую сделать кэширование средствами CryptoAPI, используя пример http://cryptopro.ru/cryptopro/forum/view.asp?q=478

Почему-то при попытке CertGetCertificateContextProperty(pCertContext, CERT_KEY_PROV_INFO_PROP_ID, nil, @datalen) с флагом CERT_KEY_PROV_INFO_PROP_ID возникает исключительная ситуация "The certificate does not have the specified property.

Важно! Я получаю контекст закрытого ключа с помощью CryptGetUserKey, а не с помощью CryptAcquireCertificatePrivateKey. Связано это с тем, что сам контекст сертификата получают из контейнера закрытого ключа (куда он записывается при создании нового ключа).
Offline Maxim Korobov  
#4 Оставлено : 28 мая 2010 г. 21:07:36(UTC)
Maxim Korobov

Статус: Активный участник

Группы: Участники
Зарегистрирован: 19.02.2008(UTC)
Сообщений: 66
Откуда: Москва

Согласно http://cryptopro.ru/cryp...ro/forum/view.asp?q=5816 подтвердилось, что CertEnumCertificateContextProperties возвращает в качестве количества атрибутов сертификата НОЛЬ.

Не понятно насчёт CryptAcquireCertificatePrivateKey - что она делает?
Offline Максим Коллегин  
#5 Оставлено : 29 мая 2010 г. 2:04:37(UTC)
Максим Коллегин

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

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

Сказал «Спасибо»: 32 раз
Поблагодарили: 706 раз в 614 постах
Вопрос-то в чем? В msdn все написано.
Знания в базе знаний, поддержка в техподдержке
Offline Maxim Korobov  
#6 Оставлено : 29 мая 2010 г. 3:11:44(UTC)
Maxim Korobov

Статус: Активный участник

Группы: Участники
Зарегистрирован: 19.02.2008(UTC)
Сообщений: 66
Откуда: Москва

Ругается 2148081675 'Cannot find the certificate and private key for decryption'.
Может, надо после получения сертификата из контейнера закрытого ключа принудительно связывать ключ и сертификат?

Отредактировано пользователем 29 мая 2010 г. 3:12:55(UTC)  | Причина: Не указана

Offline Максим Коллегин  
#7 Оставлено : 29 мая 2010 г. 3:14:48(UTC)
Максим Коллегин

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

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

Сказал «Спасибо»: 32 раз
Поблагодарили: 706 раз в 614 постах
В контейнере нет контекста сертификата - там голый сертификат в DER. Для расшифровки придется установить сертификат в личные и связать с ключом.
Знания в базе знаний, поддержка в техподдержке
Offline Maxim Korobov  
#8 Оставлено : 31 мая 2010 г. 21:12:31(UTC)
Maxim Korobov

Статус: Активный участник

Группы: Участники
Зарегистрирован: 19.02.2008(UTC)
Сообщений: 66
Откуда: Москва

Ух... Вызывал CertAddCertificateContextToStore, CertSetCertificateContextProperty. Всё отрабатывало без ошибок, но связи не было.
Благодаря http://www.cryptopro.ru/...oPro/forum/view.asp?q=81 понял в чём подвох. Надо сначала связать контекст сертификата с ключом, а потом устанавливать сертификат в хранилище. Тогда будет ссылка.

Отредактировано пользователем 31 мая 2010 г. 21:14:54(UTC)  | Причина: Не указана

Offline Maxim Korobov  
#9 Оставлено : 31 мая 2010 г. 22:56:50(UTC)
Maxim Korobov

Статус: Активный участник

Группы: Участники
Зарегистрирован: 19.02.2008(UTC)
Сообщений: 66
Откуда: Москва

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