Freigeben über


CryptProtectMemory-Funktion (dpapi.h)

Die CryptProtectMemory-Funktionverschlüsselt den Arbeitsspeicher, um zu verhindern, dass andere vertrauliche Informationen in Ihrem Prozess anzeigen. Verwenden Sie beispielsweise die Funktion CryptProtectMemory , um Arbeitsspeicher zu verschlüsseln, der ein Kennwort enthält. Das Verschlüsseln des Kennworts verhindert, dass es von anderen Benutzern angezeigt wird, wenn der Prozess in die Auslagerungsdatei ausgelagert wird. Andernfalls befindet sich das Kennwort im Klartext und kann von anderen benutzern angezeigt werden.

Syntax

DPAPI_IMP BOOL CryptProtectMemory(
  [in, out] LPVOID pDataIn,
  [in]      DWORD  cbDataIn,
  [in]      DWORD  dwFlags
);

Parameter

[in, out] pDataIn

Ein Zeiger auf den zu verschlüsselnden Speicherblock. Der cbDataIn-Parameter gibt die Anzahl der Bytes an, die verschlüsselt werden. Wenn die im Arbeitsspeicher enthaltenen Daten kleiner als die angegebene Anzahl von Bytes sind, werden Daten außerhalb des beabsichtigten Blocks verschlüsselt. Wenn es größer als cbDataIn-Bytes ist, werden nur die ersten cbDataIn-Bytes verschlüsselt.

[in] cbDataIn

Anzahl der Bytes des Arbeitsspeichers, auf die der zu verschlüsselnde pData-Parameter verweist. Die Anzahl der Bytes muss ein Vielfaches der in Wincrypt.h definierten CRYPTPROTECTMEMORY_BLOCK_SIZE Konstanten sein.

[in] dwFlags

Dieser Parameter kann eines der folgenden Flags sein. Beim Verschlüsseln und Entschlüsseln des Arbeitsspeichers müssen Sie das gleiche Flag angeben.

Wert Bedeutung
CRYPTPROTECTMEMORY_SAME_PROCESS
Verschlüsseln und Entschlüsseln des Arbeitsspeichers im selben Prozess. Eine Anwendung, die in einem anderen Prozess ausgeführt wird, kann die Daten nicht entschlüsseln.
CRYPTPROTECTMEMORY_CROSS_PROCESS
Ver- und Entschlüsselung von Arbeitsspeicher in verschiedenen Prozessen. Eine Anwendung, die in einem anderen Prozess ausgeführt wird, kann die Daten entschlüsseln.
CRYPTPROTECTMEMORY_SAME_LOGON
Verwenden Sie dieselben Anmeldeinformationen, um Arbeitsspeicher in verschiedenen Prozessen zu verschlüsseln und zu entschlüsseln. Eine Anwendung, die in einem anderen Prozess ausgeführt wird, kann die Daten entschlüsseln. Der Prozess muss jedoch als derselbe Benutzer ausgeführt werden, der die Daten verschlüsselt hat, und in derselben Anmeldesitzung.

Rückgabewert

Wenn die Funktion erfolgreich ist, gibt die Funktion TRUE zurück.

Wenn die Funktion fehlschlägt, gibt sie FALSE zurück. Rufen Sie GetLastError auf, um erweiterte Fehlerinformationen zu erhalten.

Hinweise

Die Verwendung von CryptProtectMemory und CryptUnprotectMemory für die Kennwortverschlüsselung ist nicht sicher, da die Daten als Klartext im Arbeitsspeicher vorhanden sind, bevor sie verschlüsselt werden und der Aufrufer sie jederzeit zur Verwendung entschlüsselt.

In der Regel verwenden Sie die CryptProtectMemory-Funktion , um vertrauliche Informationen zu verschlüsseln, die Sie während der Ausführung des Prozesses entschlüsseln möchten. Verwenden Sie diese Funktion nicht, um Daten zu speichern, die Sie später entschlüsseln möchten. Sie können die Daten nicht entschlüsseln, wenn der Computer neu gestartet wird. Um verschlüsselte Daten in einer Datei zu speichern, die später entschlüsselt werden können, verwenden Sie die Funktion CryptProtectData .

Rufen Sie die Funktion CryptUnprotectMemory auf, um mit der Funktion CryptProtectMemory verschlüsselten Speicher zu entschlüsseln. Wenn Sie die verwendung der vertraulichen Informationen abgeschlossen haben, löschen Sie sie aus dem Arbeitsspeicher, indem Sie die SecureZeroMemory-Funktion aufrufen.

Verwenden Sie das Flag CRYPTPROTECTMEMORY_CROSS_PROCESS oder CRYPTPROTECTMEMORY_SAME_LOGON, wenn Sie RPC oder LRPC verwenden, um verschlüsselte Daten an einen anderen Prozess zu übergeben. Der empfangende Prozess muss das gleiche Flag angeben, um die Daten zu entschlüsseln. Verwenden Sie diese Flags auch, wenn Sie gemeinsam genutzten Arbeitsspeicher verwenden.

Wenn der Client das flag CRYPTPROTECTMEMORY_SAME_LOGON verwendet, muss der Server die Identität des Clients (RpcImpersonateClient) annehmen, bevor der Arbeitsspeicher entschlüsselt wird.

Beispiele

Im folgenden Beispiel wird die CryptProtectMemory-Funktion aufgerufen, um Daten zu verschlüsseln, die sich im Arbeitsspeicher befinden.

#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;
}

Anforderungen

Anforderung Wert
Unterstützte Mindestversion (Client) Windows Vista [Desktop-Apps | UWP-Apps]
Unterstützte Mindestversion (Server) Windows Server 2003 [Desktop-Apps | UWP-Apps]
Zielplattform Windows
Kopfzeile dpapi.h
Bibliothek Crypt32.lib
DLL Crypt32.dll

Weitere Informationen

CryptProtectData

CryptUnprotectMemory

RtlDecryptMemory

RtlEncryptMemory