CryptProtectData 函式以DATA_BLOB結構對資料進行加密。 通常,只有與加密資料使用者擁有相同登入憑證的使用者才能解密資料。 此外,加密與解密通常必須在同一台電腦上完成。 有關例外情況的資訊,請參閱備註。
語法
DPAPI_IMP BOOL CryptProtectData(
[in] DATA_BLOB *pDataIn,
[in, optional] LPCWSTR szDataDescr,
[in, optional] DATA_BLOB *pOptionalEntropy,
[in] PVOID pvReserved,
[in, optional] CRYPTPROTECT_PROMPTSTRUCT *pPromptStruct,
[in] DWORD dwFlags,
[out] DATA_BLOB *pDataOut
);
參數
[in] pDataIn
[in, optional] szDataDescr
一個包含可讀資料描述的字串。 此描述字串包含在加密資料中。 此參數為可選,且可設定為 NULL。
[in, optional] pOptionalEntropy
指向包含密碼或其他額外熵的 DATA_BLOB 結構的指標,用於加密資料。 加密階段所使用的 DATA_BLOB 結構也必須在解密階段使用。 此參數可設為 NULL ,且不增加熵。 如需有關保護密碼的資訊,請參閱 處理密碼。
[in] pvReserved
預留未來使用,必須設為 NULL。
[in, optional] pPromptStruct
指向 CRYPTPROTECT_PROMPTSTRUCT 結構的指標,提供提示顯示位置和時間以及這些提示內容應為何的資訊。 此參數可在加密與解密階段皆設為 NULL 。
[in] dwFlags
此參數可為以下其中一個標誌。 若不需標記,則可將參數設為 0。
| 價值觀 | Meaning |
|---|---|
| CRYPTPROTECT_LOCAL_MACHINE | 當此標誌設定時,會將加密的資料與目前電腦關聯,而非個別使用者。 在呼叫 CryptProtectData 的電腦上,任何使用者都可以使用 CryptUnprotectData 來解密資料。 |
| CRYPTPROTECT_UI_FORBIDDEN | 此旗標用於無法呈現使用者介面(UI)的遠端情境。 當此旗標設定且指定保護或取消保護操作的使用者介面時,操作失敗, GetLastError 會回傳 ERROR_PASSWORD_RESTRICTION 程式碼。 |
| CRYPTPROTECT_AUDIT | 此旗標會產生對保護與解除保護操作的稽核。 審計日誌條目僅在 szDataDescr 非 NULL 且非空時才會被記錄。 |
[out] pDataOut
一個指向接收加密資料的 DATA_BLOB 結構的指標。 當您完成使用 DATA_BLOB 結構時,請呼叫 LocalFree 函式來釋放其 pbData 成員。
返回值
如果函式成功,函式會傳回 TRUE。
如果函式失敗,則會傳回 FALSE。 如需擴充錯誤資訊,請呼叫 GetLastError。
備註
通常,只有登入 憑證 與加密資料使用者相符的使用者才能解密資料。 此外,解密通常只能在資料加密的電腦上完成。 然而,擁有漫遊設定檔的使用者可以從網路上另一台電腦解密資料。
如果在資料加密時設定了 CRYPTPROTECT_LOCAL_MACHINE 標誌,加密電腦上的任何使用者都可以解密資料。
這個函式會產生一個會話金鑰來執行加密。 當資料要解密時,會話金鑰會再次推導出來。
此功能還會在加密資料中加入 訊息認證碼 (MAC)(鍵控完整性檢查),以防止資料被竄改。
若要在同一程序或跨程序暫時使用加密記憶體,請呼叫 CryptProtectMemory 函式。
範例
以下範例展示了資料在 DATA_BLOB 結構中加密的情況。 CryptProtectData 函式透過使用者登入憑證建立的會話金鑰來加密。 如需使用此函式的另一個範例,請參閱 範例 C 程式:使用 CryptProtectData。
// Encrypt data from DATA_BLOB DataIn to DATA_BLOB DataOut.
//--------------------------------------------------------------------
// Declare and initialize variables.
DATA_BLOB DataIn;
DATA_BLOB DataOut;
BYTE *pbDataInput =(BYTE *)"Hello world of data protection.";
DWORD cbDataInput = strlen((char *)pbDataInput)+1;
//--------------------------------------------------------------------
// Initialize the DataIn structure.
DataIn.pbData = pbDataInput;
DataIn.cbData = cbDataInput;
//--------------------------------------------------------------------
// Begin protect phase. Note that the encryption key is created
// by the function and is not passed.
if(CryptProtectData(
&DataIn,
L"This is the description string.", // A description string
// to be included with the
// encrypted data.
NULL, // Optional entropy not used.
NULL, // Reserved.
NULL, // Pass NULL for the
// prompt structure.
0,
&DataOut))
{
printf("The encryption phase worked.\n");
LocalFree(DataOut.pbData);
}
else
{
printf("Encryption error using CryptProtectData.\n");
exit(1);
}
需求
| Requirement | 價值觀 |
|---|---|
| 最低支援的用戶端 | Windows XP [傳統型應用程式 |UWP 應用程式] |
| 支援的最低伺服器 | Windows Server 2003 [傳統型應用程式 |UWP 應用程式] |
| 目標平臺 | 窗戶 |
| Header | dpapi.h |
| Library | 地穴32.lib |
| DLL | Crypt32.dll |