Ir al contenido principal

Creando generador de contraseñas con python.

Hola, mi nombre es Antonio Alfonso Martínez y en el presente articulo 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. A su vez nuestro programa, también nos dará la opción de generar una “url” segura (aunque a esta segunda funcionalidad le dedicaremos un futuro articulo).

contrase

Como es habitual, lo primero que haremos será importar los módulos que vamos a emplear en la creación de nuestro programa. Debido a que este es un programa con 2 funcionalidades (crear contraseña segura y crear URL segura) empezaremos importando los módulos de uso común para ambas. Dichos módulos son “subprocess” y “VALID” ( este último, de creación propia).

Una vez hecho la importación crearemos el código a ejecutar para el caso de que la elección del usuario haya sido la “A” (contraseña segura):
contraseñas

Como se puede ver, para este supuesto (opción “A”) procederemos a importar los módulos “random” (para la generación de aleatoriedad) y “string” (el cual nos permitirá disponer de los métodos necesarios para combinar caracteres alfanuméricos). Hecho esto, daremos la opción a nuestro usuario de escoger la longitud (número de caracteres) de nuestra futura contraseña. Dicha longitud quedará representada por la variable “longitud”.Para asegurarnos de que el usuario solo pueda 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”):
OKI
El siguiente paso será el de crear, 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. No obstante, en las paginas de Internet, a la hora de establecer una contraseña no es inusual que, por motivos de seguridad se nos pidan contraseñas que reúnan ciertas requisitos como puede ser un número mínimo de minúsculas, mayúsculas o caracteres numéricos. Es por ello que vamos a introducir algunas variaciones en nuestro código:

contras-e1529654913657.png

Como se puede apreciar, lo primero que hemos hecho ha sido, establecer mediante los “inputs” para las variables “minus”, “mayus” y “numeros”, el número mínimo de caracteres en minúscula, mayúsculas y caracteres numéricos, respectivamente. (a cada uno de los cuales, volvemos a aplicar la función “OKI”).

El siguiente paso que vamos a dar, 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”:

contras

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 numero 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”:

conprintcontra

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

Como se puede ver, para encontrar la contraseña adecuada a lo que el usuario pide, el ciclo se ha tenido que ejecutar 7 veces, generando 6 contraseñas no válidas hasta llegar a la septima (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 faltaria siempre un carácter para poder cumplir los mínimos pedidos. De modo que si volvieramos 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:

contra-fin

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

csafee

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

https://github.com/antonioam82/passwords

Saludos.

Comentarios

Entradas más populares de este blog

Calculando el factorial de un número (ejemplo de función recursiva).

Hola, mi nombre es Antonio Alfonso Martínez y en el presente artículo me dispongo a explicar un sencillo método para calcular el factorial de un número haciendo uso del concepto de recursividad. Para empezar, diremos que el factorial de un número natural "n" es el resultado del producto de todos los números desde 1 hasta dicho número "n". Así, para efectuar el calculo del factorial de un número, vamos a emplear una sencilla función a la que daremos el nombre de "factorial". De modo, que, partiendo del hecho de que el factorial de 1 y 0 es 1, construiremos nuestra función (a la que daremos el nombre de "factorial") para realizar el calculo del factorial de 5: Lo que hace esta función, es tomar como argumento un número "n". de modo que si este es 0 o 1 ("if n==0 or n==1:") la función devolverá directamente como resultado el número 1 ("resultado=1"). Sin embargo si dicho número "n" es mayor que...

Sistema Hexadecimal - Sistema de numeración posicional

Sistema Hexadecimal El sistema hexadecimal es un sistema numérico que tiene como base el numero 16, y es una variante de los numero binarios El sistema hexadecimal es utilizado por nuestros ordenadores con el fin de abreviar valores de datos e instrucciones de memoria. Esta es una imagen que muestra el contenido de un archivo con exención 'dll' en un editor de texto, como el editor de texto no reconoce este tipo de archivo, nos lo muestra de esta manera: Como se puede apreciar, en vez de ver una gran cantidad de 0 y 1, vemos que hay grupos de 4 dígitos, y si observamos, vemos que son grupos de dígitos hexadecimales. El archivo cuentan con más de 48 mil lineas, por ello no se me es posible mostrarlo todo. Este es uno de los usos del sistema hexadecimal para abreviar grandes cantidades de 0 y 1. Ustedes mismos pueden hacer la prueba con una imagen o con cualquier otro tipo de texto. El sistema hexadecima, esta conformado por solo 16 dígitos. A continuación te lo...

Ejercicios de Programación en Java: Condicionales, Bucles, Tablas y Funciones

PRÓLOGO El libro Ejercicios de Programación en Java: Condicionales, Bucles, Tablas y Funciones nace como fruto de años de docencia en materias relacionadas: Algorítmica, Programación, Lenguaje C y Java, entre otros.  Con el paso del tiempo he constatado que aprender un lenguaje de programación es relativamente sencillo y sobre este tema existen muchos y muy buenos textos. Pero aprender a programar es algo totalmente distinto, que necesita de un mayor esfuerzo y abordar el problema desde otra perspectiva. Siempre utilizo la metáfora del pianista para explicar el tándem programar/lenguaje de programación: saber tocar las notas de un piano es relativamente fácil, tan solo debemos anotar en cada una de las teclas a qué nota musical corresponde. Esto sería similar a conocer un lenguaje de programación. Es muy sencillo utilizar un if o entender la mecánica de un while .  Volviendo al piano: una vez que dominamos la relación tecla/nota, un pianista debe aprender muchas ot...