Lista de funciones hash vulnerables y "utilizables"

2

Buscando en Internet, solo vi tablas de cifrado / hashing de familias y la lógica. He visto un video recientemente de Computerphile sobre cómo romper las contraseñas mediante el uso de reglas de diccionarios y volcados de datos previamente rotos. Al final del video, se mencionó que los algoritmos de hash MD5 y SHA1 ya no son tan seguros y que si estás usando SHA1, debes moverte a SHA256.

Quiero volver a verificar qué funciones de Hash son fuertes, cuáles aún se pueden usar y cuáles ya no son seguras (puede ser debido a la vulnerabilidad a ataques o una fuga masiva, etc.) en una buena mesa.

Parece que no hay una buena tabla práctica para esto y tendrías que revisar cada algoritmo que te interese, leer la página wiki y averiguar si sigue siendo vulnerable o no.

¿Existe tal lista?

    
pregunta Razgriz 30.07.2016 - 17:00
fuente

2 respuestas

7

TL;DR

  • Si sus datos son un mensaje largo o tienen al menos 72 bits de entropía, use SHA-256 .
  • Si sus datos son una contraseña, utilice BCrypt , ajustando el factor de trabajo en unos 100 ms.
  • Si los datos de entrada tienen muy poca entropía, el hash (incluso con BCrypt) no proporcionará una seguridad significativa.
    • debilidad password s
    • PIN de todos los dígitos
    • números de cuentas bancarias

Si bien es difícil enumerar todas las rutinas hash, es fácil enumerar las rutinas más comunes, y aún más fácil recomendar la que debería usar.

La familia de hash SHA-2 (SHA-256 a SHA-512) se consideran rutinas de hash de propósito general sólidas. SHA-256 funciona mejor para la mayoría de los propósitos.

MD5 es bastante débil y SHA-1 es aceptable. Mientras que algunas personas pueden desear que MD5 sea más corto (128 bits en lugar de 256), en realidad es mejor truncar un hash moderno. Obviamente, es mejor utilizar la longitud total de hash de 256 bits.

Recuerde, las rutinas hash de propósito general como MD / SHA están diseñadas para ser rápidas . Para la mayoría de los programas de computadora, rápido se considera bueno.

Sin embargo, si el valor de entrada original tiene una entropía limitada (por ejemplo, un pin de 4 dígitos), será muy fácil realizar una fuerza bruta (pruebe los 10,000 valores de entrada posibles y compárelos con ) el hash, determinando así los datos secretos.

  • PIN de 4 dígitos = 13 bits de entropía (no se puede hacer lo suficientemente seguro con hash)
  • Cadena hexagonal verdaderamente aleatoria de 18 caracteres = entropía de 72 bits
  • Cadena Base64 de 12 caracteres verdaderamente aleatoria = entropía de 72 bits
  • 8 caracteres password de un usuario perezoso = casi sin entropía
  • contraseña de 11 caracteres con algunos trucos de sustitución comunes Tr0ub4dor&3 = aproximadamente 28 bits de entropía
  • número de tarjeta de crédito = no hay suficiente entropía, así que no almacene ni su hash
  • mensaje de correo electrónico o cualquier archivo de texto grande = mucha entropía

Cada bit de entropía significa que la fuerza bruta de estos datos lleva el doble de tiempo.

El tiempo que lleva la fuerza bruta depende de la velocidad del hardware del atacante y de la velocidad del hash. Entonces,

  • Si sus datos de entrada tienen 72 bits de entropía o más, simplemente use SHA-256.

  • Si sus datos de entrada tienen menos entropía o entropía no confiable (contraseñas proporcionadas por el usuario), debe usar un Slow Hash .

Las rutinas de hash lento son ajustables, por lo que en lugar de completar la operación de hash en unos pocos microsegundos, toma varios milisegundos (recomiendo unos 100 ms) en su hardware de producción. (tenga en cuenta que el hardware del atacante probablemente sea mucho más rápido)

Aquí hay algunas buenas opciones de Slow Hash.
Cada uno tiene un medio para ajustar el tiempo de procesamiento. (fuerza del hash)

  • Repite tu hash SHA-256 (o SHA-512) muchas veces.
    Esto es sencillo de implementar y se considera una técnica razonable. (a pesar de que SHA fue diseñado para ser rápido)

  • BCrypt (hash lento comúnmente recomendado)

  • SCrypt (más nuevo (menos probado), diseñado para ser resistente a GPU debido a los requisitos de RAM)

  • PBKDF2 (antigua, buena alternativa a BCrypt)

Nota: la optimización de su función hash es importante. Use la versión nativa compilada de BCrypt, no una "escrita en" un lenguaje de alto nivel (es decir, JBCrypt se escribió en Java), ya que la versión compilada de forma nativa (escrita en C / C ++, con vínculos adecuados a su lenguaje de alto nivel) sea más eficiente, por lo que le permite calcular un factor de trabajo más alto (más fuerte) en la misma cantidad de tiempo.

Es común agregar sal a un hash. Esto es único, pero no secreto, y se agrega a la contraseña antes de que se genere el hash. De esta manera, si un atacante roba su base de datos y ejecuta la fuerza bruta en todos los hashes, tendrá que ejecutar una copia bruta por trabajo para cada Sal utilizada, lo que le llevará un poco más de tiempo que todas las contraseñas. en un solo trabajo.

    
respondido por el George Bailey 30.07.2016 - 17:30
fuente
5

Ese video se salta por completo algunas de las partes más difíciles del hashing de contraseñas. Por ejemplo, ni siquiera menciona bien establece esquemas de hashing de contraseñas como scrypt, bcrypt, PBKDF2. Además, confunde el hash normal con el hashing de contraseñas y habla continuamente de "almacenar contraseñas", que es exactamente lo que no hace cuando almacena un hash de contraseña. Por favor, no lo use como material de referencia.

La fuerza de MD5 o SHA-1 es completamente irrelevante en el hashing de contraseñas. Si ve un hash PBKDF2 sobre una contraseña relativamente buena, un gran número de sal e iteración (factor de trabajo) que se ha configurado con SHA-1 o MD5, todavía no tendrá ninguna posibilidad de encontrar la contraseña. MD5 (prácticamente) y SHA-1 (teóricamente) se han roto con respecto a la búsqueda de colisiones, pero no con respecto a los ataques de preimagen.

Los hashes de contraseña son en realidad funciones muy diferentes de los hash criptográficos, incluso con respecto a los parámetros de configuración y la entrada. Los hashes de contraseña se incluyen en la categoría Funciones de derivación de claves basadas en contraseña (PBKDF) que tienen una primitiva configurable (función hash) y un factor de trabajo. Además, tienen la sal como parámetro de entrada adicional. Las funciones de hash solo tienen una sola entrada y salida. Debe considerarlas funciones diferentes y no compararlas directamente.

Si desea compararlos con una función que está diseñada para una entrada de alta entropía (contraseñas y claves muy complejas), se podrían considerar las funciones de derivación de clave basadas en clave (KBKDF) como HKDF. Esos algoritmos a menudo también se basan en funciones hash, aunque también se utilizan diseños basados en cifrado de bloques.

Además de los hashes de contraseña ya conocidos: scrypt, bcrypt y PBKDF2, también hay Argon2 que ganó la competencia de hashing de contraseñas. PBKDF2 tiene algunas debilidades desafortunadamente, pero se estandariza mejor como parte del estándar PKCS # 5 / Password Based Encryption y la estandarización NIST.

Para los hash criptográficos, simplemente es mejor elegir cualquiera de las variantes SHA-2 o SHA-3, estandarizadas por NIST.

Hay una gran cantidad de funciones hash de contraseña y funciones hash criptográficas. Simplemente no todos son conocidos por el público en general. Estas funciones se pueden romper de varias maneras. Por lo tanto, cualquier mesa sería muy grande y no serviría para nada.

    
respondido por el Maarten Bodewes 31.07.2016 - 13:16
fuente

Lea otras preguntas en las etiquetas