Devo scrivere un servizio Windows che gestisca ad un certo punto dati riservati (come codici PIN, password e così via). Queste informazioni sono necessarie per un periodo di tempo molto breve: in genere vengono inviate quasi immediatamente a un lettore di smart card.Come fare in modo che le ottimizzazioni del compilatore non introducano un rischio per la sicurezza?
Consente di considerare questo pezzo di codice:
{
std::string password = getPassword(); // Get the password from the user
writePasswordToSmartCard(password);
// Okay, here we don't need password anymore.
// We set it all to '\0' so it doesn't stay in memory.
std::fill(password.begin(), password.end(), '\0');
}
Ora la mia preoccupazione è di circa ottimizzazioni del compilatore. Qui il compilatore potrebbe rilevare che la password sta per essere eliminata e che la modifica del suo valore a questo punto è inutile e basta rimuovere la chiamata.
Non mi aspetto che il mio compilatore si preoccupi del valore della memoria futura senza riferimento.
Le mie preoccupazioni sono legittime? Come posso essere sicuro che una tale parte di codice non verrà ottimizzata?
Grazie. Mi chiedo solo come funzioni questa funzione: cosa impedisce al compilatore di ottimizzarlo? – ereOn
@ereOn: È facile, il suo codice non è presentato al compilatore quando il programma è compilato, quindi il compilatore non può vederlo e decide che "non fa nulla di utile". Ad esempio, può essere compilato in una DLL già e solo collegato dinamicamente a. – sharptooth
@sharptooth: ha senso, anzi. Lo accetterò appena possibile;) Avete qualche link/tutorial sulla scrittura di una classe di gestione delle password sicura? – ereOn