Anuncios

Bienvenidos sean a este post, hoy hablaremos sobre un modulo que nos permite trabajar de muchas formas.

Anuncios

Este modulo es usado para generar numeros al azar criptograficamente fuertes para administrar datos tales como contraseñas, autenticacion de cuentas, tokens de seguridad y secretos relacionados, este fue agregado a partir de la version 3.6 y basicamente se compone de tres elementos:

  • Numeros al azar
  • Tokens
  • Comparacion de resumen
Anuncios

Y en este post vamos a hablar sobre estos tres, comencemos con el primero.

Anuncios

Numeros al azar

Para poder trabajar con numeros al azar debemos usar tres funciones en un orden, comencemos con el primero:

>>> print(secrets.choice('Elige una de estas palabras'.split()))
una
>>>
Anuncios

En este caso es la funcion choice donde por medio de una frase (literal o en una variable) y split elegira una de las palabras y la usara, este siempre cambiara de manera al azar, veamos la siguiente funcion:

>>> print(secrets.randbelow(10**6))
173798
>>>
Anuncios

En esta ocasion la funcion es randbelow el cual genera un numero al azar entre 0 y el argumento que pasemos como limite, pasemos a ver la siguiente funcion:

>>> print(secrets.randbits(32))
2092798505
>>>
Anuncios

Esta funcion genera un numero al azar con n bits dependiendo del ancho que establezcamos, si necesitan trabajar con numeros al azar y criptografia es mucho mas recomendable estos que los generado por random, dado que los vistos aqui estan pensados explicitamente para esto, pasemos al siguiente tema.

Anuncios

Generacion de Token

Al igual que vimos en el caso anterior en este tambien poseemos tres funciones para trabajar pero estas tambien nos devuelven tres formatos distintos, veeamos la primera funcion:

>>> print(secrets.token_bytes(16))
b'\x9b\xbb\xffD2-\xd1\xa4\x85\xee\x9b;\xda\xcb\xfd7'
>>>
Anuncios

Este devuelve una cadena con una n cantidad de bytes determinada por el argumento que pasemos, pasemos a la siguiente funcion:

>>> print(secrets.token_hex(32))
e8c40f3f336e0d7fbbace6cece82b528ef0221442d4d53df95c069cb4616961a
>>>
Anuncios

Esta tambien devuelve una cadena pero en formato hexadecimal con el tamaño informado y por ultimo tenemos la siguiente funcion:

>>> print(secrets.token_urlsafe(32))
KO6R9dxMCR3-EbeRyOb-iR9Iknk3v7Gu8aOkwE9wdBo
>>>
Anuncios

Esta ultima funcion nos devuelve un token que son compatibles para pasar en un URL tal como su nombre lo indica, con estas tres funciones comentadas y algunas otras que vimos vamos a crear un generador de passwords mas eficientes que el visto anteriormente, para esta ocasion vamos a crear un archivo llamado genera_claves.py y le agregaremos el siguiente codigo:

genera_claves.py

import secrets
from string import digits, ascii_letters

def genera_clv(longitud=8):
	carac = digits + ascii_letters
	return ''.join(secrets.choice(carac) for c in range(longitud))

def genera_clave_segura(longitud=16, mayusculas=3, digitos=3):
	if longitud < mayusculas + digitos + 1:
		raise ValueError('Buen Intento')
	while True:
		clv = genera_clv(longitud)
		if (any(c.islower() for c in clv)
			and sum(c.isupper() for c in clv) >= mayusculas
			and sum(c.isdigit() for c in clv) >= digitos):
			return clv

print(genera_clave_segura())
print(genera_clave_segura(longitud=3, mayusculas=1, digitos=1))
Anuncios
Anuncios

Para este ejemplo vamos a importar a secrets y de string a digits y ascii_letters, el primero contiene una lista de numeros de 0 al 9 y el segundo una lista de la letra a hasta la z, luego definimos una funcion que sera para generar la clave, esta recibe un valor para establecer su longitud pero tiene un valor predeterminado, en el bloque crea un objeto que contendra a ambas listas, lo siguiente sera una devolucion de una cadena de caracteres en base a la lista creada en carac y con el tamaño definido por el bucle for dentro de esta en base a la longitud informada, veamos el siguiente bloque.

Anuncios
Anuncios

El siguiente bloque sera una funcion que genera una clave mas segura, para ello recibe tres valores que son para la longitud de la clave, la cantidad de letras mayusculas y de digitos, todos tienen valores predeterminados en caso de no informarlos, lo siguiente es un condicional donde si longitud es menor al valor de mayusculas mas digitos mas uno nos devuelve una excepcion de tipo ValueError con un mensaje, pero luego tenemos un while donde si es True hara lo siguiente, primero genera una clave con la funcion anterior, luego por medio de any verificamos si es iterable, chequeamos si el contenido en c son minusculas, luego tenemos un sum donde sumara la cantidad de veces que un caracter de clv es mayuscula y una condicion donde chequeamos si es mayor o igual al valor de mayusculas y otro mas que tambien suma la cantidad de veces que el caracter es un digito con otra condicion donde verifica si es mayor o igual a digitos, si cumplen las tres condiciones al mismo tiempo procede a devolvernos el valor de clv, es decir que solamente devolveremos una clave cuando se cumplen todas las condiciones anteriores, despues tenemos dos lineas para generar una clave segura y otra con limitaciones, probemos a ver que nos devuelve:

tinchicus@dbn001vrt:~/lenguajes/python$ python3 genera_claves.py 
vq4U9wcghYY7xh8Y
b0Z
tinchicus@dbn001vrt:~/lenguajes/python$
Anuncios

En este caso podemos ver como no solamente genero la clave bien segura y otra con las limitaciones que le pasamos en la ultima linea, con esto explicado podemos pasar al siguiente tema.

Anuncios

Comparacion de resumen

Dentro del modulo secrets existe una funcion muy interesante llamada compare_digest, y esta realiza la comparacion entre dos resumenes y esta equivale a compararlas por medio de este signo == pero que funcionalidad tiene una funcion? Esta es para evitar ataques de tiempo.

Anuncios

Estos tipos de ataque pueden inferir informacion sobre donde comienzan a ser diferentes los dos resumenes, segun el tiempo que tarda en fallar la comparacion, por lo tanto esta funcion evita este ataque al eliminar la correlacion entre el tiempo y las fallas, como pueden ver los metodos de ataques pueden ser muy sofisticados y por esta razon se recomienda que no se deben implementar funciones de criptografia propias.

Anuncios

En resumen, hoy hemos visto como trabaja el modulo secrets, hemos mencionado los tres tipos de elementos que utiliza, hemos visto como generar numeros al azar, luego hemos visto como trabajar con un token, para despues ver como crear un programa para generar claves al azar mediante el token, por ultimo hemos visto como es la comparacion de resumen, espero les haya sido de utilidad sigueme en tumblr, Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.

Anuncios
pp258

Donación

Es para mantenimento del sitio, gracias!

$1.50