Cifrado de archivos en Python: análisis detallado de técnicas simétricas y asimétricas
Keshav Malik
22 de noviembre de 2023
0 minutos de lecturaEn el mundo actual, compartimos constantemente información privada, confidencial y sensible a través de canales digitales. Un componente fundamental de esta comunicación es el cifrado de archivos: transformar los datos en un formato ilegible mediante algoritmos de cifrado.
Hay dos tipos principales de cifrado: simétrico y asimétrico. El cifrado simétrico es como una caja con un solo candado y una sola llave. Si dos personas tienen la llave, pueden pasarse la caja con la seguridad de que solo ellas podrán abrirla. El cifrado asimétrico, en cambio, usa un par de llaves. Imagina una caja que puedes cerrar con una llave, pero que solo puedes abrir con otra. Podrías compartir la llave para cerrar (la llave pública) sin riesgos, porque nadie podría abrir la caja (descifrar los datos) sin la llave para abrirla (la llave privada).
Este artículo explora el mundo del cifrado en Python. Para el cifrado simétrico, nos centraremos en Key Management Service (KMS) de Amazon y SecretBox de PyNaCl. Después, veremos el cifrado asimétrico y la caja de claves pública/privada de PyNaCl.
Requisitos previos
Para seguir este tutorial, necesitas:
Python instalado (v3.7 o posterior)
pipenv instalado. Este administrador de dependencias de Python te ayudará a evitar conflictos entre las versiones de los paquetes. Instálalo con
pip install pipenv.Instalar los paquetes necesarios (aws-encryption-sdk, PyNaCl y cryptography) ejecutando
pipenv install aws-encryption-sdk pynacl cryptography.Una cuenta de AWS activa y una clave de KMS (ten a mano el ID de la clave y la región de AWS; los usaremos al ejecutar el programa de Python).
La herramienta de línea de comandos de AWS (awscli) instalada. Ejecuta
aws configurepara configurar AWS en tu máquina.Un proyecto nuevo configurado en un entorno aislado, creado con lo siguiente:
Para ver el resultado final, consulta el código completo del proyecto.
Cifrado simétrico en Python
El cifrado simétrico usa la misma clave para cifrar y descifrar datos. Es sencillo, rápido, eficiente e ideal para proteger grandes cantidades de datos.
En este tutorial, usaremos Amazon KMS y SecretBox de PyNaCl para implementar el cifrado simétrico en Python. Amazon KMS nos ayuda a crear, controlar y administrar claves de cifrado en la nube de Amazon Web Services (AWS). Puedes pensar en él como un llavero en la nube con una capa adicional de seguridad. SecretBox es una biblioteca de Python que facilita el cifrado y lo hace accesible. Puedes pensar en ella como una caja fuerte personal.
Uso de Amazon KMS y los SDK de cifrado para el cifrado simétrico
Amazon KMS es un servicio en la nube para administrar claves criptográficas. Se integra a la perfección con otros servicios y kits de desarrollo de software (SDK) de cifrado de AWS, y aprovecha la sólida seguridad que ofrece AWS. Su estrecha integración con los servicios y SDK de cifrado de AWS lo hace ideal para aplicaciones basadas en AWS.
La razón más convincente para usar KMS en el cifrado simétrico es la administración de claves secretas compartidas. El manejo seguro de estas claves puede ser el aspecto más difícil del cifrado. Amazon KMS evita estos desafíos con elegancia mediante un patrón de cifrado de sobre. Con este enfoque, las claves se cifran junto con los datos. Esto significa que dependes principalmente de una clave maestra en un módulo de seguridad de hardware, que permanece inaccesible para las entidades no autorizadas. Este mecanismo de envoltura de claves simplifica el proceso de cifrado y deja de lado las complejidades de la administración y rotación de claves, así como otros obstáculos relacionados.
Sin embargo, Amazon KMS puede ser innecesario si solo necesitas una solución sencilla y de pequeña escala. Además, es un servicio de pago, por lo que los costos pueden dispararse con un uso intensivo.
Ahora, usemos Amazon KMS para cifrar un archivo en una aplicación de Python.
Importa los módulos necesarios
Para interactuar con Amazon KMS, primero debemos instalar e importar aws-encryption-sdk, el SDK de cifrado de AWS para Python, que simplifica los procesos de cifrado y descifrado.
Crea un archivo llamado main.py y agrega el siguiente código:
Nota: Puedes copiar el ARN de la clave de KMS desde el panel de AWS KMS.
Cifra el archivo
Usaremos el SDK de cifrado de AWS para realizar el cifrado. El SDK se integra estrechamente con AWS KMS y ofrece una experiencia de cifrado fluida.
Agrega el siguiente código a main.py:
Descifra el archivo
Usaremos nuevamente el SDK de cifrado de AWS para descifrar el archivo. El proceso de descifrado lee el archivo cifrado y luego usa las claves de KMS para descifrar los datos sin complicaciones.
Agrega los siguientes comandos a main.py:
Llama a las funciones
Ya creamos las funciones y ahora debemos llamarlas y ejecutar el programa de Python. Primero, crea un archivo llamado myfile.txt y agrega contenido aleatorio.
Luego, dentro de main.py, llama a las siguientes funciones:
Al ejecutar python main.py para correr el script, ciframos y luego desciframos myfile.txt, sin modificar su contenido.
Nota: Para simplificar, incluimos directamente en el código el ID de la clave (como parte del ARN de la clave). Usa el archivo .env para almacenar información confidencial.
Uso de SecretBox de PyNaCl para el cifrado simétrico
PyNaCl es un enlace de Python a la biblioteca de redes y criptografía libsodium. Incluye una gran variedad de herramientas criptográficas, entre ellas SecretBox, que ofrece funciones de cifrado simétrico. La ventaja de SecretBox es su sencillez: solo hace falta una clave para cifrar y descifrar nuestros datos.
Veamos cómo cifrar un archivo sensible en una aplicación de Python con SecretBox.
Primero, crea un archivo nacl.txt y agrega texto de ejemplo. Luego, importa los módulos necesarios en un archivo nuevo de programa de Python llamado sym.py:
El siguiente paso es generar y cargar la clave secreta. La función generate_key genera una clave aleatoria, y la función load_key carga la clave generada desde la ruta del archivo y la devuelve:
Ahora, ciframos el archivo. La función encrypt_file necesita file_path y la clave para cifrar el archivo sensible. Busca el archivo mediante file_path, luego lee y cifra su contenido con la clave secreta y escribe el texto cifrado en un archivo nuevo con la extensión .enc:
Así como tenemos una función para cifrar, también necesitamos una función similar para descifrar. La función decrypt_file recibe file_path y key para descifrar un archivo. Primero, comprueba si existe un archivo cifrado con la extensión .enc (sí existe: lo generamos en el paso anterior). Luego, lee su contenido y lo descifra con la misma clave secreta. Por último, escribe el contenido descifrado en un archivo nuevo con la extensión .dec:
El último paso es llamar a las funciones que acabamos de crear:
Ahora puedes ejecutar el programa de Python con el comando sym.py en la terminal.
Nota: Este código no está listo para usarse en una aplicación real o en un entorno de producción. El manejo seguro de claves de cifrado es una tarea compleja que requiere pasos adicionales, como rotar las claves con regularidad. Este código no incluye esas medidas de seguridad fundamentales.
Cifrado asimétrico en Python
Mientras que el cifrado simétrico usa una clave, el cifrado asimétrico usa dos: una clave pública para cifrar y una privada para descifrar. Es como un buzón con cerradura. Cualquiera puede dejar una carta por la ranura (cifrado), pero solo quien tenga una llave única puede abrirlo para leerla (descifrado).
El cifrado asimétrico es especialmente adecuado para proteger las comunicaciones por internet. Si quieres enviarle un mensaje secreto a alguien, puedes cifrarlo con su clave pública, y solo esa persona podrá descifrarlo con su clave privada. El cifrado asimétrico protege las firmas y los certificados digitales, que son la base de la autenticación en el mundo digital.
Uso de la caja de claves pública/privada de PyNaCl para el cifrado asimétrico
Entonces, ¿cómo realizamos el cifrado asimétrico en Python? Veamos otra herramienta de PyNaCl: la caja de claves pública/privada.
La caja de claves pública/privada de PyNaCl es similar a un buzón personal. Es una interfaz para cifrar y descifrar mensajes con dos claves: pública y privada. Podemos compartir abiertamente la clave pública que se usa para cifrar mensajes. Pero debemos mantener en secreto la clave privada, que se usa para descifrarlos.
Primero, crea un archivo asym_nacl.txt y agrega texto de prueba. Debemos habilitar el almacenamiento y la recuperación seguros de las claves de cifrado. La función save_key escribe la clave en file_path, mientras que load_key obtiene y devuelve la clave desde file_path.
Agrega el siguiente código a un archivo nuevo, asym.py:
Ahora, debemos implementar funciones para cifrar y descifrar nuestro archivo sensible. La función encrypt_file usa claves públicas para cifrar el archivo y guardarlo en un archivo .enc con el texto cifrado. La función decrypt_file usa claves privadas para abrir el archivo (descifrarlo) y guardarlo en un archivo .dec.
Agrega las siguientes funciones a asym.py:
Por último, es hora de ver los resultados de todo nuestro trabajo. Generamos dos claves: la clave pública, que usamos para cerrar nuestro archivo, y una clave privada, que guardamos. Cuando necesitamos acceder al archivo, cargamos la clave privada guardada junto con la clave pública correspondiente para descifrarlo.
Agrega las llamadas finales a las funciones en el archivo asym.py:
Ejecuta el programa con python asym.py desde la terminal local.
Nota: El código anterior demuestra cómo funcionan el cifrado y el descifrado. Sin embargo, no es seguro para aplicaciones del mundo real. El archivo de claves no está protegido, por lo que, si alguien obtiene acceso a él, podrá abrir tus archivos.
Ventajas y desventajas de la caja de claves pública/privada de PyNaCl
La caja de claves pública/privada de PyNaCl ofrece una sólida seguridad. También permite una comunicación segura, incluso a través de canales inseguros, lo que la hace ideal para las comunicaciones por internet.
Por otro lado, la administración de claves puede ser complicada con la caja de claves pública/privada. Debemos almacenar las claves privadas de forma segura y asegurarnos de usar las claves públicas correctas para el cifrado. El cifrado asimétrico también puede ser más lento que el simétrico, porque implica operaciones más complejas.
Conclusiones de nuestra exploración
En este artículo, exploramos algunas herramientas potentes de Python para implementar métodos de cifrado. Amazon KMS y SecretBox de PyNaCl son excelentes para el cifrado simétrico, mientras que la caja de claves pública/privada de PyNaCl destaca en el cifrado asimétrico.
Estas herramientas ofrecen diversos beneficios para el manejo seguro de datos. Amazon KMS ofrece una escalabilidad excepcional, SecretBox de PyNaCl brinda alto rendimiento y amplia compatibilidad, y la caja de claves pública/privada de PyNaCl permite comunicaciones altamente seguras. En conjunto, estas herramientas conforman un kit integral de cifrado.
Al elegir un método de cifrado, debemos considerar qué tan sensibles son nuestros datos, el entorno en el que los transmitiremos y cómo administraremos las claves. No existe un método de cifrado perfecto, pero podemos encontrar fácilmente el que mejor se adapte a nuestras necesidades.
Empieza a proteger tus aplicaciones de Python
Encuentra y corrige vulnerabilidades en Python gratis con Snyk.
No se requiere tarjeta de crédito.
O regístrate con Azure AD Docker ID Bitbucket
Al usar Snyk, aceptas cumplir nuestras políticas, incluidos nuestros Términos del servicio y nuestra Política de privacidad.



