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 Significado
CRYPTPROTECTMEMORY_SAME_PROCESS
Cifre y descifre la memoria en el mismo proceso. Una aplicación que se ejecuta en un proceso diferente no podrá descifrar los datos.
CRYPTPROTECTMEMORY_CROSS_PROCESS
Cifre y descifre la memoria en diferentes procesos. Una aplicación que se ejecuta en un proceso diferente podrá descifrar los datos.
CRYPTPROTECTMEMORY_SAME_LOGON
Use las mismas credenciales de inicio de sesión para cifrar y descifrar la memoria en diferentes procesos. Una aplicación que se ejecuta en un proceso diferente podrá descifrar los datos. Sin embargo, el proceso debe ejecutarse como el mismo usuario que cifró los datos y en la misma sesión de inicio de sesión.

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

Consulte también

CryptProtectData

CryptUnprotectMemory

RtlDecryptMemory

RtlEncryptMemory