Alude a Principio de Kerckhoff . Cuando diseñamos sistemas criptográficos, asumimos que el atacante sabrá todo acerca de su sistema, excepto las partes derivadas de la entropía (claves / contraseñas / etc, normalmente) - esto es porque no podemos garantizar que no conozcan detalles, pero Debemos asumir que no conocen nuestras claves generadas. Cualquier esquema de generación de contraseñas sigue este razonamiento: si se dice que un esquema de contraseñas es seguro, entonces puede creer que un atacante que sepa qué esquema está usando no es un problema.
La razón por la que no es un problema se debe a la forma en que funcionan los espacios de nombre de las contraseñas. Si exige que un usuario genere una contraseña basada en una lista de software de dados conocida, como la lista EFF, y exige que tenga al menos 4 palabras, entonces podemos calcular la complejidad del espacio de nombres.
Primero, descubriremos el espacio de nombres de una sola palabra: en la lista de software de prueba de EFF, tiras cinco dados de seis lados y seleccionas el resultado que aparece. Debido a que hay cinco posiciones con seis opciones, podemos calcular 6 ^ 5, lo que nos da 7776, esto simplemente significa que hay 7776 palabras diferentes posibles para cada lugar.
Ahora, podemos calcular la complejidad mínima del espacio de nombres de cuatro de estas palabras. Esto se hace simplemente tomando el número de palabras posibles y elevándolas al poder de la cantidad de palabras en la contraseña: 7776 ^ 4. Esto nos da 3656158440062976 (3.6 Quadrillion) posibles contraseñas de cuatro palabras de software EFF.
Ahora, para adivinar cuánto tiempo tomaría esto, tenemos que hacer algunas suposiciones -
-
Está utilizando un buen algoritmo de hash: scrypt, bcrypt, PBKDF2, etc.
-
El atacante tiene hardware de grado de consumidor. - Veremos algunos puntos de referencia para una serie de 8x 1080 TI, que son lo más alto de la línea al momento de escribir, pero no deben tomarse como la tasa de hash máxima: la NSA, etc. probablemente tenga un hardware especial solo para hashing contraseñas lo más rápido posible.
Podemos ver en esta referencia que en OpenCL, un atacante con 8x 1080 Ti puede atacar buenos algoritmos en los siguientes tarifas:
- Scrypt a una tasa de ~ 6.4 millones de hashes por segundo.
- bcrypt a una velocidad de 184 mil hashes por segundo.
- PBKDF2-SHA256 a una tasa de 775 mil hashes por segundo.
- SHA1 (solo para comparación, no use esto para contraseñas) a una tasa de 101 mil millones de hashes por segundo.
Por lo tanto, para nuestro espacio de nombres dado de 3.6 cuatrillones de contraseñas posibles, podemos calcular los siguientes tiempos previstos para descifrar. Por favor, tenga en cuenta que, en promedio, el 50% del espacio de nombres tendrá que agotarse, no el 100%.
- scrpyt - 571274756.25984 segundos (~ 9 años)
- bcrypt - 19870426304.690086956521739130435 segundos (~ 315 años)
- PBKDF2 - 4717623793.6296464516129032258065 segundos (~ 75 años)
- SHA1 - 36199.58851547500990099009900009901 segundos (~ .2 días)
Por lo tanto, podemos ver que también necesita implementar un buen algoritmo de hash.
Faltan dos cosas en este algoritmo: primero, no omitimos palabras de menos de 4 caracteres. La lista de juegos de dados de EFF tiene muchas palabras que tienen 3 caracteres de longitud. Si aumenta la longitud de palabra mínima, reduce el espacio de nombres. Creo que la lista de EFF tiene ~ 500 palabras que tienen 3 caracteres, pero eso es una suposición. Por lo tanto, el espacio de nombres es un poco menos complejo.
En segundo lugar, tratamos estas contraseñas derivadas aleatoriamente. Debido a que en su lugar querías oraciones, debemos tener en cuenta que las oraciones no son aleatorias. Si quieres que las oraciones tengan sentido, entonces hay ataques que puedes realizar contra ellas: puedes usar cadenas de Markov y otras cosas divertidas para generar oraciones probables en lugar de una simple imposición de la contraseña. No tengo estadísticas sobre cuánto más fácil es esto que el forzamiento bruto, por lo que voy a seguir adelante y decirle que debe asumir que hace una gran diferencia y es mucho más débil.