Supponendo di voler proteggere contro timing attacchi alle nostre password con hash perché anche per sapere che l'hash può dare all'attaccante un vantaggio significativo , quindi potremmo voler eseguire un confronto di stringhe a tempo costante o fisso per i nostri hash.
Tuttavia il confronto a tempo costante non è un compito semplice come ci si potrebbe aspettare perché il compilatore potrebbe essere contro noi e ritardi casuali semplici saranno solo ferma l'attaccante più ingenuo .
Con tutte queste premesse possiamo mitigare questo problema (è necessario? le password sono spesso memorizzate in database / supporti durevoli e in qualsiasi sistema reale questo aggiungerà rumore ) usando questa pseudo- codice:
// Possibly pre-computed or cached values...
string passwordHash = "550b1f8802ca3d7a987fc46a2af408c3";
int shortPasswordHash = SimpleHash(passwordHash);
// Function to validate a password
bool IsPasswordValid(string hashedPasswordToValidate)
{
if (SimpleHash(hashedPasswordToValidate) != shortPasswordHash)
return false;
return hashedPasswordToValidate.Equals(hashedPassword);
}
Si noti che il confronto tra stringhe (su password hash) è ancora vulnerabile a un attacco di temporizzazione, ma le probabilità di perdita di informazioni utili a un utente malintenzionato dovrebbero essere inferiori (e questo algoritmo è facilmente applicabile nella maggior parte delle lingue, anche senza una costante incorporata -time password / hash comparison).
Lo stesso ragionamento è applicabile anche se non abbiamo una password con hash ma direttamente testo in chiaro (!!!) come questo:
string password = "12345";
string longPasswordHash = BCrypt(password);
int shortPasswordHash = SumAllCharactersWithoutOverflow(longPasswordHash);
bool IsPasswordValid(string passwordToValidate)
{
string longHash = BCrypt(passwordToValidate);
int shortHash = SumAllCharactersWithoutOverflow(longHash);
if (shortHash != shortPasswordHash)
return false;
return longHash.Equals(longPasswordHash);
}
Vogliamo / dobbiamo ancora utilizzare una funzione di confronto a tempo costante migliore in qualsiasi scenario non accademico del mondo reale?