Estaba pensando en generar contraseñas con una combinación de inglés, árabe y chino charac. ¿Es este pase lo suficientemente seguro contra ataques de fuerza bruta?
La selección de caracteres de un conjunto de caracteres más grande debería aumentar la seguridad; Si usa un carácter poco común como ♥ o en su contraseña que un brute force no está intentando verificar, es posible que su seguridad haya aumentado considerablemente.
Sin embargo, dependiendo de la implementación de la aplicación que recibe su contraseña, esto también puede reducir considerablemente la seguridad. Las contraseñas escritas por los usuarios no son de confianza y son un vector potencial para el ataque (por ejemplo, inyección de SQL y se pueden explotar codificaciones Unicode para este tipo de ataques ). También algunas funciones de hashing pueden esperar una entrada simple de ascii.
Por lo tanto, las aplicaciones pueden hacer que la entrada del usuario pase por un estricto procedimiento de desinfección antes de ser comparada / almacenada en la base de datos; lo que puede eliminar el murciélago simplemente elimina los caracteres que no son ascii (o realice una traducción simple como ȃ
a a
). Esto podría hacer que una contraseña rara como Pȃssw0rd
se convierta en Password
, lo que sería trivial a la fuerza bruta. El año pasado, un amigo me dijo que recibió su contraseña de una de las cuatro grandes compañías de teléfonos celulares (aparentemente almacenada en texto sin formato) y descubrió que todos los caracteres especiales de su contraseña se eliminaron en silencio.
También puede ser mucho más difícil usar esa contraseña en diferentes entornos informáticos, como dispositivos móviles / sistemas operativos modificados / codificaciones diferentes (UTF-7, UTF-8, UTF-16, ISO-8859-1, etc.).
En general, es mejor usarlo para aumentar la longitud de tu contraseña que para aumentar el tamaño de tus conjuntos de caracteres. Digamos que elige caracteres al azar de un conjunto de 100 caracteres y elige 8 caracteres al azar. El espacio de la contraseña es 100 8 = 10 16 . Digamos que en su lugar, con frecuencia utiliza dos conjuntos de caracteres (y el atacante lo sabe, por ejemplo, es consciente de que usted habla / escribe árabe con frecuencia y probablemente mezclará símbolos de unicode árabe en su contraseña) y elija caracteres al azar de este conjunto de 200 caracteres. Ahora, una contraseña aleatoria de 8 caracteres de un conjunto de 200 caracteres tiene un espacio de contraseña de 200 8 = 2.56 x 10 18 que es 2 ^ 8 = 256 veces más difícil que la fuerza bruta que la contraseña de 8 caracteres de un conjunto de 100 caracteres. O en otros términos, una contraseña de 10 caracteres de 100 caracteres es más fuerte que una contraseña de 8 caracteres de un conjunto de 200 caracteres; y como los caracteres Unicode a menudo son más difíciles de escribir / recordar, puede ser más fácil simplemente aumentar la longitud de la contraseña. (Por supuesto, si un atacante no mira nunca caracteres no-Unicode, nunca podrá descifrar una contraseña de solo ♥
, pero no confiaría nada valioso en el atacante que no piense en mi esquema de generación de contraseña. - Quiero utilizar la aleatoriedad para demostrar mi ventaja. Especialmente debido a que algunos servicios no pueden modificar sus contraseñas y si su esquema ganó popularidad (o alguien dice que lo está usando una vez), los atacantes comenzarán a explorar este espacio.
EDITAR: algunas demostraciones de hashing de python con Unicode:
>>> import hashlib
>>> heart = u'\u2665'
# proper way to deal with unicode strings in python the u before the quote
# indicates its a unicode string
# type in unicode hex-code following a \u prefix
>>> print heart
♥
>>> hashlib.sha256(heart).hexdigest()
UnicodeEncodeError: 'ascii' codec can't encode character u'\u2665' in position 0: ordinal not in range(128)
>>> heart.encode('utf-8')
'\xe2\x99\xa5' # This is three byte string (with numbers 226, 153, 165; note ascii only goes to 127).
>>> hashlib.sha256(heart.encode('utf-8')).hexdigest()
'7c546e1819d9562a67643820b4305c3892fd9a151628e447c8e8dae162fe8f57'
>>> hashlib.sha256('\xe2\x99\xa5').hexdigest()
'7c546e1819d9562a67643820b4305c3892fd9a151628e447c8e8dae162fe8f57'
>>> hashlib.sha256('♥').hexdigest() # pasting unicode string
'7c546e1819d9562a67643820b4305c3892fd9a151628e447c8e8dae162fe8f57'
>>> heart.encode('utf-7')
'+JmU-'
>>> hashlib.sha256(heart.encode('utf-7')).hexdigest()
'ba9f8a819e396044912635e9f76f8ff66464d8677e94dd079d2abd8e9bb27b29'
Si la longitud de la contraseña no se reduce, entonces diría que será más difícil de descifrar, aunque no lo llamaría "súper seguro". Tomemos, por ejemplo, una contraseña ASCII de 16 caracteres: hay (2^7)^16 = 2^112
de posibilidades para tal contraseña (también llamada 112 bits de entropía, asumiendo que todos los 128 caracteres son igualmente probables en una contraseña "aleatoria"). Una contraseña Unicode de 7 caracteres codificada en UTF-16 por ejemplo (cubrir todo el conjunto) tendría aproximadamente (2^16)^7 = 2^112
de posibilidades, la misma fuerza que antes.
Por esa razón, solo aumentar la longitud de la contraseña ofrecerá la misma protección contra ataques de fuerza bruta. Con la ventaja de que la contraseña será más fácil de escribir y no causará problemas si se ingresa en sistemas con diferentes codificaciones predeterminadas y métodos de entrada.
Me gustaría agregar, sin embargo, que para que las matemáticas contengan las contraseñas deben ser realmente aleatorias . Hay otros tipos de ataques (como ataques de diccionario, tablas de arco iris, etc.) que aprovechan diferentes probabilidades en la distribución de caracteres en una contraseña. Dado que, según tu pregunta, parece que estás generando esas contraseñas, creo que puedes hacerlo bien sin usar conjuntos de caracteres diferentes.
Si bien la creación de una contraseña más larga suele ser la mejor solución, mezclar caracteres de diferentes idiomas es bastante efectivo. Realizar un ataque de fuerza bruta usando solo letras mayúsculas y minúsculas, símbolos de puntuación y números en inglés ya presenta un gran número de posibilidades (suponiendo que tenga una contraseña de una longitud decente) e introducir un nuevo idioma completo hará que el posible espacio de teclas crecer astronómicamente.
Habiendo dicho eso, si ingresas estos caracteres con un teclado inglés, probablemente tengas que mantener presionada la tecla ALT y escribir una secuencia de números de 3-4. Matemáticamente, para la cantidad de pulsaciones de teclado que está ingresando, también puede agregar 4-5 caracteres a la longitud de su contraseña.
Además, muy pocos sistemas realmente le permiten ingresar algo más allá de las letras y números estándar. Y si hay errores de codificación en el proceso, su carácter puede terminar normalizándose a un carácter ASCII estándar de todos modos. Este fue el caso durante mucho tiempo con el inicio de sesión de Windows GINA ( aunque esto creó una situación interesante en la que podría crear una contraseña programada para una cuenta que nunca podría usarse para iniciar sesión a través de la consola ).
Entonces, la respuesta es sí, es una gran técnica, pero por el número de pulsaciones de teclas y para evitar problemas de compatibilidad, también puedes hacer que tu contraseña sea más larga.
Como regla general, los ataques de fuerza bruta siguen algún tipo de diccionario. Si la contraseña no está en el diccionario que usan, entonces no será adivinada. Si alguien crea un diccionario que incluye su contraseña, entonces será adivinado. Eso es todo lo que hay que hacer.
Diccionarios dinámicos dirigidos & mesas de arcoiris.
Los clústeres de GPU distribuidos descifran trillones de contraseñas por segundo (y eso es lo que puedes comprar de Amazon o compilar tú mismo)
Entrar en supercomputadoras, súper-FPGA y Quantum Qubit se está volviendo cada vez más aterrador y borroso.
El factor 2 parece ser el único camino a seguir si realmente está interesado en la garantía de sus datos. (incluso entonces es todavía un teatro de seguridad) Quién sabe qué "lógicamente" se rompió y qué se rompió desde el principio a propósito.
: - \
Lea otras preguntas en las etiquetas brute-force