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.
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 |