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 Significato
CRYPTPROTECTMEMORY_SAME_PROCESS
Crittografare e decrittografare la memoria nello stesso processo. Un'applicazione in esecuzione in un processo diverso non sarà in grado di decrittografare i dati.
CRYPTPROTECTMEMORY_CROSS_PROCESS
Crittografare e decrittografare la memoria in processi diversi. Un'applicazione in esecuzione in un processo diverso sarà in grado di decrittografare i dati.
CRYPTPROTECTMEMORY_SAME_LOGON
Usare le stesse credenziali di accesso per crittografare e decrittografare la memoria in processi diversi. Un'applicazione in esecuzione in un processo diverso sarà in grado di decrittografare i dati. Tuttavia, il processo deve essere eseguito come lo stesso utente che ha crittografato i dati e nella stessa sessione di accesso.

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

Vedi anche

CryptProtectData

CryptUnprotectMemory

RtlDecryptMemory

RtlEncryptMemory