我想使用CryptProtectData函數,因此我可以加密我的密碼並在我的MAPI配置文件中使用它。我正在使用這兩篇文章http://blogs.msdn.com/b/dvespa/archive/2013/05/21/how-to-mfcmapi-create-mapi-profile-exchange-2013.aspx 和http://blogs.msdn.com/b/dvespa/archive/2013/07/15/create-profile-connect-mfcmapi-to-office-365.aspx用於使用MFCMAPI連接到我的託管交換(2013)帳戶。在設置我的所有屬性時,系統會提示輸入我的憑據,並且我遇到了域爲域提供的域太短的問題。所以我必須手動設置這些屬性(howto在第二篇文章中有描述)。CryptProtectData:從Crypt32.dll調用MAPI配置文件的函數的C++代碼
現在我需要在我的MAPI配置文件中設置用戶名和密碼,它似乎我需要encrpyt我自己的密碼(我必須建立一個應用程序來這樣做)。我正在使用「MAPI Download configuration guidance.docx」(可以從www .microsoft.com/en-us/download/details.aspx?id = 39045下載我正在使用的代碼片段位於文檔末尾)用於構建我自己的應用程序來加密我的密碼(我正在使用較小的示例來加密密碼,而不是用於創建整個配置文件)。我遇到了很多問題,應用程序沒有運行在32位Windows上,比crypt32.lib丟失(我必須自己創建它)等等。現在我在64位機器上運行它,但現在我不知道如何向程序提供數據。
我有以下代碼:
std::string stemp = "myPassword";
std::wstring stemp1 = std::wstring(stemp.begin(), stemp.end());
LPWSTR pwszPassword = (LPWSTR)stemp1.c_str();//stemp.c_str();//
HRESULT hr = S_OK;
DATA_BLOB dataBlobIn = {0};
DATA_BLOB dataBlobOut = {0};
SPropValue propValues[2] = {0};
// Validate parameters
// Encrypt password based on local user authentication
dataBlobIn.pbData = (LPBYTE)pwszPassword;
// Include NULL character
dataBlobIn.cbData = (::wcslen(pwszPassword) + 1) * sizeof(WCHAR);
CryptProtectData(
&dataBlobIn,
NULL,
NULL,
NULL,
NULL,
0,
&dataBlobOut);
std::cout<<"\n-- ";
std::wcout<<(dataBlobOut.cbData);
std::cout<<" --\n";
std::wcout<<(dataBlobOut.pbData);
現在這些輸出值2時,爲dataBlobOut.cbData我主要是得到「230」(我認爲,當我修改密碼的大小,這可能會改變,但它不,它具有相同的值,如「aaa」,「bbbbb」,「cc」...),併爲dataBlobOut.pbData我得到一個十六進制值(類似於0x2cde50),我認爲這是地址因爲pbData是一個指針。
由於我得到的diffrente密碼完全相同的值我認爲我的做法是不正確的。但是,爲了獲得我的加密密碼,我需要更改哪些內容才能填充MAP_PROFILE_AUTH_PASSWORD屬性中的屬性?
我在微軟的交流論壇上也提過這個問題,但我認爲他們的論壇比軟件開發更專注於技術。
親切的問候 RIMES
加密數據的大小不隨密碼大小(小變化)而變化這一事實本身並不表示問題。我敢打賭,算法涉及到某種填充,比如說最近的X字節邊界。真正的測試是 - 'CryptUnprotectData'給你原始數據嗎? –
我的問題是,我不知道如何從「dataBlobIn」取回密碼(也許我沒有設置正確的方式)。我得到一個數字(來自.cbData)或一個地址或一個奇怪的符號(如果我使用*(dataBlobIn.pbData [0])) – user3466562
'wcout <<(LPCWSTR)(dataBlobIn.pbData)' –