Si MD5 se comporta como un oráculo aleatorio (que es un gran "si", véase más adelante), entonces la búsqueda exhaustiva en $secret
es el mejor ataque es posible - y, más importante, cada "adivinar" en el valor de $secret
MUST use una consulta para la función (ya que usa PHP, supongo que la función se implementa en un servidor web, y cada "consulta" requiere hablar con ese servidor). Esto último está implícito en la falta de información enviada al atacante: el atacante no obtiene nada excepto un solo bit (el resultado "True
" o "False
"). En particular, él no obtiene la salida MD5 en sí. El atacante obtendrá una larga secuencia de resultados poco informativos "False
" a menos que golpea la salida MD5 correcta, ya sea por pura casualidad (probabilidad 2 -128, que es realmente Darn pequeño), o porque supuso correctamente el valor de $secret
antemano. Vale la pena notar que esto evita que el atacante use muchas técnicas de costo compartido, incluidas las tablas precalculadas, en particular el sobrediminicado rainbow tables.
Un random oracle es un objeto mítico que puede ser visto como un cuadro negro determinista: sabes nada en la salida que se obtiene de una entrada dada, excepto que la caja siempre devolverá el mismo resultado para una entrada dada . Un modelo es el siguiente: la caja contiene un gnomo, algunos dados y un gran libro. El gnomo usa los dados para elegir aleatoriamente la salida. También usa el libro para realizar un seguimiento de las respuestas que ya envió, a fin de ser coherente, es decir, si la entrada es idéntica a una entrada presentada anteriormente, el gnomo devolverá el mismo resultado que anteriormente en lugar de tirar los dados.
MD5, sin embargo, es no un oráculo al azar. Por ejemplo, podemos construir colisiones para MD5 mucho más rápido que la resistencia teórica de 2 para una función con una salida de 128 bits. Además, tenga en cuenta que ser una buena función hash (resistente a las colisiones, etc.) no requiere absolutamente "oráculo aleatorio". Por ejemplo, SHA-256 se considera una función hash segura, aunque todavía sufre el llamado "ataque de extensión de longitud" (dado SHA256($a)
, se puede calcular SHA256($a)
sin conocer $a
, para valores casi arbitrarios de $b
). Por lo tanto, las garantías de un oráculo aleatorio no se cumplen con MD5 (o, para el caso, SHA-256). ¡Esto no significa que se conocen ataques más rápidos! Solo que estás solo aquí.
También se puede señalar que md5($b . $secret)
es una especie de "hash con clave", es decir, un MAC (Código de autenticación de mensajes). Construir un MAC a partir de una función hash no es fácil, precisamente debido a cosas como el ataque de extensión de longitud (md5($secret . $b)
, por ejemplo, sería un MAC muy pobre). Se diseñó una forma robusta de construir un MAC a partir de una función hash; se llama HMAC e implica dos invocaciones de la función hash subyacente (pero una de ellas es en una entrada corta, por lo que es eficiente, no obstante). La seguridad de HMAC, más precisamente cómo se puede considerar que HMAC se comporta como un oráculo aleatorio, puede "probarse", es decir, reducirse a algunas propiedades internas de la función hash que se creen verdaderas en el caso de SHA-256 (ver New Proofs for NMAC and HMAC: Security without Collision-Resistance de Mihir Bellare para los detalles sangrientos). Al usar HMAC/SHA-256 sobre $b
, con $secret
como clave, se beneficiaría de estos resultados de seguridad, y su construcción sería más convincentemente robusta. Por otra parte, no pretendo que haya un ataque conocido en md5($b . $secret)
, solo que tanto el uso de MD5 como la construcción de MAC hecha en casa levantan banderas rojas, que degradan el nivel de confianza que se puede impartir a dicho sistema.
Esta es prácticamente la única opción además de los ataques de fuerza bruta. Sin embargo, se debe tener en cuenta que los hash md5 se pueden calcular con bastante rapidez hoy en día, y como tal, los ataques de fuerza bruta no deben subestimarse.Bcrypt o Blowfish parecen ser los algoritmos recomendados por los verdaderos expertos en cripto/seguridad (porque ambos son criptográficamente más seguros y pueden ralentizarse en una cantidad arbitraria). –
La tabla Rainbow no funciona, debido a la sal (a menos que la longitud de la sal + la longitud de la contraseña sea inferior a 8, lo que es muy poco probable). Necesitarías fuerza bruta, lo que tomaría mucho tiempo. – Ben
pero si tiene la suerte suficiente para obtener la misma sal :) – Sourav