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.
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 |