Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Note
DPAPI-omfång och begränsningar:
- Som standard
CryptProtectDatakrypterar data så att endast samma användarkonto på samma dator kan dekryptera dem.CRYPTPROTECT_LOCAL_MACHINEAnvänd flaggan för att tillåta att alla användare på datorn dekrypterar. - DPAPI skyddar inte data under överföring eller mellan datorer. För scenarier mellan datorer eller flera användare använder du DPAPI-NG (
NCryptProtectSecret/NCryptUnprotectSecret) eller CNG med explicit nyckelhantering. - Om användarens lösenord återställs av en administratör (i stället för att ändras av användaren) kan tidigare skyddade data bli oåterkalleliga om inte en återställningsagent eller DPAPI-säkerhetskopieringsnyckel finns på plats.
I följande exempel krypteras och dekrypteras data BLOB- med hjälp av CryptProtectData och CryptUnprotectData.
Det här exemplet illustrerar följande uppgifter och CryptoAPI-funktioner:
- Initiera en CRYPTPROTECT_PROMPTSTRUCT datastruktur.
- Använda CryptProtectData för att kryptera en dataBLOB.
- Använda CryptUnprotectData för att dekryptera data.
- Använd LocalFree- för att frigöra allokerat minne.
I det här exemplet används funktionen MyHandleError. Koden för den här funktionen ingår i exemplet. Kod för den här och andra extrafunktioner visas också under Allmänna funktioner.
I följande exempel visas skydd av data.
#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