Skip to main content

Cifrado simétrico vs. asimétrico: ejemplos prácticos en Python

Escrito por
Headshot of Josh Amata

Josh Amata

blog feature fuzzing tools

15 de mayo de 2024

0 minutos de lectura

El cifrado simétrico y el asimétrico son las dos formas más comunes de proteger datos confidenciales mediante criptografía. Estos métodos usan claves para transformar un mensaje sin cifrar en uno cifrado (un texto cifrado), que es extremadamente difícil de descifrar sin las claves correctas. El cifrado simétrico usa una sola clave para cifrar y descifrar datos. En cambio, el cifrado asimétrico usa un par de claves, una pública y una privada, para cifrar y descifrar datos confidenciales.

Los sistemas de transmisión y almacenamiento seguro de datos, que priorizan la confidencialidad de la información, suelen usar estos métodos de cifrado. Por ejemplo, las aplicaciones de mensajería con cifrado de extremo a extremo cifran los mensajes antes de enviarlos. Este enfoque evita que un atacante espíe y lea mensajes en texto sin cifrar mediante un ataque de intermediario. El contenido de un mensaje cifrado es ilegible para un atacante.

El cifrado simétrico y el asimétrico también son útiles en otros casos, como el almacenamiento de información confidencial, por ejemplo, contraseñas y registros médicos. Por lo general, los sistemas cifran esta información antes de almacenarla en servidores o compartirla entre computadoras.

Aplicaciones como TLS/SSL también usan estos métodos. Durante el protocolo de enlace, cuando el servidor envía su clave pública al cliente, este genera un secreto aleatorio de preintercambio y lo cifra con la clave pública del servidor. Luego, el servidor descifra este secreto de preintercambio con su clave privada. A continuación, tanto el servidor como el cliente generan de forma independiente el secreto maestro a partir del secreto de preintercambio y otros parámetros del protocolo de enlace.

Como usan los mismos parámetros, el cliente y el servidor generan el mismo secreto maestro, que la aplicación usa para generar las claves de sesión. Estas claves simétricas ayudan a cifrar y descifrar los datos durante la sesión, lo que garantiza una comunicación segura entre el servidor y el cliente. Este proceso aprovecha el cifrado asimétrico para compartir claves de forma segura y sin necesidad de confianza, y el cifrado simétrico para compartir claves de manera rápida y confiable.

Ambos métodos ayudan a mitigar los riesgos de seguridad que ponen en peligro los datos, como el acceso no autorizado, la interceptación y la manipulación, el robo y las violaciones de la privacidad. En esta guía, hablaremos sobre el cifrado simétrico y asimétrico, los implementaremos en Python y exploraremos sus prácticas recomendadas.

Requisitos previos

Para seguir este tutorial, necesitarás:

  • Conocimientos prácticos de Python

  • Una cadena de herramientas de Python (versión 3.7 o superior), incluido pip, instalada

  • Una cuenta de Amazon Web Services (AWS). Crear una cuenta y usar algunos servicios es gratis.

Comprender el cifrado simétrico

El cifrado simétrico usa la misma clave para cifrar y descifrar, por lo que es más rápido y eficiente que el cifrado asimétrico. Por lo general, sigue esta secuencia.

  1. Generación de claves: el remitente o un tercero de confianza genera una clave secreta y luego la comparte de forma segura con el destinatario previsto.

  2. Cifrado: el remitente aplica un algoritmo de cifrado simétrico, como el estándar de cifrado de datos (DES), el triple estándar de cifrado de datos (3DES) o el estándar de cifrado avanzado (AES), al mensaje de texto sin cifrar y a la clave secreta compartida. Este proceso convierte el texto sin cifrar en texto cifrado.

  3. Transmisión de datos: el remitente transmite el texto cifrado al destinatario a través de un canal inseguro, como Internet.

  4. Descifrado: el destinatario aplica el mismo algoritmo de cifrado simétrico en sentido inverso, con la clave compartida. Este proceso descifra el texto cifrado para recuperar el mensaje original en texto sin cifrar.

Por su mayor eficiencia y velocidad, el cifrado simétrico es preferible al asimétrico para tareas complejas, como cifrar archivos, bases de datos o incluso particiones de disco completas. Este método garantiza que, aunque estos datos almacenados se vean comprometidos, sigan siendo ilegibles y estén cifrados sin la clave adecuada.

Algoritmos de cifrado simétrico

Exploremos DES, 3DES y AES con más detalle, y veamos cómo el cifrado de sobre facilita la administración de claves.

Estándar de cifrado de datos (DES)

DES ha sido un algoritmo de cifrado simétrico popular desde la década de 1970. Usa una clave de 56 bits, lo que limita el conjunto de claves a 256 (2 elevado a la potencia de 56) claves posibles. DES fue bastante seguro durante unas dos décadas, pero ahora es fácil de vulnerar mediante ataques de fuerza bruta que aprovechan la potencia de cómputo moderna.

Estándar de cifrado de datos triple (3DES)

3DES es una versión mejorada de DES que usa tres claves DES. Ofrece un mayor nivel de seguridad, de 112 bits. Sin embargo, sigue siendo ineficiente porque la clave debe tener 168 bits para garantizar una seguridad de 112 bits.

Estándar de cifrado avanzado (AES)

AES se remonta a la década de 1990 y es el estándar moderno para el cifrado simétrico. Sus claves ofrecen niveles de seguridad de 128, 196 o 256 bits. La mayoría de las aplicaciones usan claves de 128 bits, ya que la diferencia de seguridad entre 128 y 256 bits es insignificante. AES es más rápido y seguro que 3DES.

Cifrado de sobre

Uno de los principales problemas del cifrado simétrico es la administración de claves. La filtración de una clave en el cifrado simétrico es desastrosa, ya que se usa la misma clave para cifrar y descifrar. El cifrado de sobre resuelve este problema. Usa una clave de cifrado de datos (DEK) y una clave de cifrado de claves (KEK). La DEK es la clave principal que la aplicación usa para cifrar los datos, mientras que la KEK cifra la DEK.

Este cifrado de dos capas ofrece seguridad adicional, ya que un ataque exitoso requeriría ambas claves. Los entornos de computación en la nube suelen usar el cifrado de sobre por su mayor seguridad, flexibilidad y escalabilidad. Como verás más adelante, los proveedores de nube suelen ofrecer interfaces útiles para usar el cifrado de sobre y proteger la clave maestra (KEK) de miradas indiscretas.

Implementar el cifrado simétrico en Python

Creemos una aplicación de Python para cifrar y descifrar con cifrado simétrico de sobre. AWS Key Management Service (KMS) ofrece cifrado de sobre para la administración de claves y AWS Encryption SDK para comunicarse con el servicio.

Primeros pasos

Para empezar, crea un directorio para tu proyecto:

$ mkdir encryption-demo && cd encryption-demo

Luego, sigue estos pasos para crear una clave KMS simétrica en tu panel de AWS. Esta clave KMS es tu clave maestra del cliente (CMK).

Configura los permisos de acceso de tu clave y copia el nombre de recurso de Amazon (ARN) desde la sección Configuración general del panel de la clave.

Consola de AWS Key Management Service que muestra el ARN de una clave administrada por el cliente, marcado con un círculo rojo en la sección Configuración general

El ARN es el identificador de tu CMK para interactuar con AWS Encryption SDK. Es la KEK que cifra la DEK generada.

Luego, instala AWS CLI y configúrala con el siguiente comando:

$ aws configure

Al configurar AWS CLI, asegúrate de que el perfil tenga los permisos adecuados para la CMK. Esta configuración permite que la aplicación se comunique correctamente con AWS KMS mediante las credenciales guardadas.

Crear el resto de la aplicación

Usaremos los paquetes aws-encryption-sdk y argparse para crear el resto de la aplicación. aws-encryption-sdk es una implementación de AWS Encryption SDK para Python. Instala estos paquetes con este comando de pip:

$ pip install aws-encryption-sdk argparse

Ahora, crea un archivo sym_encryptor.py y agrega este código para importar los módulos necesarios:

import aws_encryption_sdk
from aws_encryption_sdk.exceptions import GenerateKeyError
import argparse

Luego, agrega el siguiente código para crear las clases del cliente y del proveedor de claves:

client = aws_encryption_sdk.EncryptionSDKClient()

kms_key_provider = aws_encryption_sdk.StrictAwsKmsMasterKeyProvider(key_ids=[
    "<your-kms-ARN>"
])

La clase EncryptionSDKClient ofrece métodos de alto nivel para el cliente, como encrypt, decrypt y stream para cifrar datos. El código configura la clase StrictAwsKmsMasterKeyProvider con una lista de claves maestras de AWS KMS para cifrar y descifrar.

Pasa el identificador ARN de la CMK que creaste antes. Al pasar el ARN de la CMK, el código puede derivar una clave de la CMK para cifrar el texto sin cifrar.

aws-encryption-sdk genera, cifra y descifra automáticamente la clave de datos a partir de la CMK. Esta automatización simplifica la administración de claves.

Crear la función de cifrado

Agrega la siguiente función a tu script para crear la función de cifrado:

def encrypt(message):
    """
    Encrypts the passed message using the provided key.
    Returns the ciphertext of the message.
    """
    try:
        ciphertext, encryptor_header = client.encrypt(
            source=message,
            key_provider=kms_key_provider,
            encryption_context={
                'this is': 'not a secret',
                'but adds': 'some authentication'
            }
        )

        with open("encrypted.bin", "wb") as f:
            f.write(ciphertext)
        print("encryption complete")
    except GenerateKeyError:
        print("Error: data key generation from CMK failed, check ARN")

Esta función recibe el mensaje como datos binarios y lo cifra con el método encrypt() del cliente. El método encrypt recibe los datos que se cifrarán, la clase del proveedor de claves y el contexto de cifrado.

Al pasar la clase del proveedor de claves que creamos antes, el cliente genera una clave de cifrado de datos a partir de la CMK y cifra los datos. El cliente devuelve el texto cifrado y un encabezado del cifrador, que contiene información para verificar la autenticidad. El contexto de cifrado es un diccionario con información del encabezado del cifrador que devuelve el cliente.

Crear la función de descifrado

Agrega las siguientes líneas de código al script para crear la función de descifrado:

def decrypt(ciphertext):
    """
    Decrypts the passed ciphertext using the provided key.
    Returns the original decrypted message.
    """   
    try:
        original_text, decryptor_header = client.decrypt(
            source=ciphertext,
            key_provider=kms_key_provider,
        )

        with open("decrypted.bin", "wb") as f:
            f.write(original_text)
        print("decryption complete")
    except GenerateKeyError:
        print("Error: data key generation from CMK failed, check ARN")

Esta función recibe el texto cifrado y llama al método decrypt() del cliente, con el proveedor de claves y el texto cifrado como argumentos. El método decrypt funciona de forma similar al método encrypt. Deriva una clave de datos de la CMK configurada y revierte el cifrado al aplicar a los datos la misma clave y el mismo algoritmo. Este método devuelve el texto descifrado y un encabezado del descifrador, similar al encabezado del cifrador. En aplicaciones reales, estos encabezados ayudan a verificar los datos, ya que ambos contienen la misma información, incluido el conjunto de cifrado, el ARN y el contexto de cifrado.

Crear una aplicación de línea de comandos

Para facilitar las pruebas, convirtamos nuestra aplicación en una aplicación de línea de comandos mediante el análisis de los argumentos de línea de comandos. Agrega el siguiente código:

def parse_arguments():
    parser = argparse.ArgumentParser(description="Encrypt/Decrypt files")
    parser.add_argument("-i", metavar="[file]", type=str, required=False, help="file to encrypt/decrypt")

    group = parser.add_mutually_exclusive_group()
    group.add_argument("-e", "--encrypt", action="store_true", help="encrypt mode")
    group.add_argument("-d", "--decrypt", action="store_true", help="decrypt mode")

    args = parser.parse_args()
    return args

# Parse command-line arguments
args = parse_arguments()

file_name = args.i
if file_name:
    with open(file_name, "rb") as f:
        data = f.read()
    if args.encrypt:
        encrypt(data)
    elif args.decrypt:
        decrypt(data)
    else:
        print("must provide encryption/decryption mode: (-e/-d)")

Este código analiza los argumentos de línea de comandos. Define una opción para la clave y otras opciones para elegir entre los modos de cifrado y descifrado. Guarda el archivo y ejecuta el siguiente comando:

$ python sym_encryptor.py --help

El resultado es el siguiente:

usage: sym_encryptor.py [-h] [-i [file]] [-e | -d]

Encrypt/Decrypt files

options:
  -h, --help 	    show this help message and exit
  -i [file]  	    file to encrypt/decrypt
  -e, --encrypt  encrypt mode
  -d, --decrypt  decrypt mode

Probar la aplicación

Para probar la aplicación, primero crea un archivo de texto cualquiera, como el siguiente:

$ cat > test
Hello World!

Ejecuta el archivo con la aplicación y pasa el nombre del archivo y la opción del modo de cifrado -e.

$ python sym_encryptor.py -e -i test

Esta acción crea un archivo nuevo, encrypted.bin.

$ cat encrypted.bin

El resultado será similar al siguiente:

���/Oֶ7E.~RoZР�IT2ƺ�0r%...

Este archivo representa el texto cifrado que creó nuestra aplicación. Podemos enviar este archivo cifrado al destinatario. El destinatario u otras partes deben tener los permisos de acceso correctos de KMS para la CMK.

Descifrar el archivo

Para simular el proceso de descifrado, ejecuta el archivo cifrado con la aplicación:

$ python sym_encryptor.py -d -i encrypted.bin

Verás una notificación que dice decryption complete.

El código crea un archivo nuevo llamado decrypted.file en tu directorio, como se muestra a continuación:

$ cat decrypted.bin
Output:
Hello World!

Recuperamos correctamente el texto original después de cifrar y descifrar el mensaje con cifrado simétrico de sobre mediante AWS KMS.

Comprender el cifrado asimétrico

Mientras que el cifrado simétrico que exploramos usa la misma clave para cifrar y descifrar, el cifrado asimétrico usa un par de claves: una clave pública (que el usuario puede compartir públicamente por Internet u otros canales) y una clave privada (que debe mantener en secreto).

Seguridad y administración de claves

Aunque el cifrado simétrico suele ser más rápido y eficiente, el cifrado asimétrico resuelve las vulnerabilidades asociadas con compartir una clave de forma segura entre el remitente y el destinatario. Con el cifrado asimétrico, podemos compartir libremente la clave pública con cualquiera, incluso a través de canales inseguros, ya que la única forma de descifrar esos archivos es con la clave privada correspondiente. El destinatario mantiene esta clave en secreto.

Si Alice quiere recibir archivos cifrados de forma segura de Bob, debe generar un par de claves pública y privada y enviarle la clave pública a Bob. Cuando Bob recibe la clave pública, puede cifrar los archivos y transmitirlos por Internet. Alice, que tiene la clave privada, es la única persona que puede descifrarlos.

Si Alice luego quiere enviarle un archivo cifrado a Bob, él debe crear su propio par de claves pública y privada. Cuando le envía la clave pública a Alice, ella puede cifrar el archivo con esa clave y enviárselo a Bob. Luego, Bob usa su propia clave privada para descifrarlo.

Cada persona debe tener su propio par único de claves pública y privada para el cifrado asimétrico.

Casos de uso

Las aplicaciones utilizan principalmente el cifrado asimétrico para el intercambio seguro de claves en los protocolos TLS/SSL, la comunicación segura por correo electrónico con Pretty Good Privacy (PGP) y los certificados digitales que verifican la identidad del remitente o destinatario de un mensaje. El cifrado asimétrico ofrece un alto nivel de seguridad y elimina la necesidad de compartir claves de forma segura.

Algoritmos de cifrado asimétrico

Veamos algunos algoritmos populares de cifrado asimétrico para generar pares de claves, como RSA, ElGamal y Curve25519.

Rivest-Shamir-Adleman (RSA)

RSA es uno de los algoritmos de cifrado asimétrico más antiguos y populares. Se basa en la dificultad matemática de factorizar números compuestos grandes en sus factores primos.

La generación de claves en RSA selecciona dos números primos grandes, calcula el módulo y la función totiente de Euler, y deriva los componentes de las claves privada y pública. RSA está presente en prácticamente todas partes. Es sumamente seguro si se usan claves suficientemente grandes —de 2048 bits o más—, pero su costo computacional es mayor que el de otros algoritmos.

ElGamal

ElGamal se basa en resolver el problema del logaritmo discreto. Este algoritmo es más rápido que RSA, pero menos seguro, y requiere claves de mayor tamaño para ofrecer más seguridad. Para generar claves con ElGamal, se selecciona un grupo cíclico y un generador; luego, se calculan las claves pública y privada mediante exponenciación modular. El cifrado aleatoriza el texto sin formato y lo multiplica por la clave pública del destinatario.

Curve25519

Curve25519 es uno de los algoritmos de criptografía de curva elíptica (ECC) más rápidos y seguros. Sirve para intercambios de claves y firmas digitales. Sus algoritmos ECC ofrecen una seguridad sólida con claves más cortas que las de RSA.

ECC utiliza las propiedades matemáticas de las curvas elípticas sobre campos finitos. Para generar claves, se seleccionan una curva elíptica y un punto base, y luego se calculan las claves pública y privada mediante la multiplicación escalar en la curva.

ECC se utiliza principalmente en entornos con recursos limitados y en dispositivos como los de IoT y los sistemas blockchain. Es más eficiente desde el punto de vista computacional y mantiene niveles de seguridad similares a los de RSA.

Implementación del cifrado asimétrico en Python

Primero, crea un archivo asym_encryptor.py nuevo en el directorio de tu proyecto con el siguiente comando:

$ touch asym_encryptor.py

Importa las siguientes bibliotecas:

from nacl.public import PrivateKey, PublicKey, SealedBox
from nacl.exceptions import TypeError, CryptoError
import argparse

El módulo nacl.public contiene clases para generar pares de claves privadas y públicas, junto con métodos para gestionar el cifrado y el descifrado. Las clases PrivateKey y PublicKey inicializan las claves correspondientes a partir de una secuencia de bytes, mientras que SealedBox cifra y descifra mensajes dirigidos a un par de claves específico. El comando también importa las clases de excepción TypeError y CryptoError para manejar errores.

Creación de una función auxiliar

A continuación, crea una función auxiliar para generar pares de claves:

def generate_keys():
    """
    Generates a new key pair
    """
    private_key = PrivateKey.generate()
    public_key = private_key.public_key
    with open("prv.key", "wb") as f:
        f.write(private_key.encode())
    with open("pub.key", "wb") as f:
        f.write(public_key.encode())
    print("generated private/public key pair")

Con el algoritmo ECC Curve25519, esta función genera un objeto PrivateKey aleatorio mediante el método generate() y la clave pública correspondiente a esa clave privada. Luego, escribe las claves generadas en sus respectivos archivos.

Creación de una función para cifrar mensajes

Ahora, agrega la siguiente función para cifrar mensajes con la clave pública:

def encrypt(message, receiver_public_key):
    """
    Encrypts the given message with the public key.
    Returns the ciphertext of the message.
    """
    try:
        with open(receiver_public_key, "rb") as f:
            rpk = PublicKey(f.read())

        box = SealedBox(rpk)
        ciphertext = box.encrypt(message)

        with open("encrypted.bin", "wb") as f:
            f.write(ciphertext)
        print("public key encryption completed")
    except ValueError:
        print("Error: public key must be exactly 32 bytes long, check keys")

Esta función recibe un mensaje en texto sin formato codificado en binario y lo cifra; también recibe una cadena que indica la ubicación de la clave pública. Luego, carga e inicializa la clave pública con la clase PublicKey e inicializa un SealedBox con la clave pública.

Creación de la función de descifrado

PyNaCl admite el cifrado asimétrico mediante dos clases: Box y SealedBox. Box crea una clave compartida con la clave privada del remitente y la clave pública del destinatario para cifrar. Para descifrar, requiere claves privada y pública, lo que proporciona una prueba criptográfica de la autoría del remitente.

Usamos la clase SealedBox para crear la función de descifrado, que permite cifrar y descifrar con solo un par de claves y sin una prueba criptográfica de autoría. Inicializamos SealedBox con la clave pública para cifrar y llamamos al método encrypt() con el mensaje que queremos cifrar. Luego, escribimos el texto cifrado correspondiente en un archivo dentro del directorio de trabajo.

Agrega el siguiente código a la aplicación:

def decrypt(ciphertext, receiver_private_key):
    """
    Decrypts the given message with the private key.
    Returns the original decrypted message.
    """
    with open(receiver_private_key, "rb") as f:
        secret_key = PrivateKey(f.read())

    try:
        box = SealedBox(secret_key)
        decrypted_text = box.decrypt(ciphertext)

        with open("decrypted.file", "wb") as f:
            f.write(decrypted_text)
        print("private key decryption completed")
    except TypeError:
        print("Error: invalid ciphertext")
    except CryptoError:
        print("Error: decryption failed, make sure keys are correct")

Esta función recibe el texto cifrado que se va a descifrar y la clave privada. Carga e inicializa la clave privada con la clase PrivateKey e inicializa un SealedBox con la clave privada para descifrar. La función descifra el mensaje con el método decrypt() y luego guarda el texto descifrado en un archivo dentro del directorio de trabajo.

Agregar el análisis de argumentos de línea de comandos

Agrega el análisis de argumentos de línea de comandos con el siguiente código para que sea más fácil probar tu aplicación:

def parse_arguments():
    parser = argparse.ArgumentParser(description="Encrypt/Decrypt messages with Asymmetric Encryption")
    parser.add_argument("-i", metavar="[file]", type=str, required=False, help="file to encrypt/decrypt")
    parser.add_argument("-g", "--generate", action="store_true", help="generate keys")
    parser.add_argument("-p", metavar="[key]", type=str, required=False, help="key file")

    group = parser.add_mutually_exclusive_group()
    group.add_argument("-e", "--encrypt", action="store_true", help="encrypt mode")
    group.add_argument("-d", "--decrypt", action="store_true", help="decrypt mode")

    args = parser.parse_args()
    return args

# Parse command-line arguments
args = parse_arguments()

if args.generate:
    generate_keys()
else:
    file_name = args.i
    if file_name:
        with open(file_name, "rb") as f:
            data = f.read()
        key = args.p
        if key:
            if args.encrypt:
                encrypt(data, key)
            elif args.decrypt:
                decrypt(data, key)
            else:
                print("must provide encryption/decryption mode: (-e/-d)")
        else:
            print("provide key for encryption/decryption with -p flag")

Este código analiza los argumentos de línea de comandos y establece indicadores para elegir entre los modos de cifrado y descifrado, generar pares de claves y pasar archivos.

Guarda el archivo y ejecuta el siguiente comando:

$ python asym_encryptor.py --help

El resultado será el siguiente:

usage: asym_encryptor.py [-h] [-i [file]] [-g] [-p [key]] [-e | -d]

Encrypt/Decrypt messages with Asymmetric Encryption

options:
  -h, --help  	show this help message and exit
  -i [file]   	file to encrypt/decrypt
  -g, --generate  generate keys
  -p [key]    	key file
  -e, --encrypt   encrypt mode
  -d, --decrypt   decrypt mode

Prueba de la aplicación

Para probar la aplicación, crea un archivo de texto cualquiera, como el siguiente:

$ cat > test
Hello World!!!

Antes de procesar el archivo con el cifrado, usa el siguiente comando para generar pares de claves de prueba:

$ python asym_encryptor.py -g

El resultado es el siguiente:

generated private/public key pair

Este comando crea los pares de claves privada y pública dentro del directorio del proyecto.

Ahora, ejecuta el siguiente comando para cifrar el archivo de texto con la clave pública generada:

$ python asym_encryptor.py -e -p pub.key -i test

El resultado será:

public key encryption completed

La aplicación crea el texto cifrado y lo guarda como encrypted.bin en el directorio del proyecto. Este archivo cifrado es completamente ilegible. Solo se puede descifrar con la clave privada correspondiente a la clave pública, como se muestra a continuación:

$ python asym_encryptor.py -d -p prv.key -i encrypted.bin

El resultado es el siguiente: 

private key decryption completed

La aplicación ya guardó el archivo descifrado como decrypted.file en el directorio del proyecto. Lee el archivo descifrado con el siguiente comando:

$ cat decrypted.file

Al terminar, verás el resultado “Hello World!!!”. 

Ya ciframos y desciframos correctamente un archivo de texto sin formato con cifrado asimétrico.

Implicaciones de seguridad y prácticas recomendadas para el cifrado simétrico y asimétrico

Una desventaja importante del cifrado simétrico es la dificultad de compartir claves de forma segura. A medida que aumenta la cantidad de participantes en el sistema, también se vuelve más difícil distribuir las claves. Aunque el cifrado asimétrico evita este problema mediante pares de claves pública y privada, el cifrado simétrico utiliza métodos como el cifrado de sobres para alcanzar mayores niveles de seguridad.

Estas son algunas prácticas recomendadas para el cifrado simétrico y asimétrico:

  • Aprovecha las herramientas de proveedores como Google Cloud Platform (GCP) o AWS para gestionar claves en aplicaciones que usan claves simétricas, como AWS KMS.

  • Si es posible, evita el cifrado RSA para preparar tus aplicaciones para el futuro. Entre sus riesgos de seguridad se incluyen las claves demasiado pequeñas —de menos de 2048 bits—, que los hackers pueden descifrar, y los parámetros de inicialización deficientes. Implementar RSA correctamente es difícil.

  • Elige el cifrado simétrico para archivos muy grandes. Tiene un mejor rendimiento que las soluciones asimétricas.

  • Al elegir claves, selecciona un tamaño adecuado para el algoritmo de cifrado. Las claves demasiado pequeñas dejan vulnerabilidades. No uses algoritmos inseguros como DES.

  • No desarrolles tus propias soluciones criptográficas: es fácil cometer errores.

Usa herramientas como Snyk para detectar problemas de seguridad en tu código y obtener recomendaciones. La plataforma de Snyk te permite analizar, corregir y priorizar vulnerabilidades de seguridad en tu código, dependencias de código abierto, imágenes de contenedores y configuraciones de infraestructura como código (IaC).

Ten en cuenta estos factores al decidir qué tipo de cifrado usar, ya que cada técnica tiene sus ventajas y desventajas. En la práctica, puedes combinar el cifrado simétrico y el asimétrico para equilibrar la eficiencia y la seguridad.

Uso de Snyk

Para descubrir cómo Snyk puede encontrar vulnerabilidades durante el desarrollo, usemos la herramienta para probar nuestro código.

Primero, crea una cuenta de Snyk. Empezar es gratis.

Sección principal del sitio web de Snyk que promociona la seguridad centrada en desarrolladores, con una interfaz de análisis de vulnerabilidades y una ilustración estilizada de un perro

Después de registrarte, Snyk te dirige a la siguiente página, donde te pregunta dónde está el código que quieres analizar: en GitHub, en Bitbucket Cloud o mediante una CLI.

Pantalla de configuración de Snyk que muestra opciones de integración con GitHub, Bitbucket Cloud y CLI, con GitHub seleccionado.

Selecciona CLI y haz clic en Next step.

En la siguiente pantalla, sigue cualquiera de los pasos indicados para instalar la CLI de Snyk y luego haz clic en Next step:

Pantalla de instalación de Snyk CLI que muestra la descarga del ejecutable y las instrucciones de la línea de comandos para macOS, Windows y Linux.

A continuación, ejecuta el siguiente comando para autenticar tu equipo:

$ snyk auth

Este comando abre una ventana del navegador y te pide que inicies sesión. Cuando completes el proceso, la CLI de Snyk mostrará un mensaje para confirmar que la autenticación se realizó correctamente.

Terminal que muestra que la autenticación de Snyk se completó y un token de URL de inicio de sesión difuminado.

Ahora haz clic en Next step.

Guía de análisis de seguridad de Snyk que muestra instrucciones para analizar código fuente y el comando `snyk code test`.

Haz clic en Source code y sigue el enlace Settings > Snyk Code hasta el panel. Activa la opción Enable Snyk Code en el panel para ejecutar la CLI de Snyk en tu código. Luego, haz clic en Save changes.

Página de configuración de la organización de Snyk Code que muestra la función activada y los pasos para agregar proyectos, analizar código y obtener resultados.

Para probar tu código, ejecuta el siguiente comando en el directorio del proyecto:

$ snyk code test

Este comando carga automáticamente tus archivos de código y los analiza en busca de vulnerabilidades:

Terminal que muestra los resultados del análisis estático de código con seis problemas de recorrido de rutas de gravedad media en archivos de cifrado de Python.

La captura de pantalla anterior muestra que nuestra aplicación tiene una vulnerabilidad de recorrido de rutas que permite a un atacante leer archivos arbitrarios. Podemos dejar esta vulnerabilidad en el código de nuestra aplicación de demostración, pero representa un vector de ataque en bases de código más funcionales.

Hemos usado Snyk con éxito para analizar nuestro proyecto en busca de vulnerabilidades.

Resumen

El cifrado simétrico y el asimétrico se diferencian en la forma en que usan las claves para cifrar y descifrar archivos. El primero usa una única clave compartida; el segundo, un par de claves pública y privada.

Gracias a su implementación y eficiencia computacional, el cifrado simétrico es más adecuado para cifrar grandes volúmenes de datos en reposo. El cifrado asimétrico es adecuado para transmitir pequeñas cantidades de datos, como en TLS/SSL y los certificados digitales.

En esta guía, implementamos el cifrado de sobres (una combinación de cifrado simétrico y asimétrico) con AWS Encryption SDK. También implementamos el cifrado y descifrado asimétricos con la biblioteca de Python pynacl. Durante el proceso, exploramos las ventajas y desventajas de ambos tipos de cifrado para tamaños de clave más pequeños. También demostramos cómo aprovechar plataformas como Snyk para analizar las aplicaciones en busca de vulnerabilidades.

Ahora que sabes más sobre el cifrado, puedes usar estos métodos para proteger mejor tus aplicaciones y a quienes las usan. Después, usa Snyk para asegurarte de que tu enfoque sea seguro.

Leer más

Blog

Los modelos de frontera encontraron las vulnerabilidades. Solo el atacante encontró las cadenas.

El análisis estático encontró las fallas, pero solo las pruebas de ataque en vivo demostraron cómo podían encadenarse para provocar brechas. Una comparación de Evo COS, Claude Security y Claude Code Security.

feature insights context
Blog

Los ataques autónomos ya están aquí. La defensa debe estar a su altura.

Los atacantes autónomos están reduciendo el tiempo disponible para defenderse. Descubre cómo el descubrimiento, la corrección, la validación y la prevención continuos pueden ayudar a los equipos de seguridad a seguirles el ritmo.

Blog

Por qué los agentes de programación con IA siguen generando fallas de control de acceso

Los agentes de programación con IA pueden generar lógica de autorización que compila y supera la revisión, pero expone los datos de un inquilino a otro. Descubre por qué es difícil detectar el control de acceso roto y cómo prevenirlo.