共用方式為


CryptProtectData 函數 (dpapi.h)

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

指向包含待加密明DATA_BLOB 結構的指標。

[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

另請參閱