2010-01-15 4 views
0

Quelqu'un at-il un exemple de classe CryptGenrRandom pour générer l'identifiant de session (besoin d'utiliser dans mon module iis).CryptGenRandom pour générer l'identifiant de session asp.net

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"); 
} 

J'ai essayé ce code, mais sa ne fonctionne pas très bien (je l'obtenir de msdn) et cet exemple ne fonctionnent pas pour moi (http://www.codeproject.com/KB/security/plaintextsessionkey.aspx)

donc si quelqu'un sait comment générer sessionid en utilisant cette classe plz laissez-moi savoir

tnx quand même!

Répondre

0

Vous ne dites pas ce que l'échec est - mais je vais prendre un coup de poignard à - nous avons eu des problèmes avec CryptAcquireContext dans le passé returing NTE_BAD_KEYSET - si elle ne vous devez spécifier CRYPT_NEWKEYSET en séparées par OR les drapeaux (CRYPT_VERIFYCONTEXT|CRYPT_NEWKEYSET) et appelez CryptAcquireContext une deuxième fois en réponse à l'échec.

Quelque chose comme:

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

problème avec le code que je posté est que je reçois sortie étrange (comme chaîne hexadécimale, et je ne sais pas vraiment comment convertir en chaîne de session (chiffres et caractères Alfabet) , et le deuxième problème est que la chaîne n'est pas grande inaf (j'ai besoin de plus de 15 caractères) problème avec l'exemple de codeproject est que si échoue à la ligne pbExportedKeyBlob = new BYTE [dwSize] ;. Erreur est "exception non gérée à 0x7c812afb dans SessionExample01.exe: exception Microsoft C++: std :: bad_alloc à l'emplacement de mémoire 0x0012fe08 .. " tnx pour toute aide bye – DoDo

+0

Y a-t-il une raison pour laquelle vous ne pouvez pas juste un GUID? voir CoCreateGuid (http://msdn.microsoft.com/en-us/library/ms688568(VS.85).aspx) - il semble que ce serait mieux adapté qu'un nombre aléatoire de toute façon - vous pourriez vous retrouver avec le même nombre de sessions aléatoires id plus d'une fois - un guid est essentiellement garanti pour être unique - et c'est plus ou moins aléatoire aussi bien. – Ruddy

+0

Les règles peuvent être prévisibles, ce qui peut entraîner des identifiants de session peu sécurisés. –