a = "qwertzuiopasdfghjklyxcvbnm"
n = "1234567890"
r = "23456qwertasdfgzxcvbQWERTASDFGZXCVOB"
l = "78901yuiophjklnmYUIPHJKLNM"
all = a + n + r + l
¿Por qué esto es tan complicado? Al incluir algunos caracteres varias veces, es más probable que aparezcan en las contraseñas, lo que debilita la contraseña. Al hacer que la cadena de su contraseña sea tan complicada, es difícil determinar la seguridad de las contraseñas.
Para obtener una oportunidad uniforme de cualquier personaje, solo enumera todos ellos una vez. Además, puede simplificar dramáticamente esto utilizando el módulo string .
import string
all = string.ascii_letters + string.digits
Otro problema es que la documentación del módulo random dice que no se debe usar para la criptografía:
Python usa Mersenne Twister como generador de núcleo. Produce flotadores de precisión de 53 bits y tiene un período de 2 ** 19937-1. La implementación subyacente en C es rápida y segura para subprocesos. El Mersenne Twister es uno de los generadores de números aleatorios más ampliamente probados en existencia. Sin embargo, al ser completamente determinista, no es adecuado para todos los propósitos y es completamente inadecuado para propósitos criptográficos.
[...]
Advertencia: los generadores seudoaleatorios de este módulo no deben usarse por razones de seguridad. Use os.urandom () o SystemRandom si necesita un generador de números pseudoaleatorios seguro criptográficamente. **
Por lo tanto, use random.SystemRandom()
en su lugar:
import random
import string
# Consider adding string.punctuation
possible_characters = string.ascii_letters + string.digits
def generate_password(length=32):
rng = random.SystemRandom()
return "".join([rng.choice(possible_characters) for i in range(length)])
Como sabemos exactamente cuántos caracteres posibles hay (62), y sabemos que deben distribuirse al azar, podemos decir con bastante confianza de que una contraseña generada por este esquema requerirá en promedio (62 ^ 32) / 2 (alrededor de 10 ^ 57) intenta adivinar.
Dicho esto, una contraseña de 32 caracteres es probablemente lo suficientemente segura, incluso si no es óptima al azar.