03.04.2003 5:17:56Кэширование ключей Ответов: 3
Eugeny Bushmanov
Можно ли программно (из приложения) выбросить ключ из кэша или (что предпочтительнее) сделать выбранный ключ некэшируемым?
 
Ответы:
03.04.2003 10:42:50kure
Вообще функции CryptoAPI по умолчания не кешируют контекст ключа.

Но можно включить кеширование.

В примерах это выглядит следующим образом:


/*--------------------------------------------------------------------*/
/* Для того чтобы функция CryptAcquireContext не загружала постоянно*/
/* провайдер и ключ можно использовать флаг CERT_SET_KEY_CONTEXT_PROP_ID или*/
/* CERT_SET_KEY_PROV_HANDLE_PROP_ID в значении флага структуры CRYPT_KEY_PROV_INFO.*/
/**/
/* Для этого определим наличие этого свойства и перезапишем флаг*/
ret = CertGetCertificateContextProperty(pUserCert,
CERT_KEY_PROV_INFO_PROP_ID, NULL, &cbData);
if (ret) {
pCryptKeyProvInfo = (CRYPT_KEY_PROV_INFO *)malloc(cbData);
if(!pCryptKeyProvInfo)
HandleErrorFL("Error in allocation of memory.");

ret = CertGetCertificateContextProperty(pUserCert,
CERT_KEY_PROV_INFO_PROP_ID, pCryptKeyProvInfo,&cbData);
if (ret)
{
/* Установим флаг кеширования провайдера*/
pCryptKeyProvInfo->dwFlags = CERT_SET_KEY_CONTEXT_PROP_ID;
/* Установим свойства в контексте сертификата*/
ret = CertSetCertificateContextProperty(pUserCert, CERT_KEY_PROV_INFO_PROP_ID,
CERT_STORE_NO_CRYPT_RELEASE_FLAG, pCryptKeyProvInfo);
free(pCryptKeyProvInfo);
}
else
HandleErrorFL("The property was not retrieved.");
}
else {
printf ("Cannot retrive certificate property.\n");
}
03.04.2003 13:30:28Eugeny Bushmanov
Спасибо за пример, но я имел ввиду немного другое:

При выбранном в настройках КриптоПро
"Store keys in Key Storage Service" и включенном "Turn on caching" единожды использованые ключи остаются доступными для приложений до перезагрузки машины и носитель ключа при этом уже не требуется. Это хорошо, просто замечательно, но не всегда. Хотелось бы иметь возможность выборочно кэшировать либо не кэшировать отдельные ключи или иметь возможность программно выкинуть ключ из кэша, что бы пользователь без носителя ключа не мог этот ключ использовать.

Например, ключи, используемые для шифрования кэшировать полезно, а для ЭЦП - мягко говоря, странно.

Можно ли это сделать, и если да - то как?
03.04.2003 13:42:52kure
Если вы пишете программу, то нужно использовать возможность кеширования программно.

Кеширование через панель управления сделана не для пользователей, а для использования, например, в серере, который использует CAPICOM.