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.