Compartilhar via


Função CryptProtectMemory (dpapi.h)

A função CryptProtectMemory criptografa a memória para impedir que outras pessoas visualizem informações confidenciais em seu processo. Por exemplo, use a função CryptProtectMemory para criptografar a memória que contém uma senha. Criptografar a senha impede que outras pessoas a visualizem quando o processo é paginado para o arquivo de troca. Caso contrário, a senha estará em texto não criptografado e acessível por outras pessoas.

Sintaxe

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

Parâmetros

[in, out] pDataIn

Um ponteiro para o bloco de memória a ser criptografado. O parâmetro cbDataIn especifica o número de bytes que serão criptografados. Se os dados contidos no espaço de memória forem menores do que o número de bytes especificados, os dados fora do bloco pretendido serão criptografados. Se for maior que os bytes cbDataIn , somente os primeiros bytes cbDataIn serão criptografados.

[in] cbDataIn

Número de bytes de memória apontados pelo parâmetro pData para criptografar. O número de bytes deve ser um múltiplo da constante CRYPTPROTECTMEMORY_BLOCK_SIZE definida em Wincrypt.h.

[in] dwFlags

Esse parâmetro pode ser um dos sinalizadores a seguir. Você deve especificar o mesmo sinalizador ao criptografar e descriptografar a memória.

Valor Significado
CRYPTPROTECTMEMORY_SAME_PROCESS
Criptografar e descriptografar a memória no mesmo processo. Um aplicativo em execução em um processo diferente não poderá descriptografar os dados.
CRYPTPROTECTMEMORY_CROSS_PROCESS
Criptografar e descriptografar a memória em processos diferentes. Um aplicativo em execução em um processo diferente poderá descriptografar os dados.
CRYPTPROTECTMEMORY_SAME_LOGON
Use as mesmas credenciais de logon para criptografar e descriptografar a memória em processos diferentes. Um aplicativo em execução em um processo diferente poderá descriptografar os dados. No entanto, o processo deve ser executado como o mesmo usuário que criptografou os dados e na mesma sessão de logon.

Retornar valor

Se a função for bem-sucedida, a função retornará TRUE.

Se a função falhar, ela retornará FALSE. Para obter informações de erro estendidas, chame GetLastError.

Comentários

O uso de CryptProtectMemory e CryptUnprotectMemory para criptografia de senha não é seguro porque os dados existem como texto sem formatação na memória antes de serem criptografados e a qualquer momento o chamador os descriptografa para uso.

Normalmente, você usa a função CryptProtectMemory para criptografar informações confidenciais que você vai descriptografar enquanto o processo está em execução. Não use essa função para salvar dados que você deseja descriptografar mais tarde; você não poderá descriptografar os dados se o computador for reiniciado. Para salvar dados criptografados em um arquivo para descriptografar mais tarde, use a função CryptProtectData .

Chame a função CryptUnprotectMemory para descriptografar a memória criptografada com a função CryptProtectMemory . Quando terminar de usar as informações confidenciais, limpe-as da memória chamando a função SecureZeroMemory .

Use o sinalizador CRYPTPROTECTMEMORY_CROSS_PROCESS ou CRYPTPROTECTMEMORY_SAME_LOGON se você usar RPC ou LRPC para passar dados criptografados para outro processo. O processo de recebimento deve especificar o mesmo sinalizador para descriptografar os dados. Além disso, use esses sinalizadores se você usar memória compartilhada.

Se o cliente usar o sinalizador CRYPTPROTECTMEMORY_SAME_LOGON, o servidor deverá representar o cliente (RpcImpersonateClient) antes de descriptografar a memória.

Exemplos

O exemplo a seguir chama a função CryptProtectMemory para criptografar dados que estão na memória.

#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;
}

Requisitos

Requisito Valor
Cliente mínimo com suporte Windows Vista [aplicativos da área de trabalho | Aplicativos UWP]
Servidor mínimo com suporte Windows Server 2003 [aplicativos da área de trabalho | Aplicativos UWP]
Plataforma de Destino Windows
Cabeçalho dpapi.h
Biblioteca Crypt32.lib
DLL Crypt32.dll

Confira também

CryptProtectData

CryptUnprotectMemory

RtlDecryptMemory

RtlEncryptMemory