Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Note
Zakres i ograniczenia interfejsu DPAPI:
- Domyślnie szyfruje dane,
CryptProtectDataaby tylko to samo konto użytkownika na tym samym komputerze mógł je odszyfrować. Użyj flagi , aby zezwolić każdemuCRYPTPROTECT_LOCAL_MACHINEużytkownikowi na maszynie na odszyfrowywanie. - DpAPI nie chroni danych przesyłanych ani między maszynami. W przypadku scenariuszy obejmujących wiele komputerów lub wielu użytkowników należy użyć sieci DPAPI-NG (
NCryptProtectSecret/NCryptUnprotectSecret) lub CNG z jawnym zarządzaniem kluczami. - Jeśli hasło użytkownika zostanie zresetowane przez administratora (a nie zmienione przez użytkownika), wcześniej chronione dane mogą stać się nieodwracalne, chyba że zostanie przywrócony agent odzyskiwania lub klucz kopii zapasowej dpAPI.
Poniższy przykład szyfruje i odszyfrowuje dane blOB przy użyciu CryptProtectData i CryptUnprotectData.
W tym przykładzie przedstawiono następujące zadania i funkcje CryptoAPI:
- Inicjowanie struktury danych CRYPTPROTECT_PROMPTSTRUCT.
- Użycie CryptProtectData w celu zaszyfrowania obiektu BLOB danych.
- Użyj CryptUnprotectData do odszyfrowania danych.
- Używanie LocalFree do wydania przydzielonej pamięci.
W tym przykładzie użyto funkcji MyHandleError. Kod tej funkcji jest dołączony do przykładu. Kod dla tej i innych funkcji pomocniczych jest również wymieniony w funkcje ogólnego przeznaczenia.
W poniższym przykładzie pokazano ochronę danych.
#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