Función CryptProtectMemory (dpapi.h)
La función CryptProtectMemorycifra la memoria para evitar que otros usuarios vean información confidencial en el proceso. Por ejemplo, use la función CryptProtectMemory para cifrar la memoria que contiene una contraseña. El cifrado de la contraseña impide que otros usuarios lo vean cuando el proceso se pagina en el archivo de intercambio. De lo contrario, la contraseña está en texto no cifrado y se puede ver por otros usuarios.
Sintaxis
DPAPI_IMP BOOL CryptProtectMemory(
[in, out] LPVOID pDataIn,
[in] DWORD cbDataIn,
[in] DWORD dwFlags
);
Parámetros
[in, out] pDataIn
Puntero al bloque de memoria que se va a cifrar. El parámetro cbDataIn especifica el número de bytes que se cifrarán. Si los datos contenidos en el espacio de memoria son menores que el número de bytes especificados, los datos fuera del bloque previsto se cifrarán. Si es mayor que bytes cbDataIn , solo se cifrarán los primeros bytes cbDataIn .
[in] cbDataIn
Número de bytes de memoria a los que apunta el parámetro pData que se va a cifrar. El número de bytes debe ser un múltiplo de la constante CRYPTPROTECTMEMORY_BLOCK_SIZE definida en Wincrypt.h.
[in] dwFlags
Este parámetro puede ser una de las marcas siguientes. Debe especificar la misma marca al cifrar y descifrar la memoria.
Valor devuelto
Si la función se ejecuta correctamente, la función devuelve TRUE.
Si se produce un error en la función, devuelve FALSE. Para obtener información de error extendida, llame a GetLastError.
Comentarios
El uso de CryptProtectMemory y CryptUnprotectMemory para el cifrado de contraseñas no es seguro porque los datos existen como texto no cifrado en la memoria antes de que se cifre y en cualquier momento el autor de la llamada lo descifra para su uso.
Normalmente, se usa la función CryptProtectMemory para cifrar la información confidencial que va a descifrar mientras se ejecuta el proceso. No use esta función para guardar los datos que desea descifrar más adelante; no podrá descifrar los datos si se reinicia el equipo. Para guardar los datos cifrados en un archivo para descifrarlos más adelante, use la función CryptProtectData .
Llame a la función CryptUnprotectMemory para descifrar la memoria cifrada con la función CryptProtectMemory . Cuando haya terminado de usar la información confidencial, desactive la memoria llamando a la función SecureZeroMemory .
Use la marca CRYPTPROTECTMEMORY_CROSS_PROCESS o CRYPTPROTECTMEMORY_SAME_LOGON si usa RPC o LRPC para pasar datos cifrados a otro proceso. El proceso receptor debe especificar la misma marca para descifrar los datos. Además, use estas marcas si usa memoria compartida.
Si el cliente usa la marca CRYPTPROTECTMEMORY_SAME_LOGON, el servidor debe suplantar al cliente (RpcImpersonateClient) antes de descifrar la memoria.
Ejemplos
En el ejemplo siguiente se llama a la función CryptProtectMemory para cifrar los datos que están en 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;
}
Requisitos
Requisito | Value |
---|---|
Cliente mínimo compatible | Windows Vista [aplicaciones de escritorio | aplicaciones para UWP] |
Servidor mínimo compatible | Windows Server 2003 [aplicaciones de escritorio | aplicaciones para UWP] |
Plataforma de destino | Windows |
Encabezado | dpapi.h |
Library | Crypt32.lib |
Archivo DLL | Crypt32.dll |