¿Qué tan difícil sería descifrar los hash bcrypt si se desconoce la sal? [duplicar]

5

(Esto no es un duplicado de la pregunta IMHO ya que se trata más de las diferencias entre un salt y una contraseña: ambas variables se utilizan para generar un hash)

Supongamos que un atacante tiene acceso sin conexión a una base de datos en la que las contraseñas están encriptadas con bcrypt (sin adición de pimientos). Los hashes parecen:

$2y$10$H0mRpD2XJZDguAzxTehwzunRkjUR8lB3O4UGrAGLiqJuvnlWjFA7G

En el que la sal es: H0mRpD2XJZDguAzxTehwzu y el hash es nRkjUR8lB3O4UGrAGLiqJuvnlWjFA7G .

El atacante no podrá ejecutar una tabla de arco iris para hacer coincidir los hashes, pero podría calcular las contraseñas comunes utilizando la sal incluida, por lo que la ejecución:

bcrypt("abcd1234", 10, "H0mRpD2XJZDguAzxTehwzu")

producirá:

nRkjUR8lB3O4UGrAGLiqJuvnlWjFA7G

Y ahí tienes! Podría pasar por todas las pruebas de la base de datos "abcd1234" y ser capaz de identificar qué usuarios están usando esa contraseña débil en cuestión de segundos / minutos.

Entonces, ¿qué pasa si solo el hash nRkjUR8lB3O4UGrAGLiqJuvnlWjFA7G se almacena en la base de datos (sin sal)?

Si el atacante tiene la sensación de que el usuario "abcdefg" podría estar usando la contraseña "abcd1234", ¿cómo podría probar su teoría fuera de línea? Ella tendría que adivinar la sal. ¿Cómo pudo hacerlo ella? ¿Hay algún método más fácil que probar cada combinación? Quizás en ese caso específico no haya suficiente motivación para intentarlo. ¿Pero qué sucede si sospecha que el sistema está utilizando el mismo sistema de sal para todas las contraseñas (ya que algunos hash son iguales)? ¿Qué tan difícil sería para ella romperlo?

ACTUALIZAR

La respuesta de Peleo es cercana a lo que esperaba. Intentaré extenderlo (corríjame si me equivoco):

Entropía :

En Bcrypt, una sal es generalmente de 16 bytes aleatorios (128 bits). Si comparamos eso con una contraseña de la misma longitud, entonces un salt tendrá una entropía mayor que una contraseña, ya que las contraseñas generalmente se limitan a lo que el usuario puede escribir con un teclado.

Esos 16 bytes se codifican en HEX (usando Base64) y se convierten en 22 de longitud. Si los comparamos con una contraseña de 22 caracteres, entonces la contraseña contendrá una mayor entropía (ya que puede incluir símbolos y el alfabeto completo).

Longitud :

Las sales de Bcrypt están limitadas a 16 bytes, mientras que las contraseñas pueden estar limitadas a 72 bytes, dependiendo de la implementación.

Colisión :

2 sales diferentes generarán 2 hashes diferentes, y así las contraseñas. Sin embargo, en algún punto, 2 sales diferentes podrían producir el mismo hash usando la misma contraseña y viceversa. ¿Cuál es la probabilidad para cada uno de esos casos? Eso es algo que tal vez debería preguntar en crypto.SE. Pero lo dejo aquí en caso de que alguien tenga la respuesta.

Diseño :

El algoritmo fue diseñado para proteger contraseñas y no sales. Esto significa que las sales no están destinadas a ser seguras por diseño, lo que sugiere que potencialmente podría haber una manera de obtenerlas sin forzarlas de manera brutal.

Caso ficticio :

Estamos acostumbrados al método de contraseña de usuario para proteger el acceso a un sistema. Pero, ¿qué pasa si pasa algo como esto (por favor, cuéntame, es solo un ejemplo) ?:

La compañía CauseWeWantItThatWay usa microchips para almacenar un valor único de 22 hexes (que se usará como sal). Cada usuario generará un total de 5 contraseñas o números PIN (4 dígitos cada uno, sí, son perezosos) con esa sal única para acceder a 5 sistemas diferentes.

Ahora asumamos que estoy asignado a uno de esos sistemas y conozco uno de esos números PIN, y de alguna manera tengo acceso a la base de datos. Si se incluyera la sal, sería trivial obtener esos números PIN, pero sin la sal, tendría que descifrarla.

Sé lo que estás pensando. La compañía tiene una implementación de seguridad realmente mala (y deberían quemarse en el infierno). También, que podrían haber usado la "sal" como pimienta y dejar la sal al azar. Entonces, mi pregunta era, en ese caso, ¿sería lo mismo agregar un 22-hex-chars como pimienta que usar esos como sal? Según Peleus, es lo mismo (por lo que no existen atajos para obtener la sal).

Después de todo, no todo el mundo sigue las recomendaciones y el algoritmo le permite establecer el salt, lo que hace que este tipo de escenario sea totalmente posible (aunque no es tan probable ni recomendable).

    
pregunta lepe 25.07.2016 - 08:16
fuente

3 respuestas

8

Creo que has malinterpretado el propósito de una sal, porque si entendieras para qué está diseñado para lograrlo, tal vez no estaría haciendo esta pregunta. El único propósito es proporcionar un nivel de singularidad a cada contraseña para evitar que las tablas precomputadas ("tablas de arco iris") sean una forma efectiva de ataque.

Como resultado, no está diseñado para ser "secreto" o agregar entropía a la contraseña de ninguna manera, y es por eso que se almacena junto con el hash de la contraseña. De hecho, en la mayoría de los casos, no puede ser secreto porque la aplicación en sí necesitará acceso a la sal para calcular el hash correcto de la contraseña. Es muy difícil permitir el acceso a la aplicación, pero evita que un atacante que haya violado la aplicación obtenga el mismo privilegio.

De todos modos, responda a su pregunta real: en un mundo teórico en el que tuvo que "descifrar" la sal porque era desconocido y no se pudo recuperar por algún motivo, sería exactamente el mismo nivel de complejidad que las contraseñas. Básicamente (espacio de caracteres) ^ (longitud).

En tu ejemplo, das un hash de "H0mRpD2XJZDguAzxTehwzu". Suponiendo que las letras mayúsculas y minúsculas sean alfanuméricas es un espacio de caracteres de 62 caracteres y tiene una longitud de 22 caracteres. Por lo tanto, 62 ^ 22 = 3.397504e + 23 años de conjeturas, suponiendo 1 mil millones de conjeturas por segundo. En otras palabras, no se puede descifrar (esto es incluso suponiendo que se conozca la contraseña y está intentando simplemente adivinar un sistema de sal).

    
respondido por el Peleus 25.07.2016 - 13:20
fuente
4

Una sal se almacena junto a la contraseña. No hay una regla que diga que DEBE ser así, pero es un resultado lógico del propósito previsto de una sal. Construir una mesa de arco iris no es una tarea trivial. El punto de la sal es que el atacante necesitaría una tabla de arco iris por separado para cada contraseña con sal (en cuyo caso es más fácil atacar directamente cada hash de contraseña).

Puede leer una respuesta larga sobre sal , lo que debería dejar en claro por qué no tiene sentido mantenerlo en secreto.

Si desea incluir algo de sal secreta, debería leer lo que comúnmente se llama a pepper , que agrega una clave secreta amplia de la aplicación en tus contraseñas con sal. Este podría protegerlo contra infracciones parciales (como compromisos de la base de datos a través de, por ejemplo, inyección de SQL), pero no le ayudará en caso de infracciones completas del sistema, a menos que use un Módulo de seguridad de hardware (HSM). ) para proteger el valor de la pimienta.

    
respondido por el Jacco 25.07.2016 - 09:43
fuente
3

Cuando un atacante conoce solo el hash y no el salt, no solo tiene que probar todas las contraseñas posibles, sino todas las contraseñas posibles con todos los salt posibles. Con valores de sal largos y aleatorios, esto es prácticamente imposible.

Sin embargo, este no es un escenario realista. Cuando un atacante compromete un sistema, debe asumir que comprometió la base de datos de hashes y sales. Separar estos dos conjuntos de datos de alguna manera no es factible porque siempre se usan juntos.

    
respondido por el Philipp 25.07.2016 - 13:49
fuente

Lea otras preguntas en las etiquetas