Conclusión: SHA-1 es tan seguro como cualquier cosa contra los ataques de preimagen, sin embargo, es fácil de calcular, lo que significa que es más fácil montar un ataque de fuerza bruta o diccionario. (Lo mismo es cierto para sucesores como SHA-256). Dependiendo de las circunstancias, una función hash que fue diseñada para ser computacionalmente costosa (como bcrypt) podría ser una mejor opción.
Algunas personas lanzan comentarios como "SHA-1 está roto" mucho, así que estoy tratando de entender qué significa exactamente eso. Supongamos que tengo una base de datos de hash de contraseñas SHA-1, y un atacante con un algoritmo de última generación SHA-1 y una botnet con 100,000 máquinas tiene acceso a ella. (Tener control sobre 100k computadoras en el hogar significaría que pueden hacer aproximadamente 10 ^ 15 operaciones por segundo). ¿Cuánto tiempo necesitarían para
- averiguar la contraseña de cualquier usuario?
- averiguar la contraseña de un usuario determinado?
- averiguar la contraseña de todos los usuarios?
- ¿encuentra una manera de iniciar sesión como uno de los usuarios?
- ¿encuentra una manera de iniciar sesión como usuario específico?
¿Cómo cambia eso si se salan las contraseñas? ¿Importa el método de salazón (prefijo, postfix, ambos o algo más complicado como xor-ing)?
Aquí está mi comprensión actual, después de buscar en Google. Corrija las respuestas si no he entendido algo.
- Si no hay sal, un ataque de arco iris encontrará inmediatamente todas las contraseñas (excepto las extremadamente largas).
- Si hay una sal aleatoria suficientemente larga, la forma más efectiva de encontrar las contraseñas es una fuerza bruta o un ataque de diccionario. Ni los ataques de colisión ni los de preimagen son de ninguna ayuda para descubrir la contraseña real, por lo que los ataques criptográficos contra SHA-1 no son de ayuda aquí. Ni siquiera importa mucho qué algoritmo se use: incluso se podría usar MD5 o MD4 y las contraseñas serían igual de seguras (hay una ligera diferencia porque calcular un hash SHA-1 es más lento).
- Para evaluar qué tan seguro es "igual de seguro", supongamos que una sola ejecución sha1 requiere 1000 operaciones y las contraseñas contienen mayúsculas, minúsculas y dígitos (es decir, 60 caracteres). Eso significa que el atacante puede probar 10 15 * 60 * 60 * 24/1000 ~ = 10 17 contraseña potencial al día. Para un ataque de fuerza bruta, eso significaría probar todas las contraseñas de hasta 9 caracteres en 3 horas, hasta 10 caracteres en una semana, hasta 11 caracteres en un año. (Se tarda 60 veces más por cada carácter adicional). Un ataque de diccionario es mucho, mucho más rápido (incluso un atacante con una sola computadora podría llevarlo a cabo en horas), pero solo encuentra contraseñas débiles.
- Para iniciar sesión como usuario, el atacante no necesita encontrar la contraseña exacta; es suficiente encontrar una cadena que dé como resultado el mismo hash. Esto se llama un primer ataque de preimagen. Por lo que pude encontrar, no hay ataques de preimagen contra SHA-1. (Un ataque de fuerza bruta tomaría 2 160 operaciones, lo que significa que nuestro atacante teórico necesitaría 10 30 años para llevarlo a cabo. Los límites de posibilidad teórica son alrededor de 2 60 operaciones, en las cuales el ataque tomaría algunos años). Hay ataques previos a la imagen. contra versiones reducidas de SHA-1 con efecto insignificante (para el SHA-1 reducido que usa 44 pasos en lugar de 80, el tiempo de ataque ha disminuido de 2 160 operaciones a 2 157) Hay ataques de colisión contra SHA-1 que están dentro de las posibilidades teóricas ( lo mejor que encontré reduce el tiempo de 2 80 a 2 52 ), pero son inútiles contra hashes de contraseñas, incluso sin sal.
En resumen, almacenar contraseñas con SHA-1 parece perfectamente seguro. ¿Me he perdido algo?
Actualización: Marcelo señaló un artículo que menciona un segundo ataque de preimagen en 2 106 operaciones . ( Editar: como explica Thomas , este ataque es una construcción hipotética que no se aplica a escenarios de la vida real). Sin embargo, todavía no veo cómo esto significa peligro para el uso de SHA-1 como una función de derivación clave. ¿Existen generalmente buenas razones para pensar que un ataque de colisión o un segundo ataque de preimagen pueden convertirse en un primer ataque de preimagen?