generador-de-contraseñas-con-python

Creando generador de contraseñas con Python

Hola, mi nombre es Antonio Alfonso Martínez y en el presente artículo me dispongo a describir la creación de un programa capaz de generar, de modo automático, una contraseña, con un nivel aceptable de seguridad, para nuestras cuentas de Internet.

He aquí un ejemplo del modo en que va a funcionar nuestro programa una vez creado:

python-keepcoding

 

 

 

 

Como es habitual, lo primero que haremos será importar los módulos que vamos a emplear en la creación de nuestro programa, que en nuestro caso serán: “subprocess”, “random” (para generación de aleatoriedad), “string” (el cual nos permitirá disponer de los métodos necesarios para combinar caracteres alfanuméricos) y “VALID” (este último de creación propia).

Ahora, daremos la opción a nuestro usuario de escoger la longitud (número de caracteres) de nuestra futura contraseña. Esta longitud quedará representada por la variable «longitud». Para asegurarnos de que solo sevpueda introducir un valor numérico entero, usaremos la función «OKI» que aplicaremos sobre el «input»(dicha función, en mi caso se encuentra alojada en «VALID.py»):

 

 

A continuación crearemos, de modo aleatorio, nuestra contraseña (variable «contraseña») la cual, se originará a partir de los caracteres alfanuméricos disponibles en nuestra variable «caract» (resultado de la suma de los caracteres alfabéticos contenidos en «string.ascii_letters» y los caracteres numéricos en formato cadena contenidos en «string.digits») los cuales, al final, uniremos (mediante la función «join») empleando el espacio («») como criterio de unión. Esta operación de extracción de caracteres para su posterior unión la realizaremos tantas veces como sea el número de la longitud de nuestra futura contraseña («for i in range longitud:»).

 

 

Con esto ya tendríamos un programa (en este caso, una funcionalidad) capaz de crear de modo automático una contraseña, con el número de caracteres que le especificamos.

Pero como sabemos, en muchas páginas de Internet, cuando tenemos que crear una contraseña, por motivos de seguridad, se nos piden contraseñas que reúnen ciertas requisitos como puede ser un número mínimo de minúsculas, mayúsculas o caracteres numéricos y símbolos. Es por ello que vamos a introducir algunas variaciones en nuestro código.

La primera de tales variaciones es la consistente en establecer las variables «minus», «mayus» y «numeros», que se corresponden con el número mínimo de caracteres en minúscula, mayúsculas y caracteres numéricos, que queremos que tenga nuestra contraseña (a cada uno de los cuales, volvemos a aplicar la función «OKI»).

El siguiente paso que daremos, será crear un ciclo que en cada ejecución, genere una contraseña con la longitud especificada y que, a su vez, compruebe si dicha contraseña cumple los requisitos pedidos por el usuario mediante las variables «minus», «mayus» y «numeros», que, como recordaremos, se corresponden con el número mínimo de minúsculas, mayúsculas y caracteres numéricos, previamente especificados por el usuario:

 

 

Así, lo que hemos hecho, ha sido utilizar un «while», en el que, en primer lugar, se genera una contraseña (variable «contraseña») a partir de los caracteres contenidos en «caract» (como hacíamos antes) para, a continuación, comprobar si el número de caracteres en minúscula («lower») es mayor o igual al número mínimo pedido para «minus» («>=minus») y que el numero de caracteres en mayúsculas («upper») es mayor o igual a «mayus» («>=mayus») y si el número de caracteres numéricos («digit») es mayor o igual a «numeros» («>=numeros»). Solo cuando, en la correspondiente ejecución del ciclo, la contraseña generada cumpla estos 3 requisitos, el ciclo se interrumpirá (mediante la sentencia «break») y el programa nos mostrará nuestra contraseña («print(«SU CONTRASEÑA: «,contraseña»).

A modo de ejemplo, para ver como se ejecuta esta parte del código (me refiero al ciclo de creación/comprobación de contraseñas) vamos a insertar un «print» en dicho ciclo para ver como este va generando dichas contraseñas hasta encontrar una que cumpla los requisitos pedidos con las variables «minus», «mayus» y «numeros»:

 

Tras lo cual ejecutamos, en el «shell», el programa, especificándole que queremos una contraseña de 10 caracteres que tenga al menos 2 minúsculas, 2 mayúsculas y 4 números:

 

Como se puede ver, para encontrar la contraseña adecuada a lo que el usuario pide, el ciclo se ha tenido que ejecutar 6 veces, generando 5 contraseñas no válidas hasta llegar a la sexta (si válida) que es la que finalmente nos ha mostrado como resultado (en principio este proceso puede parecer lento, pero no hemos de olvidar que este se produce en milésimas de segundo, con lo que el resultado es, prácticamente, instantáneo).

No obstante, nuestro programa sigue teniendo un defecto importante, el cual se encuentra relacionado con la combinación entre los mínimos pedidos y la longitud solicitada para la contraseña. Esto se entiende si imaginamos el supuesto en el que nuestro usuario pretende crear una contraseña de tan solo 5 caracteres, pidiendo a su vez, que al menos 2 sean minúsculas, 2 mayúsculas y 2 numéricos. En este caso a la contraseña pedida le faltaría siempre un carácter para poder cumplir los mínimos pedidos. De modo que si volviéramos a hacer el experimento anterior, veríamos como el ciclo empezaría a generar una lista infinita de contraseñas sin llegar nunca a ningún resultado final (ya que con esa longitud sería imposible encontrar una contraseña con los mínimos pedidos). De esto se deduce la necesidad de que nuestra longitud este acorde con dichos mínimos.

Para ello, procuraremos hacer que el programa, para la longitud, compruebe si esta es mayor o igual a la suma de los mínimos pedidos (la cual será representada en la variable «suma». De modo que mientras que la longitud pedida sea menor a dicha cifra («while longitud<suma:») nos aparezca un mensaje alertándonos de que la longitud no es adecuada, permitiéndonos, a su vez, introducir un nuevo valor para dicha longitud:

 

Ejemplo de mensaje de error, con rectificación posterior:

 

 

 

 

Finalmente, tal y como se aprecia en el código final, crearemos una variable (de nombre “conti”) mediante la cual, preguntaremos al usuario si quiere continuar usando el programa. Ante lo que este solo deberá contestar “s” (contestación afirmativa) o “n” (contestación negativa). Para asegurar que solo se introduce una de tales contestaciones haremos uso de la función “ns” que se encuentra en el módulo “VALID” y cuya sintaxis sería la que sigue:

 

keepcoding-python

 

Podéis ver el código completo del programa en el repositorio de Github al que me remito en el siguiente enlace:

Antonio Alfonso MartínezProgramador y desarrollador autodidacta. Semanalmente publica en el blog El programador Chapuzas (wordpress) y también colaboro en las páginas “Código Comentado” y “Algoritmos MathPy” de Facebook.

 

 

Si tienes algo que deseas compartir o quieres formar parte de JustCodeIt, escríbenos a [email protected].



 

 

Share this:

Leave a comment