Функция CryptProtectData (dpapi.h)
Функция CryptProtectData выполняет шифрование данных в DATA_BLOB структуре. Как правило, расшифровать данные может только пользователь с теми же учетными данными для входа, что и пользователь, который зашифровал данные. Кроме того, шифрование и расшифровка обычно выполняются на одном компьютере. Сведения об исключениях см. в разделе Примечания.
Синтаксис
DPAPI_IMP BOOL CryptProtectData(
[in] DATA_BLOB *pDataIn,
[in, optional] LPCWSTR szDataDescr,
[in, optional] DATA_BLOB *pOptionalEntropy,
[in] PVOID pvReserved,
[in, optional] CRYPTPROTECT_PROMPTSTRUCT *pPromptStruct,
[in] DWORD dwFlags,
[out] DATA_BLOB *pDataOut
);
Параметры
[in] pDataIn
Указатель на структуру DATA_BLOB , содержащую зашифрованный открытый текст .
[in, optional] szDataDescr
Строка с удобочитаемым описанием зашифрованных данных. Эта строка описания включена в зашифрованные данные. Этот параметр является необязательным и может иметь значение NULL.
[in, optional] pOptionalEntropy
Указатель на структуру DATA_BLOB , содержащую пароль или другую дополнительную энтропию, используемую для шифрования данных. Структура DATA_BLOB , используемая на этапе шифрования, также должна использоваться на этапе расшифровки. Для этого параметра можно задать значение NULL без дополнительной энтропии. Сведения о защите паролей см. в разделе Обработка паролей.
[in] pvReserved
Зарезервировано для использования в будущем и должно иметь значение NULL.
[in, optional] pPromptStruct
Указатель на структуру CRYPTPROTECT_PROMPTSTRUCT , которая предоставляет сведения о том, где и когда должны отображаться запросы, а также о содержимом этих запросов. Для этого параметра можно задать значение NULL на этапах шифрования и расшифровки.
[in] dwFlags
Этот параметр может быть одним из следующих флагов.
Значение | Значение |
---|---|
|
Если этот флаг установлен, он связывает зашифрованные данные с текущим компьютером, а не с отдельным пользователем. Любой пользователь на компьютере, на котором вызывается CryptProtectData , может использовать CryptUnprotectData для расшифровки данных. |
|
Этот флаг используется в удаленных ситуациях, когда представление пользовательского интерфейса не является вариантом. Если этот флаг установлен и для операции защиты или отмены защиты указан пользовательский интерфейс, операция завершается сбоем и GetLastError возвращает код ERROR_PASSWORD_RESTRICTION. |
|
Этот флаг создает аудит операций защиты и отмены защиты. Записи журнала аудита записываются только в том случае, если параметр szDataDescr не имеет значения NULL и не пуст. |
[out] pDataOut
Указатель на структуру DATA_BLOB , которая получает зашифрованные данные. Завершив использование структуры DATA_BLOB , освободите ее член pbData , вызвав функцию LocalFree .
Возвращаемое значение
Если функция выполняется успешно, функция возвращает значение TRUE.
Если функция завершается сбоем, она возвращает значение FALSE. Для получения дополнительных сведений об ошибке вызовите Метод GetLastError.
Комментарии
Как правило, только пользователь с учетными данными входа, которые соответствуют учетным данным пользователя, который зашифровал данные, может расшифровать данные. Кроме того, расшифровку обычно можно выполнить только на том компьютере, где были зашифрованы данные. Однако пользователь с перемещаемым профилем может расшифровать данные с другого компьютера в сети.
Если флаг CRYPTPROTECT_LOCAL_MACHINE установлен при шифровании данных, любой пользователь на компьютере, на котором было выполнено шифрование, может расшифровать данные.
Функция создает ключ сеанса для шифрования. Ключ сеанса извлекается снова при расшифровке данных.
Функция также добавляет код проверки подлинности сообщения (MAC) (ключ целостности проверка) к зашифрованным данным для защиты от незаконного изменения данных.
Чтобы зашифровать память для временного использования в том же процессе или в нескольких процессах, вызовите функцию CryptProtectMemory .
Примеры
В следующем примере показано шифрование данных в структуре DATA_BLOB . Функция CryptProtectData выполняет шифрование с помощью сеансового ключа, создаваемого функцией с использованием учетных данных для входа пользователя. Другой пример, в котором используется эта функция, см. в разделе Пример программы C: использование CryptProtectData.
// Encrypt data from DATA_BLOB DataIn to DATA_BLOB DataOut.
//--------------------------------------------------------------------
// Declare and initialize variables.
DATA_BLOB DataIn;
DATA_BLOB DataOut;
BYTE *pbDataInput =(BYTE *)"Hello world of data protection.";
DWORD cbDataInput = strlen((char *)pbDataInput)+1;
//--------------------------------------------------------------------
// Initialize the DataIn structure.
DataIn.pbData = pbDataInput;
DataIn.cbData = cbDataInput;
//--------------------------------------------------------------------
// Begin protect phase. Note that the encryption key is created
// by the function and is not passed.
if(CryptProtectData(
&DataIn,
L"This is the description string.", // A description string
// to be included with the
// encrypted data.
NULL, // Optional entropy not used.
NULL, // Reserved.
NULL, // Pass NULL for the
// prompt structure.
0,
&DataOut))
{
printf("The encryption phase worked.\n");
LocalFree(DataOut.pbData);
}
else
{
printf("Encryption error using CryptProtectData.\n");
exit(1);
}
Требования
Минимальная версия клиента | Windows XP [классические приложения | Приложения UWP] |
Минимальная версия сервера | Windows Server 2003 [классические приложения | Приложения UWP] |
Целевая платформа | Windows |
Header | dpapi.h |
Библиотека | Crypt32.lib |
DLL | Crypt32.dll |