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).

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):

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

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:

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

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

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:

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:

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

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
Publicar un comentario