Funzione CryptProtectMemory (dpapi.h)
La funzione CryptProtectMemorycrittografa la memoria per impedire ad altri utenti di visualizzare informazioni sensibili nel processo. Ad esempio, usare la funzione CryptProtectMemory per crittografare la memoria contenente una password. La crittografia della password impedisce ad altri utenti di visualizzarla quando il processo viene impaginato nel file di scambio. In caso contrario, la password è in testo non crittografato e visualizzabile da altri utenti.
Sintassi
DPAPI_IMP BOOL CryptProtectMemory(
[in, out] LPVOID pDataIn,
[in] DWORD cbDataIn,
[in] DWORD dwFlags
);
Parametri
[in, out] pDataIn
Puntatore al blocco di memoria da crittografare. Il parametro cbDataIn specifica il numero di byte crittografati. Se i dati contenuti nello spazio di memoria sono inferiori al numero di byte specificati, i dati all'esterno del blocco previsto verranno crittografati. Se è maggiore di cbDataIn byte, verranno crittografati solo i primi byte cbDataIn .
[in] cbDataIn
Numero di byte di memoria a cui punta il parametro pData per crittografare. Il numero di byte deve essere un multiplo della costante CRYPTPROTECTMEMORY_BLOCK_SIZE definita in Wincrypt.h.
[in] dwFlags
Questo parametro può essere uno dei flag seguenti. È necessario specificare lo stesso flag durante la crittografia e la decrittografia della memoria.
Valore restituito
Se la funzione ha esito positivo, la funzione restituisce TRUE.
Se la funzione ha esito negativo, restituisce FALSE. Per informazioni sull'errore estese, chiamare GetLastError.
Commenti
L'uso di CryptProtectMemory e CryptUnprotectMemory per la crittografia delle password non è sicuro perché i dati esistono come testo non crittografato in memoria prima che vengano crittografati e in qualsiasi momento il chiamante la decrittografa per l'uso.
In genere, si usa la funzione CryptProtectMemory per crittografare le informazioni riservate che si intende decrittografare durante l'esecuzione del processo. Non usare questa funzione per salvare i dati da decrittografare in un secondo momento; non sarà possibile decrittografare i dati se il computer viene riavviato. Per salvare i dati crittografati in un file da decrittografare in un secondo momento, usare la funzione CryptProtectData .
Chiamare la funzione CryptUnprotectMemory per decrittografare la memoria crittografata con la funzione CryptProtectMemory . Al termine dell'uso delle informazioni riservate, cancellarla dalla memoria chiamando la funzione SecureZeroMemory .
Usare il flag CRYPTPROTECTMEMORY_CROSS_PROCESS o CRYPTPROTECTMEMORY_SAME_LOGON se si usa RPC o LRPC per passare i dati crittografati a un altro processo. Il processo di ricezione deve specificare lo stesso flag per decrittografare i dati. Usare anche questi flag se si usa la memoria condivisa.
Se il client usa il flag CRYPTPROTECTMEMORY_SAME_LOGON, il server deve rappresentare il client (RpcImpersonateClient) prima di decrittografare la memoria.
Esempio
Nell'esempio seguente viene chiamata la funzione CryptProtectMemory per crittografare i dati in memoria.
#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;
}
Requisiti
Requisito | Valore |
---|---|
Client minimo supportato | Windows Vista [app desktop | App UWP] |
Server minimo supportato | Windows Server 2003 [app desktop | App UWP] |
Piattaforma di destinazione | Windows |
Intestazione | dpapi.h |
Libreria | Crypt32.lib |
DLL | Crypt32.dll |