Suponiendo que queremos proteger contra tiempo ataques a nuestras contraseñas con hash porque incluso para saber el hash puede dar al atacante una ventaja significativa entonces es posible que queramos realizar una comparación de cadena de tiempo constante o tiempo fijo para nuestros hash.
Sin embargo, la comparación de tiempo constante no es una tarea sencilla como podemos esperar porque el compilador puede ser contra us y los retrasos aleatorios simples serán justos Detén al atacante más ingenuo .
Con todas estas premisas podemos mitigar este problema (¿es necesario? Las contraseñas a menudo se almacenan en bases de datos / medios duraderos y en cualquier sistema del mundo real esto agregará noise ) usando este pseudo código:
// 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);
}
Tenga en cuenta que la comparación de cadenas (en la contraseña con hash) aún es vulnerable a un ataque de tiempo, pero las posibilidades de filtrar información útil a un atacante deberían ser menores (y este algoritmo es fácilmente aplicable en la mayoría de los idiomas, incluso en aquellos sin una constante integrada -la comparación de contraseñas / hash).
El mismo razonamiento también es aplicable si no tenemos una contraseña con hash pero directamente en texto sin formato (!!!) como este:
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);
}
¿Todavía queremos / necesitamos usar una mejor función de comparación de tiempo constante en cualquier escenario no académico del mundo real?