Cifrando y descifrando datos en Python

Read in English

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.

Help me keep writing

Every coffee gives me a push toward the next article.

Comments

There are no comments yet.

You may also like