hash - decrypt - sha512 php
¿Cuánto tiempo para la fuerza bruta de un hash SHA-512 salado?(se proporciona sal) (3)
Aquí hay un algoritmo en Java:
public String getHash(String password, String salt) throws Exception {
String input = password + salt;
MessageDigest md = MessageDigest.getInstance(SHA-512);
byte[] out = md.digest(input.getBytes());
return HexEncoder.toHex(out);
}
Supongamos que la sal es conocida. Quiero saber el tiempo de fuerza bruta para cuando la contraseña es una palabra de diccionario y también cuando no es una palabra de diccionario.
Quiero saber el tiempo de fuerza bruta para cuando la contraseña es una palabra de diccionario y también cuando no es una palabra de diccionario.
Contraseña del diccionario
Figura de Ballpark : hay aproximadamente 1,000,000 de palabras en inglés, y si un hacker puede calcular aproximadamente 10,000 hash SHA-512 por segundo ( actualización: vea el comentario de CodesInChaos, este cálculo es muy bajo), 1,000,000 / 10,000 = 100 segundos . Por lo tanto, tardaría más de un minuto en descifrar una contraseña de diccionario de una sola palabra para un solo usuario. Si el usuario concatena dos palabras del diccionario, estás en el área de unos pocos días, pero aún es muy posible si el atacante se preocupa lo suficiente. Más que eso y comienza a ponerse duro.
Contraseña aleatoria
Si la contraseña es una secuencia verdaderamente aleatoria de caracteres alfanuméricos, mayúsculas y minúsculas, entonces el número de contraseñas posibles de longitud N es 60 ^ N (hay 60 caracteres posibles). Haremos el cálculo en la otra dirección esta vez; preguntaremos: ¿Qué longitud de contraseña podríamos descifrar dado un período específico de tiempo? Solo usa esta fórmula:
N = Log60(t * 10,000)
donde t es el tiempo empleado calculando hashes en segundos (suponiendo de nuevo 10.000 hashes por segundo).
1 minute: 3.2
5 minute: 3.6
30 minutes: 4.1
2 hours: 4.4
3 days: 5.2
Entonces, con un plazo de 3 días, podríamos descifrar la contraseña si tiene 5 caracteres.
Esto es todo muy ball-park, pero entiendes la idea. Actualización: vea el comentario a continuación, en realidad es posible descifrar contraseñas mucho más largas que esta.
¿Que está pasando aqui?
Vamos a aclarar algunos conceptos erróneos:
La sal no hace que sea más lento calcular hashes , solo significa que tienen que descifrar la contraseña de cada usuario individualmente, y las tablas hash precomputadas (buzz-word: tablas de arcoíris ) se vuelven completamente inútiles. Si no tiene una tabla hash precalculada, y solo está descifrando un hash de contraseña, salar no hace ninguna diferencia.
SHA-512 no está diseñado para ser resistente a la fuerza bruta . Los mejores algoritmos hash como BCrypt, PBKDF2 o SCrypt se pueden configurar para que tarden más en computarse, y una computadora promedio solo puede calcular 10-20 hashes por segundo. Lea esta excelente respuesta sobre el uso de contraseñas si aún no lo ha hecho.
Actualización: como está escrito en el comentario de CodesInChaos, incluso las contraseñas de alta entropía (alrededor de 10 caracteres) podrían ser brutales si se usa el hardware adecuado para calcular los hashes SHA-512.
Notas sobre la respuesta aceptada:
La respuesta aceptada a partir de septiembre de 2014 es incorrecta y peligrosamente incorrecta:
En su caso, romper el algoritmo hash es equivalente a encontrar una colisión en el algoritmo hash. Eso significa que no necesita encontrar la contraseña en sí misma (que sería un ataque de preimagen) ... Encontrar una colisión usando un ataque de cumpleaños toma O (2 ^ n / 2) tiempo, donde n es la longitud de salida del hash función en bits.
El ataque de cumpleaños es completamente irrelevante para descifrar un hash dado. Y este es, de hecho, un ejemplo perfecto de un ataque de preimagen . Esa fórmula y los próximos dos párrafos resultan en valores peligrosamente altos y completamente sin sentido para un tiempo de ataque. Como se demostró anteriormente , es perfectamente posible descifrar las contraseñas del diccionario en cuestión de minutos .
La baja entropía de las contraseñas típicas hace posible que haya una posibilidad relativamente alta de que uno de sus usuarios use una contraseña de una base de datos relativamente pequeña de contraseñas comunes ...
Es por eso que, en general, no basta con el hash y la salazón, también debe instalar otros mecanismos de seguridad. Debería usar un método de entropía que reduce la velocidad artificialmente disminuido como PBKDF2 descrito en PKCS # 5 ...
Sí, utilice un algoritmo que sea lento de calcular, pero, ¿qué es "endoscopía de entropía"? Poner una contraseña de entropía baja a través de un hash no aumenta la entropía. Debería preservar la entropía, pero no se puede mejorar la contraseña de basura con un hash, no funciona así. Una contraseña débil puesta a través de PBKDF2 sigue siendo una contraseña débil.
En su caso, romper el algoritmo hash es equivalente a encontrar una colisión en el algoritmo hash. Eso significa que no necesita encontrar la contraseña en sí misma (que sería un ataque previo a la imagen ), solo necesita encontrar una salida de la función hash que sea igual al hash de una contraseña válida (por lo tanto, "colisión"). Encontrar una colisión usando un ataque de cumpleaños toma O (2 ^ (n / 2)) tiempo, donde n es la longitud de salida de la función hash en bits.
SHA-2 tiene un tamaño de salida de 512 bits, por lo que encontrar una colisión tomaría O (2 ^ 256) tiempo. Dado que no hay ataques inteligentes sobre el algoritmo en sí (actualmente no se conocen ninguno para la familia de hash SHA-2) esto es lo que se necesita para romper el algoritmo.
Para tener una idea de lo que realmente significa 2 ^ 256: actualmente se cree que el número de átomos en el universo (entero !!!) es aproximadamente 10 ^ 80, que es aproximadamente 2 ^ 266. Suponiendo 32 bytes de entrada (lo cual es razonable para su caso - 20 bytes de sal + 12 bytes de contraseña) mi máquina toma ~ 0,22s (~ 2 ^ -2s) para 65536 (= 2 ^ 16) cómputos. Entonces 2 ^ 256 cálculos se harían en 2 ^ 240 * 2 ^ 16 cálculos que tomarían
2^240 * 2^-2 = 2^238 ~ 10^72s ~ 3,17 * 10^64 years
Incluso llamar a esto millones de años es ridículo. Y no mejora mucho con el hardware más rápido del planeta que computa miles de hashes en paralelo. Ninguna tecnología humana podrá convertir este número en algo aceptable.
Así que olvida el SHA-256 de fuerza bruta aquí. Tu siguiente pregunta fue sobre palabras del diccionario. Para recuperar esas contraseñas débiles, las tablas de arco iris se usaban tradicionalmente. Una tabla de arcoiris generalmente es solo una tabla de valores hash precalculados, la idea es que si fueras capaz de calcular previamente y almacenar cada hash posible junto con su entrada, entonces te tomaría O (1) buscar un hash determinado y recuperar un preimagen válida para ello. Por supuesto, esto no es posible en la práctica ya que no existe un dispositivo de almacenamiento que pueda almacenar cantidades tan enormes de datos. Este dilema se conoce como compensación de tiempo de memoria . Como solo puede almacenar tantos valores, las tablas típicas de arcoiris incluyen alguna forma de encadenamiento hash con funciones intermedias de reducción (esto se explica en detalle en el artículo de Wikipedia) para ahorrar espacio al ahorrar un poco de tiempo.
Las sales fueron una contramedida para hacer que esas tablas arcoíris no sean factibles. Para evitar que los atacantes precompuelen una tabla para una sal específica, se recomienda aplicar valores de sal por usuario. Sin embargo, dado que los usuarios no usan contraseñas seguras y completamente aleatorias, todavía es sorprendente el éxito que se puede obtener si se conoce la sal y se itera sobre un gran diccionario de contraseñas comunes en un simple esquema de prueba y error. La relación entre el lenguaje natural y la aleatoriedad se expresa como entropy . Las opciones de contraseña típicas generalmente son de baja entropía, mientras que los valores completamente aleatorios contendrían un máximo de entropía.
La baja entropía de las contraseñas típicas hace posible que haya una posibilidad relativamente alta de que uno de sus usuarios use una contraseña de una base de datos relativamente pequeña de contraseñas comunes. Si buscas para ellos, terminarás encontrando enlaces de torrente para tales bases de datos de contraseñas, a menudo en la categoría de tamaño de gigabyte. Ser exitoso con una herramienta de este tipo generalmente está en el rango de minutos a días si el atacante no está restringido de ninguna manera.
Es por eso que, en general, no basta con el hash y la salazón, también debe instalar otros mecanismos de seguridad. Debe utilizar un método de entropía que reduce la velocidad artificialmente, como PBKDF2, descrito en PKCS#5 y debe aplicar un período de espera para un usuario dado antes de que pueda volver a intentar ingresar su contraseña. Un buen esquema es comenzar con 0.5s y luego duplicar ese tiempo para cada intento fallido. En la mayoría de los casos, los usuarios no se dan cuenta de esto y no fallan mucho más de tres veces en promedio. Pero ralentizará significativamente a cualquier intruso malintencionado que intente atacar su aplicación.
No hay una sola respuesta a esta pregunta, ya que hay demasiadas variables, pero SHA2 aún no está realmente resquebrajada (ver: valerieaurora.org/hash.html ) por lo que sigue siendo un buen algoritmo para almacenar contraseñas. El uso de la sal es buena porque evita el ataque de ataques de diccionario o tablas de arcoiris. La importancia de una sal es que debe ser única para cada contraseña. Puede usar un formato como [sal de 128 bits] [hash de contraseña de 512 bits] al almacenar las contraseñas hash.
La única forma viable de atacar es calcular hashes para diferentes posibilidades de contraseña y, finalmente, encontrar el correcto al hacer coincidir los hash.
Para dar una idea de cuántos hashes se pueden hacer en un segundo, creo que Bitcoin es un buen ejemplo. Bitcoin usa SHA256 y para abreviar, cuantos más hash generes, más bitcoins obtendrás (que puedes intercambiar por dinero real) y como tal, las personas están motivadas para usar GPU para este propósito. En la descripción general del hardware, puede ver que una tarjeta gráfica promedio que cuesta solo $ 150 puede calcular más de 200 millones de hashes / s. Cuanto más larga y compleja sea su contraseña, más tiempo llevará. El cálculo a 200M / s, para probar todas las posibilidades de un alfanumérico de 8 caracteres (mayúscula, inferior, números) tomará alrededor de 300 horas. Es muy probable que el tiempo real sea menor si la contraseña es elegible o una palabra común en inglés.
Como tal, con algo de seguridad que necesita mirar en contexto. ¿Cuál es la motivación del atacante? ¿Cuál es el tipo de aplicación? Tener un hash con sal aleatoria para cada uno brinda una protección bastante buena contra los casos en los que se comprometen algo así como miles de contraseñas.
Una cosa que puedes hacer es agregar protección adicional contra la fuerza bruta al ralentizar el proceso de hash. Como solo hash contraseñas una vez, y el atacante tiene que hacerlo muchas veces, esto funciona a tu favor. La forma típica de hacerlo es tomar un valor, hash it, take the output, hash it nuevamente y así sucesivamente para una cantidad fija de iteraciones. Puede intentar algo así como 1.000 o 10.000 iteraciones, por ejemplo. Esto hará que sea muchas veces más lento para el atacante encontrar cada contraseña.