¿Es posible detectar la longitud de la contraseña del hash? ¿La duplicación de su contraseña agrega más seguridad?

4

Suponiendo que un servicio no almacena una contraseña de texto simple, ¿tengo razón al decir que la respuesta a esta pregunta depende del servicio? En un mal servicio, la longitud del hash está relacionada con la longitud de la contraseña. En un buen servicio, no están relacionados. Esa es mi conjetura.

Además, ¿en qué medida la duplicación de una contraseña aumenta la seguridad? Entonces, en lugar de usar contraseña , ¿qué hay de usar passwordpassword ?

Tenga en cuenta que no soy un experto, por lo que una explicación fácil de usar sería bienvenida.

    
pregunta superuser 15.01.2013 - 21:55
fuente

7 respuestas

18

Si la longitud del hash varía según la entrada, entonces no es un hash. Una función hash criptográfica , por definición, ofrece una salida de tamaño fijo, independientemente de la entrada. Por ejemplo, SHA-256 ofrece una salida de 256 bits, siempre; nunca más y nunca menos.

El hash de contraseña es una actividad específica que a menudo se discute en este sitio. La respuesta corta es: use bcrypt . Maneja los detalles finos correctamente, y hay muchos.

En cuanto a "duplicar" la contraseña, agrega seguridad solo en la medida en que puede elegir hacerlo o no, duplicando así el tamaño del espacio de las posibles contraseñas. Si lo haces sistemáticamente, entonces no, no aumenta la seguridad. Además, la longitud de la contraseña puede perder (cuando escribe una contraseña, los colegas de su oficina pueden escuchar fácilmente la cantidad de pulsaciones de teclas, por ejemplo).

La fuerza de las contraseñas no proviene de caracteres largos o especiales u otras reglas tradicionales; una contraseña es exactamente tan fuerte como podría haber sido diferente . El número de valores posibles para una contraseña (dado su método para generar la contraseña) es el parámetro clave. Cualquier cosa "ingeniosa" aquí es una mala idea: recuerda que debemos asumir que el atacante es siempre tan inteligente como tú. Así que no intentes hacer contraseñas con una idea de "el atacante nunca pensará en eso !": El atacante ya lo pensó, antes que tú.

Una buena contraseña se genera aleatoriamente, con dados, monedas lanzadas, su gato persiguiendo un ratón de juguete sobre una tabla que se ha dividido en áreas numeradas, o incluso, si llegara a eso, con una computadora ejecutando un generador de números aleatorios .

    
respondido por el Thomas Pornin 15.01.2013 - 22:08
fuente
8

En un mundo perfecto, Thomas Pornin es completamente correcto. La longitud de salida fija debe ofuscar completamente el contenido, para incluir la longitud de ese contenido.

Sin embargo, hay ejemplos de utilidades de hash que se exponen a diferentes tipos de análisis criptográficos que pueden revelar información como la longitud del contenido. El ejemplo más notable de esto es, por supuesto, el "hash" de NTLMv1. Debido a una cierta brecha en el vórtice temporal de las matemáticas, el hash NT LanMan v1 eliminará un valor que sea más corto que 8 caracteres, eliminará el resto del flujo de entrada y, por lo tanto, producirá un valor de salida consistente del segundo bloque del hash . Literalmente, si tiene contraseñas que tienen menos de 8 caracteres, obtendría un segundo bloque consistente de '0xAAD3B435B51404EE'. Si está interesado en una buena búsqueda, lea la búsqueda en la seguridad LANMAN. Buenos tiempos.

Entonces, lo que se quita aquí debería ser: sí, los sistemas de hash deberían proporcionar siempre una salida única para diferentes entradas, y no deberían proporcionar ninguna información sobre los contenidos utilizados para generar ese hash. Sin embargo, como desarrollador o investigador de seguridad, también tiene la responsabilidad de investigar todos sus sistemas / algoritmos criptográficos / hash para asegurarse de que cumplen con sus objetivos de seguridad.

    
respondido por el grauwulf 22.01.2013 - 19:56
fuente
4

Las funciones de hash criptográficos ofrecen una salida de longitud fija y no se "correlacionan" con la entrada (no obtenga una "salida de cierre" para una "entrada de cierre"; si solo un bit difiere en la entrada, entonces la salida estará todo mezclada).

Por lo tanto, la única forma en que el atacante puede obtener la longitud de la contraseña del hash es obtener la contraseña real, exacta hasta el último bit.

Si su contraseña tiene suficiente entropía (es decir, se eligió al azar de un conjunto lo suficientemente grande de posibles valores de contraseña) y la función hash es adecuado , entonces esto requerirá demasiado esfuerzo para que el atacante tenga éxito con una probabilidad no despreciable.

(Por supuesto, sus compañeros de trabajo o compañeros de habitación simplemente pueden prestar atención cuando escribe su contraseña: no es tan difícil contar las pulsaciones del sonido que hacen ...)

    
respondido por el Thomas Pornin 22.01.2013 - 19:40
fuente
3

Con cualquier esquema de hash serio, el tamaño del hash será constante, y más generalmente el valor del hash no depende de la contraseña de ninguna manera detectable. Si el tamaño del hash depende de la contraseña, entonces el esquema de hash está completamente roto, probablemente no sea un hash sino un cifrado (es decir, algo reversible).

La duplicación de la contraseña agrega seguridad depende del atacante. Espero que estés pensando en el atacante que intenta encontrar la contraseña del hash (si el atacante toma tu contraseña de un keylogger, obviamente no hay diferencia). Si el atacante intenta contraseñas en orden creciente, duplicar la contraseña la hace mucho más resistente, pero pocos atacantes son tan estúpidos. Si el atacante está utilizando una distribución genérica razonable de contraseñas cuando intenta revertir el hash, duplicar la contraseña no agrega mucho. Si el atacante lo está atacando y sabe que ha duplicado la contraseña, entonces la duplicación fue inútil.

Hay una manera de cuantificar la cantidad de trabajo que causa un esquema de selección de contraseña para un atacante: cuente cuántas contraseñas son posibles, sin que el atacante sepa cuál ha elegido. Esto se llama la entropía de la contraseña. Si lanza una moneda para decidir si doblar su contraseña o no, entonces el atacante no tiene forma de saber si la ha duplicado, por lo que tiene el doble de trabajo (un poco más de entropía).

Tener que escribir, en promedio, la mitad (la probabilidad del 50% de tener que escribir el doble) no es una buena inversión para simplemente duplicar el trabajo del atacante. Si, en cambio, agrega otra letra al azar al final de su contraseña, multiplique el trabajo del atacante por 26, lo que equivale a unos 4,7 bits de entropía. Si simplemente lanza una moneda para decidir si agrega a o b al final de su contraseña, eso agrega un poco de entropía y solo un carácter adicional para escribir.

Además, si el atacante tiene información parcial sobre su contraseña (por ejemplo, al observar o escuchar lo que escribe), es probable que la longitud sea parte de esa información. Así que la duplicación no trae seguridad en este escenario; un esquema de selección de contraseña de longitud fija es más robusto.

    
respondido por el Gilles 15.01.2013 - 22:18
fuente
2

Como ha dicho Thomas, una función de hash criptográfica verdadera y adecuada no debería filtrar ninguna información sobre la contraseña. Esto se debe a algunas cosas:

  • Salida de longitud fija: la salida de hash siempre tendrá una cierta longitud (varía según el algoritmo), independientemente de cuán larga o corta sea la contraseña.
  • Salidas únicas y diferentes: cualquier cambio en la contraseña debe dar como resultado un cambio tan significativo en la salida, que dos contraseñas muy similares (es decir, "password1" y "password2") no son similares después del hashing.
  • Sal única para cada usuario: se utiliza un elemento agregado en la función de hashing que es única para cada usuario, de modo que dos usuarios que elijan la misma contraseña no tendrán el mismo hash de contraseña.

Como se ha mencionado en mis comentarios, e incluido en la respuesta de grawulf, históricamente ha habido ejemplos de funciones de hashing que violan estos principios. Quizás el ejemplo más conocido de esto es LANMAN (a.k.a .: LM hash, o LAN Manager hash). Esta función de hashing se usó en versiones de Windows anteriores a NT, y aún se incluye (aunque está deshabilitada de manera predeterminada) para compatibilidad con versiones anteriores en versiones modernas.

Los problemas con LANMAN son muchos, pero la mayoría de ellos están arraigados en su uso de DES - especialmente la parte que Permite adivinar la longitud de la contraseña de un usuario. El DES está limitado a una longitud de clave de 56 bits, que se traduce en 7 bytes o caracteres ASCII. Por supuesto, esto debe haber sido conocido, incluso en los días anteriores al NT, por ser demasiado pequeño para una contraseña razonablemente segura.

Por lo tanto, la solución alternativa de Microsoft fue dividir la contraseña del usuario a la mitad, agrupar cada mitad por separado y luego unir las cadenas de hash para formar el hash final de LM. Esto permitiría a los usuarios crear contraseñas de hasta 14 caracteres de largo. Para las contraseñas de menos de 14 caracteres, habrá un relleno adicional de caracteres nulos al final (antes de dividir la contraseña) para completar el resto de la (s) clave (s) DES. Por supuesto, esto significa que todas las contraseñas de menos de 7 caracteres terminarán con la última mitad de su hash (habiendo comenzado como todos los caracteres nulos, y hash sin sal) siendo idénticas a todas las demás contraseñas de menos de 7 caracteres.

Si Microsoft hubiera usado un sal por usuario, al menos habría evitado la fácil adivinación de la longitud de la contraseña de un usuario a partir de la salida de hash. También habría hecho más difíciles los ataques de diccionario. Sin embargo, hay otras debilidades inherentes (más allá del alcance de esta pregunta) en la función que aún la dejan totalmente inadecuada para su uso en el mundo de hoy.

Las funciones criptográficas modernas son mucho más fuertes y más inteligentes que esto, y por lo tanto son mucho menos propensas a filtrar datos particulares sobre la longitud de su contraseña. Sin embargo, es bueno tener en cuenta este detalle histórico como un ejemplo de cómo not para las contraseñas de hash. (Por supuesto, de todos modos, nunca es una buena idea rodar tu propio cripto).

CONSEJO: si bien las contraseñas de hash con LANMAN se han deshabilitado de forma predeterminada desde Vista, todavía es una característica disponible para la compatibilidad con versiones anteriores. Si desea asegurarse de que sus contraseñas de Windows no puedan y, por lo tanto, no se procesarán como hashes LM en ningún sistema Windows, a pesar de cómo el administrador del sistema puede configurarlo, asegúrese de sus contraseñas tienen al menos 15 caracteres.

    
respondido por el Iszi 22.01.2013 - 20:52
fuente
0

Un concepto llamado entropía (o aleatoriedad) es la clave. Un ataque de fuerza bruta simplemente tiene que cumplir con el nivel más bajo de entropía involucrado. En general, una contraseña bien hash será de una longitud que haga que tenga una entropía más alta que una contraseña promedio. Es posible buscar colisiones contra los hash, pero si la contraseña que usa tiene menos entropía que el hash, entonces es más fácil simplemente intentar y adivinar la contraseña.

Por ejemplo, si mi contraseña 123 está cifrada en a3afj93a93ufa9f9uafnmac, se necesitarían muchas menos conjeturas para probar el hash que si mi contraseña tuviera una entropía similar o mayor (o aleatoriedad). Un ataque llamado tabla de arco iris se puede usar contra una gran cantidad de hashes al mismo tiempo si no están asegurados adecuadamente mediante la computación de hashes para contraseñas de baja entropía y la búsqueda de coincidencias. El concepto de una sal aumenta la entropía de la contraseña antes de aplicar hash al agregar un valor aleatorio al principio de la contraseña. Esto hace que cada contraseña tenga que ser atacada individualmente incluso si el atacante tiene acceso a las tablas hash.

    
respondido por el AJ Henderson 15.01.2013 - 22:41
fuente
0

Un ejemplo simple. Mi algoritmo de hash funciona de la siguiente manera. Dado un número N, el hash de ese número se define como

HASH(N)=N%100.

Si doy 123 como hash de entrada será 23, eso es 123% 100. Si le doy 2365736, el hash de entrada será 36. Si la entrada es 123867823, el hash será 23. Ahora la pregunta para usted. Si se le da 23 como valor hash, ¿puede decir su valor de entrada? No puedes decir un valor perfecto.

La función de hash no es exactamente similar a esto, porque generará valores duplicados que son 23 como hash para 123 y 175623. De esta manera, una función de hash no es reversible.

    
respondido por el sujeesh 23.01.2013 - 06:56
fuente

Lea otras preguntas en las etiquetas