hashes en cascada para aumentar la dificultad de cálculo

0

La pregunta que hago es: ¿existe alguna razón por la que el siguiente método no dificulte significativamente que un atacante que intente atacar con fuerza bruta (o utilice un ataque de diccionario)?

Tal vez esta pregunta no sea del todo práctica, pero está inspirada en la idea de bcrypt, pero sin la necesidad de implementar realmente bcrypt cuando tenga a mano SHA. Para ponerlo en contexto, tiendo a usar un método de manipulación de cadenas y hash para generar contraseñas para sitios web. Básicamente, tomas una cadena secreta, por ejemplo, TheNameOfMyLongDeceasedHamster , añades algo obvio para hacer con un sitio web TheNameOfMyLongDeceasedHamsterFacebookUserMrBoink que pone eso a través de algo como SHA256, toma salida binaria, convierte a base64 y toma los primeros 16 caracteres. Me imagino que a uno le resultará difícil obtener la cadena secreta, incluso si conoce la salida de este proceso y la entrada específica del sitio. He reflexionado sobre un método simple para hacerlo más costoso computacionalmente, ya que no es una pérdida tomar, por ejemplo, 0,25 segundos en una computadora portátil i5 para calcular un solo hash en javascript, pero naturalmente, si alguien quiere probar y encontrar el TheNameOfMyLongDeceasedHamster dado La salida de este (y posiblemente buscar / reemplazar pares) y quizás algún tipo de ataque de diccionario, hace que sea más difícil de probar.

La idea es un poco ingenua, y me pregunto si hay algún inconveniente grave que los expertos en seguridad conozcan.

La idea es la siguiente:

Paso 1. Toma un texto conocido (algo que puedas encontrar fácilmente). Para mí, tomo la Vulgata latina del Sermón en el montaje, elimino toda puntuación, la convierto en minúsculas y la divido en palabras separadas. Esto produce una matriz como

["videns","autem","jesus",...]

y se asume que cualquier atacante tiene acceso a este texto. Es importante destacar que solo necesito recordar cómo reconstruirlo.

Paso 2. Especifica un número de pares de palabras, por ejemplo,

var wordsmap = "in:humpty et:dumpty cum:hmmm";

y convertir al formulario

var wordsmapa = ["in:humpty","et:dumpty","cum:hmmm"];

y luego reemplazar a través de

var fluff = "videns autem jesus ...";
for(i in wordsmapa) {
   fluff = fluff.replace(wordsmapa[i][0],wordsmapa[i][1]);
}
fluffwords = fluff.split(" ");

para obtener

["videns","autem","jesus",...]

donde algunas palabras pueden haber sido reemplazadas. (El bit de reemplazo es opcional, pero tiene usos, por ejemplo, si cambio 'jesus' en la cadena a lo que sea mi nombre de usuario, simplemente paseando 'SecretStringtwitter' a través de este proceso obtendré lo que parece una contraseña segura para mi cuenta de Twitter, por ejemplo 'lG0aFybg0 / zGLPCO'.)

Paso 3. Toma una función hash, como sha256, y repite (por supuesto, es importante / útil asegurar que todo sea uniforme, por ejemplo, cadenas hexadecimales o búferes de bytes)

function hashcascade(x) {
    for(var i=0,l=fluffwords.length; i < l; i++) {
        var w = fluffwords[i];
        t = hash(t+w);
    }
    return t;
}

así que para usar lo hacemos

secretstring = "TheNameOfMyLongDeceasedHamster"; // obviously this will not be in plaintext in the source, but taken from the user somehow
specificinput = "FacebookUserMrFluff";
hashinput = secretstring + specificinput
hexout = hashcascade(hashinput)
binout = hex2bin(hexout)
b64out = btoa(binout)
result = b64out.substr(0,16)

Como tal, toma los primeros 16 caracteres de la base64 de

hash(hash(hash(...hash("SecretStringSpecificStringvidens")+"autem")+"jesus")...)

¿Hay alguna razón por la que esto no dificulte que un atacante intente aplicar fuerza bruta a la entrada (o utilice un ataque de diccionario)?

Finalmente, usado de esta manera, cualquier cambio en la cadena secreta cambia totalmente la salida, al igual que cualquier búsqueda / reemplazo en el 'texto conocido' utilizado para generar la matriz de palabras.

Estoy jugando con este método para crear / recrear contraseñas, a fin de tener un administrador de contraseñas de almacenamiento cero conciso, basándome en la memorización de una única cadena secreta, usando una estimación intuitiva de lo que deberían ser los reemplazos de palabras, y luego algo Obviamente como el nombre de dominio del sitio web. Ponga todo esto en el procedimiento anterior, y diga 0.25 segundos más tarde, aparecerá su contraseña.

    
pregunta John Allsup 24.08.2016 - 01:42
fuente

1 respuesta

1

Estoy muy confundido por tu pregunta, porque por un lado mencionas bcrypt, un algoritmo de verificación de contraseña:

  

Tal vez esta pregunta no sea del todo práctica, pero está inspirada en la idea de bcrypt, pero sin la necesidad de implementar realmente bcrypt cuando tenga a mano SHA.

... pero luego cambia de marcha a la generación de contraseña:

  

Para ponerlo en contexto, tiendo a usar un método de manipulación de cadenas y hash para generar contraseñas para sitios web.

Pero estos son problemas no relacionados, por lo que una solución para uno no es necesariamente aplicable al otro.

Pero en cualquier caso, por lo que puedo ver por su explicación, está proponiendo un sistema para generar contraseñas derivadas de forma determinista a partir de estas entradas:

  1. Una contraseña maestra secreta;
  2. Un identificador público para la contraseña derivada (por ejemplo, FacebookUserMrFluff );
  3. Algunos parámetros públicos adicionales (la lista de palabras y las sustituciones).

Un problema aquí es que, dado que el esquema es completamente determinista, un atacante que puede obtener un par de hash + sal para una de las contraseñas derivadas (o una contraseña de texto simple desde un sitio como cualquiera de estos ) puede montar un ataque de fuerza bruta para recuperar su contraseña maestra. Y si tienen éxito, pueden calcular todas sus contraseñas derivadas, pasadas, presentes y futuras .

Tal vez , la iteración de la función hash aumenta el costo del ataque de fuerza bruta contra tu esquema. Pero, ¿por qué permitir un ataque así? Compare este consejo común de administración de contraseñas del lado del usuario:

  • Utilice contraseñas generadas aleatoriamente de buena longitud;
  • Almacénelos en un administrador de contraseñas encriptadas.

En este caso, dado que las contraseñas se generan de forma aleatoria, todas son independientes : un atacante que descifra una de ellas no puede aprovechar eso para descubrir otra contraseña. Un atacante tendría que robar su base de datos de contraseñas para lanzar un ataque de fuerza bruta contra sus otras contraseñas, mientras que en su esquema solo necesitan una única contraseña derivada.

Aparte de eso, si "tiene SHA a mano" ya existe una solución de hashing de contraseña iterada estándar para eso: PBDKF2 . Por lo tanto, incluso si insistió en usar este método cuestionable para generar contraseñas derivadas de manera determinista, no es necesario recurrir a su algoritmo extraño.

    
respondido por el Luis Casillas 24.08.2016 - 02:51
fuente

Lea otras preguntas en las etiquetas