2010-01-06 8 views
8

This MSND article dice SecureZeroMemory() è buono per i casi in cui i dati sensibili memorizzati in memoria per un po 'dovrebbero essere di sicuro sovrascritti il ​​più presto possibile quando non più necessari. Le risposte a this SO question spiegano perché questo può fare la differenza.Qualsiasi motivo per utilizzare SecureZeroMemory() invece di memset() o ZeroMemory() quando la sicurezza non è un problema?

Ora è possibile utilizzare SecureZeroMemory() per inizializzare solo tutti i blocchi di memoria? Ad esempio, in un progetto che vedo codice come il seguente:

ICONINFO ii; 
::SecureZeroMemory(&ii, sizeof(ICONINFO)); 
if (::GetIconInfo(hIcon, &ii)) 
{ 
    //do stuff, then 
    //release bitmaps 
    if(ii.hbmMask) 
     ::DeleteObject(ii.hbmMask); 
    if(ii.hbmColor) 
     ::DeleteObject(ii.hbmColor); 
} 

Perché usare SecureZeroMemory() qui invece di ZeroMemory(), memset() o il valore di inizializzazione? Voglio dire se il compilatore decide che l'inizializzazione non è necessaria e vuole ottimizzarla - perché dovrei farla rispettare? C'è qualche ragione per usare SecureZeroMemory() qui?

risposta

8

Non ha senso utilizzare SecureZeroMemory per inizializzare una struttura di informazioni dell'icona. Può solo sovrascrivere i byte sullo stack frame che avrebbero dovuto essere cancellati in modo sicuro altrove. Quel cavallo era già scappato dal granaio. Non ha nemmeno senso inizializzarlo affatto, il valore di ritorno di GetIconInfo() ti dice che è stato inizializzato.

SecureZeroMemory() ha senso solo dopo la memoria è stata riempita con dati protetti.

11

SecureZeroMemory è mai ottimizzato via da un compilatore. Questo è importante se devi preoccuparti di pulire il contenuto della tua memoria, diciamo se contiene informazioni utente molto sensibili, ad es. software bancario, password, ecc. Ovviamente se non è necessario preoccuparsi di queste cose, è possibile utilizzare qualsiasi altro modo per pulire i buffer di memoria o non pulire affatto se non è necessario.

Problemi correlati