Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Note
DPAPI-Umfang und -Einschränkungen:
- Verschlüsselt standardmäßig Daten,
CryptProtectDatasodass nur dasselbe Benutzerkonto auf demselben Computer sie entschlüsseln kann. Verwenden Sie dieCRYPTPROTECT_LOCAL_MACHINEKennzeichnung, um jedem Benutzer auf dem Computer die Entschlüsselung zu ermöglichen. - DPAPI schützt keine Daten während der Übertragung oder auf allen Computern. Verwenden Sie für computerübergreifende oder mehrbenutzerübergreifende Szenarien DPAPI-NG (
NCryptProtectSecret/NCryptUnprotectSecret) oder CNG mit expliziter Schlüsselverwaltung. - Wenn das Kennwort des Benutzers von einem Administrator zurückgesetzt wird (und nicht vom Benutzer geändert), können zuvor geschützte Daten nicht wiederhergestellt werden, es sei denn, ein Wiederherstellungs-Agent oder DPAPI-Sicherungsschlüssel ist vorhanden.
Im folgenden Beispiel werden daten BLOB- mithilfe CryptProtectData- und CryptUnprotectData-verschlüsselt und entschlüsselt.
In diesem Beispiel werden die folgenden Aufgaben und CryptoAPI-Funktionen veranschaulicht:
- Initialisieren einer CRYPTPROTECT_PROMPTSTRUCT Datenstruktur.
- Verwenden von CryptProtectData- zum Verschlüsseln eines Daten-BLOB.
- Verwenden von CryptUnprotectData zum Entschlüsseln der Daten.
- Verwenden von LocalFree zum Freigeben des zugewiesenen Speichers.
In diesem Beispiel wird die funktion MyHandleError verwendet. Der Code für diese Funktion ist im Beispiel enthalten. Code für diese und andere Hilfsfunktionen ist auch unter Allgemeine Funktionenaufgeführt.
Das folgende Beispiel zeigt den Schutz von Daten.
#pragma comment(lib, "crypt32.lib")
#include <stdio.h>
#include <windows.h>
#include <Wincrypt.h>
#define MY_ENCODING_TYPE (PKCS_7_ASN_ENCODING | X509_ASN_ENCODING)
void MyHandleError(char *s);
void main()
{
// Copyright (C) Microsoft. All rights reserved.
// Encrypt data from DATA_BLOB DataIn to DATA_BLOB DataOut.
// Then decrypt to DATA_BLOB DataVerify.
//-------------------------------------------------------------------
// Declare and initialize variables.
DATA_BLOB DataIn;
DATA_BLOB DataOut;
DATA_BLOB DataVerify;
BYTE *pbDataInput =(BYTE *)"Hello world of data protection.";
DWORD cbDataInput = strlen((char *)pbDataInput)+1;
DataIn.pbData = pbDataInput;
DataIn.cbData = cbDataInput;
CRYPTPROTECT_PROMPTSTRUCT PromptStruct;
LPWSTR pDescrOut = NULL;
//-------------------------------------------------------------------
// Begin processing.
printf("The data to be encrypted is: %s\n",pbDataInput);
//-------------------------------------------------------------------
// Initialize PromptStruct.
ZeroMemory(&PromptStruct, sizeof(PromptStruct));
PromptStruct.cbSize = sizeof(PromptStruct);
PromptStruct.dwPromptFlags = CRYPTPROTECT_PROMPT_ON_PROTECT;
PromptStruct.szPrompt = L"This is a user prompt.";
//-------------------------------------------------------------------
// Begin protect phase.
if(CryptProtectData(
&DataIn,
L"This is the description string.", // A description string.
NULL, // Optional entropy
// not used.
NULL, // Reserved.
&PromptStruct, // Pass a PromptStruct.
0,
&DataOut))
{
printf("The encryption phase worked. \n");
}
else
{
MyHandleError("Encryption error!");
}
//-------------------------------------------------------------------
// Begin unprotect phase.
if (CryptUnprotectData(
&DataOut,
&pDescrOut,
NULL, // Optional entropy
NULL, // Reserved
&PromptStruct, // Optional PromptStruct
0,
&DataVerify))
{
printf("The decrypted data is: %s\n", DataVerify.pbData);
printf("The description of the data was: %S\n",pDescrOut);
}
else
{
MyHandleError("Decryption error!");
}
//-------------------------------------------------------------------
// At this point, memcmp could be used to compare DataIn.pbData and
// DataVerify.pbDate for equality. If the two functions worked
// correctly, the two byte strings are identical.
//-------------------------------------------------------------------
// Clean up.
LocalFree(pDescrOut);
LocalFree(DataOut.pbData);
LocalFree(DataVerify.pbData);
} // End of main
//-------------------------------------------------------------------
// This example uses the function MyHandleError, a simple error
// handling function, to print an error message to the
// standard error (stderr) file and exit the program.
// For most applications, replace this function with one
// that does more extensive error reporting.
void MyHandleError(char *s)
{
fprintf(stderr,"An error occurred in running the program. \n");
fprintf(stderr,"%s\n",s);
fprintf(stderr, "Error number %x.\n", GetLastError());
fprintf(stderr, "Program terminating. \n");
exit(1);
} // End of MyHandleError