Cifrando y descifrando datos en Python
En ciertos momentos necesitamos cifrar datos en el backend para protegerlos. Si estás en el ecosistema de Python, tienes una biblioteca fantástica para ello: cryptography. Por debajo usa OpenSSL, así que es rápida y segura. Por encima está Fernet, que es una capa de abstracción que hace que sea muy fácil de usar.
Para usarla, primero, añade la dependencia a tu proyecto:
cryptography>=42
O instálala con pip:
pip install cryptography
El siguiente paso es crítico. Tienes que generar una clave de cifrado y guardarla en un lugar seguro. Si la pierdes, no podrás recuperar los datos. Y obviamente, si alguien más la obtiene, podrá descifrar todo. No está de más recordar que sería buena idea guardarla en una variable de entorno y/o en un vault seguro.
Para generarla puedes usar un script:
python -c 'from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())' > encryption_key.txt
Fernet usa cifrado simétrico (AES-128-CBC + HMAC-SHA256). La clave de 32 bytes generada se divide en dos mitades: una para el cifrado y otra para la autenticación. Internamente, la clave se genera con os.urandom(32) codificado en base64 url-safe.
Con ello ya podemos trabajar.
Importamos la clase Fernet:
from cryptography.fernet import Fernet
Importamos nuestra clave. Idealmente, la habremos guardado en una variable de entorno:
from os import getenv
encryption_key = getenv("ENCRYPTION_KEY").encode()
Y ya podemos cifrar nuestro primer texto:
fernet = Fernet(encryption_key)
cipher_text = fernet.encrypt(b"Texto que quiero proteger")
Para descifrarlo, solo tenemos que usar el mismo objeto Fernet:
plain_text = fernet.decrypt(cipher_text)
print(plain_text.decode()) # "Texto que quiero proteger"
Ahora centrémonos en el caso que busquemos proteger un binario, como un archivo. El proceso es el mismo, pero con archivos:
# Cifrar un archivo
with open("archivo_original.pdf", "rb") as file:
original_data = file.read()
cipher_data = fernet.encrypt(original_data)
with open("archivo_cifrado.enc", "wb") as file:
file.write(cipher_data)
Y con esto ya tenemos lo básico para cifrar y descifrar datos. Úsalo en las columnas de tus bases de datos, en los archivos que guardes, o en lo que necesites. Solo recuerda: la seguridad de tus datos depende de la seguridad de tu clave. Cuídala como si fuera oro.
This work is under a Attribution-NonCommercial-NoDerivatives 4.0 International license.
Support me on Ko-fi
Comments
There are no comments yet.