2010-01-15 66 views
0

沒有人有CryptGenrRandom類的工作示例生成會話ID(需要在我的iis模塊中使用)。CryptGenRandom生成asp.net會話ID

HCRYPTPROV hCryptProv;  
BYTE   pbData[16]; 

if(CryptAcquireContext(&hCryptProv, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT)) 
{  
    if(CryptGenRandom(hCryptProv, 8, pbData)) 
    { 
     std::string s((const char *) pbData); 
     printf(s.c_str()); 
    } 
    else 
    { 
     MyHandleError("Error during CryptGenRandom."); 
    } 
} 
else 
{ 
    MyHandleError("Error during CryptAcquireContext!\n"); 
} 

我想這段代碼,但它不工作得很好(我從MSDN獲得它),這個例子沒有爲我工作(http://www.codeproject.com/KB/security/plaintextsessionkey.aspx

所以如果有人知道如何使用生成的SessionID這個班級PLZ讓我知道

tnx反正!

回答

0

你不說失敗是什麼 - 但我會在它需要一個刺 - 我們已經在過去returing NTE_BAD_KEYSET有問題CryptAcquireContext - 如果有的話,你需要指定CRYPT_NEWKEYSET邏輯與的成標誌(CRYPT_VERIFYCONTEXT|CRYPT_NEWKEYSET)和呼叫CryptAcquireContext第二次響應故障。

喜歡的東西:

BOOL bResult = CryptAcquireContext(&m_hProv, pszContainer, pszProvider, dwProviderType, dwFlags); 
if (!bResult) 
{ 
    hr = GetLastError(); //already returns an HRESULT 

    if (NTE_BAD_KEYSET != hr) return(hr); 

    dwFlags |= CRYPT_NEWKEYSET; 
    bResult = CryptAcquireContext(&m_hProv, pszContainer, pszProvider, dwProviderType, dwFlags); 
    if (!bResult) return(GetLastError()); 
} 
+0

問題的代碼,我貼的是我得到了奇怪的結果(如十六進制字符串,而我不真的知道如何將其轉換成字符串會話(數字和字符alfabet) ,第二個問題是該字符串不是大inaf(我需要15個字符輸出) codeproject的例子的問題是,如果在線pbExportedKeyBlob = new BYTE [dwSize];失敗是「未處理的異常在0x7c812afb SessionExample01.exe:Microsoft C++異常:內存位置0x0012fe08處的std :: bad_alloc ..「 tnx任何幫助 bye – DoDo 2010-01-18 07:04:44

+0

有沒有一個原因,你不能只是一個GUID?請參閱CoCreateGuid(http://msdn.microsoft.com/en-us/library/ms688568(VS.85).aspx) - 似乎它會比隨機數字更適合 - 您可能會得到相同的結果隨機數會話ID不止一次 - 一個guid基本上保證是唯一的 - 它或多或少都是隨機的。 – Ruddy 2010-01-18 23:05:37

+0

Guids可能是可預測的,因此會有點不安全的會話ID。 – 2010-05-04 19:28:14