Поделиться через


Функция CryptProtectMemory (dpapi.h)

Функция CryptProtectMemoryшифрует память, чтобы другие пользователи не могли просматривать конфиденциальную информацию в процессе. Например, используйте функцию CryptProtectMemory для шифрования памяти, содержащей пароль. Шифрование пароля не позволяет другим пользователям просматривать его при выходе процесса в файл подкачки. В противном случае пароль будет представлен в виде открытого текста и доступен для просмотра другими пользователями.

Синтаксис

DPAPI_IMP BOOL CryptProtectMemory(
  [in, out] LPVOID pDataIn,
  [in]      DWORD  cbDataIn,
  [in]      DWORD  dwFlags
);

Параметры

[in, out] pDataIn

Указатель на блок памяти для шифрования. Параметр cbDataIn указывает количество байтов, которые будут зашифрованы. Если данные, содержащиеся в пространстве памяти, меньше указанного числа байтов, данные за пределами предполагаемого блока будут зашифрованы. Если он больше байтов cbDataIn , шифруются только первые байты cbDataIn .

[in] cbDataIn

Число байтов памяти, на которые указывает параметр pData для шифрования. Число байтов должно быть кратно константе CRYPTPROTECTMEMORY_BLOCK_SIZE , определенной в Wincrypt.h.

[in] dwFlags

Этот параметр может быть одним из следующих флагов. При шифровании и расшифровке памяти необходимо указать тот же флаг.

Значение Значение
CRYPTPROTECTMEMORY_SAME_PROCESS
Шифрование и расшифровка памяти в одном процессе. Приложение, выполняющееся в другом процессе, не сможет расшифровать данные.
CRYPTPROTECTMEMORY_CROSS_PROCESS
Шифрование и расшифровка памяти в различных процессах. Приложение, выполняющееся в другом процессе, сможет расшифровать данные.
CRYPTPROTECTMEMORY_SAME_LOGON
Используйте одни и те же учетные данные входа для шифрования и расшифровки памяти в разных процессах. Приложение, выполняющееся в другом процессе, сможет расшифровать данные. Однако процесс должен выполняться от имени того же пользователя, который зашифровал данные и в том же сеансе входа.

Возвращаемое значение

Если функция выполнена успешно, функция возвращает значение TRUE.

Если функция завершается сбоем, она возвращает значение FALSE. Чтобы получить дополнительные сведения об ошибке, вызовите Метод GetLastError.

Комментарии

Использование CryptProtectMemory и CryptUnprotectMemory для шифрования паролем не является безопасным, так как данные существуют в виде открытого текста в памяти перед их шифрованием и в любое время вызывающий объект расшифровывает их для использования.

Как правило, функция CryptProtectMemory используется для шифрования конфиденциальной информации, которую вы собираетесь расшифровать во время выполнения процесса. Не используйте эту функцию для сохранения данных, которые вы хотите расшифровать позже; вы не сможете расшифровать данные при перезагрузке компьютера. Чтобы сохранить зашифрованные данные в файл для расшифровки позже, используйте функцию CryptProtectData .

Вызовите функцию CryptUnprotectMemory для расшифровки памяти, зашифрованной с помощью функции CryptProtectMemory . Завершив использование конфиденциальной информации, очистите их из памяти, вызвав функцию SecureZeroMemory .

Используйте флаг CRYPTPROTECTMEMORY_CROSS_PROCESS или CRYPTPROTECTMEMORY_SAME_LOGON, если вы используете RPC или LRPC для передачи зашифрованных данных другому процессу. Процесс получения должен указать тот же флаг для расшифровки данных. Кроме того, используйте эти флаги, если используете общую память.

Если клиент использует флаг CRYPTPROTECTMEMORY_SAME_LOGON, сервер должен олицетворить клиент (RpcImpersonateClient) перед расшифровкой памяти.

Примеры

В следующем примере вызывается функция CryptProtectMemory для шифрования данных, которые хранятся в памяти.

#include <windows.h>
#include <stdio.h>
#include <Wincrypt.h>

#define SSN_STR_LEN 12  // includes null

void main()
{
    HRESULT hr = S_OK;
    LPWSTR pSensitiveText = NULL;
    DWORD cbSensitiveText = 0;
    DWORD cbPlainText = SSN_STR_LEN*sizeof(WCHAR);
    DWORD dwMod = 0;

    //  Memory to encrypt must be a multiple of CRYPTPROTECTMEMORY_BLOCK_SIZE.
    if (dwMod = cbPlainText % CRYPTPROTECTMEMORY_BLOCK_SIZE)
        cbSensitiveText = cbPlainText +
		(CRYPTPROTECTMEMORY_BLOCK_SIZE - dwMod);
    else
        cbSensitiveText = cbPlainText;

    pSensitiveText = (LPWSTR)LocalAlloc(LPTR, cbSensitiveText);
    if (NULL == pSensitiveText)
    {
        wprintf(L"Memory allocation failed.\n");
        return E_OUTOFMEMORY;
    }

    //  Place sensitive string to encrypt in pSensitiveText.

    if (!CryptProtectMemory(pSensitiveText, cbSensitiveText,
		CRYPTPROTECTMEMORY_SAME_PROCESS))
    {
        wprintf(L"CryptProtectMemory failed: %d\n", GetLastError());
        SecureZeroMemory(pSensitiveText, cbSensitiveText);
        LocalFree(pSensitiveText);
        pSensitiveText = NULL;
        return E_FAIL;
    }

    //  Call CryptUnprotectMemory to decrypt and use the memory.

    SecureZeroMemory(pSensitiveText, cbSensitiveText);
    LocalFree(pSensitiveText);
    pSensitiveText = NULL;

    return hr;
}

Требования

Требование Значение
Минимальная версия клиента Windows Vista [классические приложения | Приложения UWP]
Минимальная версия сервера Windows Server 2003 [классические приложения | Приложения UWP]
Целевая платформа Windows
Header dpapi.h
Библиотека Crypt32.lib
DLL Crypt32.dll

См. также раздел

CryptProtectData

CryptUnprotectMemory

RtlDecryptMemory

RtlEncryptMemory