Read in English · Lire en français · Auf Deutsch lesen
Sección 8.4 de 8.8 · Avanzado · 26 min de lectura
Cifrado, gestión de claves y secretos
Videolección
5 min · narrado en inglés, con subtítulosSolo escuchar (audio)
Leer la transcripción
Decir que los datos están cifrados en tránsito y en reposo esconde la pregunta que importa: ¿cifrados frente a quién? Esta lección muestra cómo deciden los arquitectos qué cifrar, dónde y con qué claves.
Piensa en un hotel. Los objetos de valor de los huéspedes van en cajas fuertes en las habitaciones, y las cajas fuertes solo son tan buenas como el control sobre quién tiene los códigos. La llave maestra está en un armario cerrado con llave que solo puede abrir el director, y cada vez que se abre queda anotado en un registro. Los objetos más valiosos el hotel no los guarda en absoluto. El huésped recibe un resguardo numerado, y el banco de la esquina custodia el objeto. Proteger los datos funciona igual.
Cada capa de cifrado protege frente a unos actores y no frente a otros. TLS protege los datos en la red, pero un servicio comprometido sigue viéndolos en texto en claro. El cifrado del almacenamiento protege los discos robados, los snapshots y las copias de seguridad, pero no frente a cualquiera que pueda ejecutar consultas, incluido un atacante que use inyección SQL. El cifrado a nivel de campo, que hace la aplicación, protege frente a los administradores de bases de datos, las cuentas con permisos demasiado amplios y las copias para análisis, porque solo contienen datos cifrados. Pero la base de datos ya no puede buscar ni ordenar por ese campo. En todos los casos, la protección es exactamente tan fuerte como el control sobre la clave. El cifrado traslada el problema del acceso de los datos a las claves, donde es más fácil de gestionar.
Confundir las herramientas criptográficas provoca defectos de diseño. Un hash criptográfico es una huella unidireccional sin clave. No puede demostrar quién envió algo. Un código de autenticación de mensajes usa un secreto compartido para demostrar que un mensaje procede de alguien que tiene la clave, como el webhook de un proveedor de pagos. Una firma digital permite que cualquiera que tenga la clave pública compruebe de dónde proceden los datos, sin poder falsificarla. Las contraseñas necesitan un hash deliberadamente lento y con sal, como Argon2id, para que cada intento le cueste tiempo real al atacante. Mejor aún, deja que un proveedor de identidad ofrezca passkeys y no guardes ninguna contraseña.
Las claves las custodia un servicio de gestión de claves. Sus claves maestras, llamadas claves de cifrado de claves, viven en módulos de seguridad de hardware y nunca salen de ellos. Cada uso se comprueba con una política y se registra. El cifrado de sobre aprovecha esto sin enviar datos voluminosos al servicio. El servicio de pedidos pide una clave de datos nueva y la recibe dos veces: en claro y envuelta con la clave maestra. Cifra el registro localmente, desecha la clave de datos en claro y guarda juntos el texto cifrado y la clave envuelta en una sola fila. Más adelante, para leer el registro, envía solo la pequeña clave envuelta para que la desenvuelvan, y eso se comprueba y se registra. Esto abarata la rotación: solo se vuelven a envolver las claves de datos. Y destruir una clave maestra hace ilegible cada copia, incluidas las copias de seguridad y los logs de eventos. Eso se llama crypto-shredding. El precio es una dependencia crítica del servicio de claves.
Un secreto es cualquier credencial que da acceso. Los secretos nunca viven en el código fuente, en las imágenes de contenedor ni en la configuración de un repositorio. Una vez en el historial de un repositorio, un secreto se queda ahí. Su sitio es una bóveda que registra cada acceso. Mejor aún son las credenciales de corta duración que emite la bóveda, o la identidad de carga de trabajo, sin ningún secreto almacenado. Si se filtra un secreto, revócalo o rótalo primero. Borrar el commit no sirve de nada, porque ya existen copias. La tokenización sustituye un valor sensible por un token que no tiene ninguna clave con la que revertirlo. Con los campos de pago alojados, los números de tarjeta van directamente al proveedor de pagos. Los datos de tarjeta más baratos de proteger son los que nunca guardas.
Veamos las decisiones en la plataforma de reparto de comida. TLS y el cifrado del almacenamiento ya están en todas partes. Los números de tarjeta no se guardan nunca. Las contraseñas ceden el paso, en su mayoría, a las passkeys a través del proveedor de identidad. Las direcciones son confidenciales: están protegidas con el cifrado del almacenamiento, enmascaradas en la herramienta de soporte y reducidas a distritos postales en el almacén de datos. Los datos bancarios para los pagos a restaurantes están restringidos, así que llevan cifrado a nivel de campo con su propia clave, que solo el proceso de pagos a restaurantes puede desenvolver. Los pocos campos personales de los eventos usan una clave por cliente. Destruir esa clave los borra, incluso de un log que nunca se modifica. Y las copias de seguridad usan una clave aparte en una cuenta aparte. Fíjate en que dos decisiones eliminan datos en lugar de protegerlos. Esa es siempre la opción más fuerte.
La sección completa incluye el esquema de clasificación de datos de cuatro niveles, una lista de comprobación para secretos filtrados y mucho más. A continuación, en la sección ocho punto cinco, vemos zero trust. Nos vemos allí.
Lo que necesitas saber
- Cada capa de cifrado protege frente a actores concretos: TLS frente a la red, el cifrado del almacenamiento frente al robo de soportes y copias de seguridad, el cifrado a nivel de campo frente a los administradores de bases de datos y las copias posteriores; la protección siempre se reduce al control de las claves.
- Los algoritmos simétricos (AES-GCM) cifran grandes volúmenes de datos; la criptografía asimétrica proporciona acuerdo de claves y firmas digitales; los primeros estándares poscuánticos del NIST (FIPS 203 a 205, 2024) convierten la agilidad criptográfica (crypto agility) en una inquietud arquitectónica.
- El hash, los MAC, las firmas, el cifrado y la codificación son herramientas distintas; las contraseñas necesitan funciones de hash de contraseñas lentas y con sal (salt), como Argon2id con los parámetros actuales de OWASP o, mejor aún, passkeys a través de un proveedor de identidad.
- El cifrado de sobre envuelve claves de datos por registro bajo una clave de cifrado de claves guardada en un KMS respaldado por HSM, lo que abarata la rotación, limita el radio de impacto y permite el crypto-shredding, a costa de una dependencia crítica.
- Los secretos deben estar en una bóveda (vault), preferiblemente como credenciales dinámicas de corta duración o sustituidos por la identidad de carga de trabajo; un secreto filtrado debe revocarse primero y limpiarse después.
- La tokenización a través de un proveedor de pagos mantiene los números de tarjeta fuera de la plataforma y reduce el alcance de PCI DSS v4.0.1; un esquema de clasificación de datos decide dónde compensa el costo del cifrado a nivel de campo.
Qué protege el cifrado y qué no
El cifrado se trata a menudo como una casilla que marcar: "los datos están cifrados en tránsito y en reposo". La frase esconde la pregunta que importa, que es frente a quién. Cada capa de cifrado protege los datos frente a unos actores y no frente a otros, y en todos los casos la protección es exactamente tan fuerte como el control sobre quién puede usar la clave. El cifrado no elimina el problema del control de acceso; lo traslada de los datos a las claves, donde normalmente es más fácil gestionarlo, auditarlo y revocarlo.
El cifrado en tránsito protege los datos que se mueven por una red para que no se lean ni se alteren por el camino. En la web eso significa TLS, presentado en el Capítulo 0; entre servicios significa TLS o TLS mutuo, que se tratan junto con zero trust. El cifrado en reposo protege los datos almacenados, pero "en reposo" no es una sola cosa: la tabla muestra las capas habituales en la plataforma de reparto de comida.
Capas de cifrado y las amenazas que aborda cada una
| Capa | Protege frente a | No protege frente a |
|---|---|---|
| TLS en tránsito | Escuchas y manipulaciones en la red, incluso dentro del centro de datos. | Un servicio o un endpoint comprometido, que ve los datos en texto en claro. |
| Cifrado de disco o de volumen (por defecto en las principales nubes) | Discos robados o desechados, hardware devuelto al proveedor. | Cualquiera que llegue a los datos a través del sistema operativo o la base de datos en ejecución. |
| Cifrado de la base de datos o del servicio de almacenamiento (por ejemplo, el cifrado de datos transparente) | Copias de archivos de datos, snapshots y copias de seguridad hechas en la capa de almacenamiento. | Cualquier cuenta de la base de datos que pueda ejecutar consultas, incluida la de la propia aplicación y la de un atacante que use inyección SQL. |
| Cifrado a nivel de aplicación (a nivel de campo) | Los administradores de bases de datos, las cuentas con permisos demasiado amplios, las copias para análisis y las copias de seguridad filtradas, porque solo contienen texto cifrado. | La propia aplicación si está comprometida, ya que puede usar la clave; la base de datos ya no puede buscar ni ordenar por ese campo. |
| Cifrado de extremo a extremo | Todos los intermediarios, incluido el operador de la plataforma. | Nada intermedio, pero entonces la plataforma no puede hacer nada útil con los datos. |
Al leer la tabla de arriba abajo, cada capa protege frente a más actores y cuesta más funcionalidad. Un buen diseño usa las capas baratas y transparentes en todas partes (hoy TLS y el cifrado del almacenamiento son casi gratuitos) y las caras de forma selectiva, para los datos cuya exposición haría más daño. Decidir qué datos son esos es tarea de la clasificación de datos, que se trata más adelante en esta sección junto con la tokenización y un ejemplo práctico.
Criptografía simétrica y asimétrica
El cifrado simétrico usa una única clave secreta para cifrar y descifrar. Es lo bastante rápido para grandes volúmenes de datos, y el algoritmo estándar es AES (FIPS 197, 2001) con claves de 128 o 256 bits. Los diseños modernos usan cifrado autenticado, que detecta la manipulación además de ocultar el contenido: AES en modo Galois/Counter (AES-GCM) o ChaCha20-Poly1305 (RFC 8439). Los modos autenticados necesitan un nonce único para cada mensaje cifrado con la misma clave; reutilizar un nonce con AES-GCM puede revelar el texto en claro y permitir falsificaciones, que es una de las muchas razones para usar bibliotecas bien probadas en lugar de ensamblar las primitivas por tu cuenta.
La criptografía asimétrica usa un par de claves: una clave pública que cualquiera puede tener y una clave privada que se mantiene en secreto. Permite dos cosas que la criptografía simétrica no puede hacer. El acuerdo de claves permite que dos partes que nunca se han visto establezcan una clave simétrica compartida a través de una red abierta (Diffie-Hellman de curva elíptica en TLS 1.3). Las firmas digitales (RSA, ECDSA, Ed25519) permiten que cualquiera que tenga la clave pública verifique que los datos proceden del titular de la clave privada y no se han modificado, lo que proporciona integridad, autenticidad y una base para el no repudio. Las operaciones asimétricas son lentas, así que los protocolos reales son híbridos: TLS usa la criptografía asimétrica para autenticar al servidor y acordar las claves, y después el cifrado simétrico para los datos.
Una computadora cuántica grande rompería los algoritmos RSA y de curva elíptica actuales, aunque no AES con claves suficientemente largas. En agosto de 2024, el NIST publicó sus primeros estándares poscuánticos: FIPS 203 (ML-KEM, para el establecimiento de claves), FIPS 204 (ML-DSA) y FIPS 205 (SLH-DSA), ambos para firmas. Los datos que deben seguir siendo confidenciales durante muchos años ya están en riesgo hoy por los atacantes que graban ahora el tráfico cifrado para descifrarlo más adelante, así que la respuesta arquitectónica es la agilidad criptográfica (crypto agility): mantener un inventario de dónde se usa cada algoritmo, evitar codificarlos de forma fija y preferir bibliotecas, protocolos y proveedores que puedan cambiar de algoritmo, como han empezado a hacer los principales navegadores y bibliotecas TLS con el intercambio de claves poscuántico híbrido.
El hash, los MAC, las firmas y el cifrado son herramientas distintas
Confundir estas primitivas es una fuente habitual de defectos de diseño, como "cifrar" las contraseñas para poder descifrarlas, o confiar en un hash simple para demostrar que un webhook procede de un proveedor de pagos. La tabla las pone una al lado de otra.
Elegir la primitiva adecuada
| Herramienta | ¿Reversible? | Clave | Úsala para | Ejemplo |
|---|---|---|---|---|
| Codificación (Base64, hex) | Sí, por cualquiera | Ninguna | Representar bytes como texto. No proporciona ninguna seguridad. | La carga útil de un JWT |
| Hash criptográfico (SHA-256) | No | Ninguna | Huellas digitales, integridad de los archivos frente a cambios accidentales, direccionamiento por contenido. MD5 y SHA-1 están rotos en cuanto a la resistencia a colisiones. | Suma de comprobación de una versión descargada |
| Código de autenticación de mensajes (HMAC-SHA-256) | No | Secreto compartido | Demostrar que un mensaje procede de alguien que tiene la clave y que no se ha modificado. | Verificar el webhook de un proveedor de pagos |
| Firma digital (Ed25519, ECDSA) | No (se verifica) | La clave privada firma y la pública verifica | Prueba de origen que cualquiera puede comprobar sin poder falsificarla. | Tokens de acceso JWT, imágenes de contenedor firmadas |
| Cifrado (AES-GCM) | Sí, con la clave | Secreta (o un par de claves, en los esquemas híbridos) | Confidencialidad, más integridad en los modos autenticados. | El documento de identidad de un repartidor almacenado |
| Hash de contraseñas (Argon2id) | No, y deliberadamente lento | Sal por contraseña, pimienta opcional | Guardar contraseñas para que una base de datos robada resista los intentos de adivinarlas. | El almacén de credenciales del proveedor de identidad |
Almacenamiento de contraseñas
Un hash de uso general como SHA-256 está diseñado para ser rápido, que es justo lo contrario de lo que necesitan las contraseñas: los procesadores gráficos pueden probar miles de millones de intentos por segundo contra una tabla robada de hashes rápidos. El hash de contraseñas usa funciones deliberadamente lentas y, idealmente, exigentes en memoria (memory-hard), para que cada intento le cueste al atacante tiempo y memoria reales, con una sal (salt) aleatoria y única por contraseña, para que contraseñas idénticas produzcan hashes distintos y las tablas precalculadas no sirvan de nada.
La OWASP Password Storage Cheat Sheet da las recomendaciones actuales por orden de preferencia. Argon2id (una variante de Argon2, ganador de la Password Hashing Competition de 2015), con un mínimo de 19 MiB de memoria, dos iteraciones y un grado de paralelismo (o un compromiso equivalente, como 46 MiB con una iteración). scrypt donde Argon2id no esté disponible, con un parámetro de costo de 217 (128 MiB), un tamaño de bloque de 8 y un paralelismo de 1. bcrypt solo para sistemas heredados, con un factor de trabajo de al menos 10, recordando que la mayoría de las implementaciones ignoran la entrada que supera los 72 bytes. Donde se exija el cumplimiento de FIPS 140, PBKDF2 con HMAC-SHA-256 y 600 000 iteraciones. Estas cifras suben a medida que mejora el hardware, así que consulta la cheat sheet vigente en lugar de copiar números en un documento de diseño.
De aquí se derivan tres puntos de diseño. Guarda el algoritmo y los parámetros con cada hash (los formatos codificados estándar lo hacen), para poder aumentar los parámetros más adelante: cuando un usuario inicia sesión correctamente, verifica con el hash antiguo y vuelve a calcular el hash de inmediato con los parámetros nuevos. Considera una pimienta (pepper), un secreto que se añade a cada contraseña antes de calcular el hash y que se guarda en una bóveda o un HSM en lugar de en la base de datos, lo que frustra a un atacante que solo robe la base de datos. Y lo más importante: pregúntate si deberías guardar contraseñas en absoluto: delegar la autenticación en un proveedor de identidad y ofrecer passkeys elimina de la mayoría de tus servicios el secreto más atacado.
Gestión de claves y cifrado de sobre
Las claves tienen un ciclo de vida, descrito en NIST SP 800-57 Part 1: generación (a partir de una fuente aleatoria adecuada), almacenamiento, distribución, uso, rotación al final de un criptoperiodo definido, revocación si se comprometen y destrucción. Hacer todo eso de forma segura a mano no es práctico, y por eso las arquitecturas se apoyan en un servicio de gestión de claves (KMS) como AWS KMS, Azure Key Vault o Google Cloud KMS, o en un sistema autogestionado como HashiCorp Vault. Un KMS guarda las claves maestras dentro de módulos de seguridad de hardware (HSM), dispositivos resistentes a la manipulación validados según FIPS 140, y realiza operaciones con esas claves cuando se le solicitan, sujetas a una política de acceso, de modo que las aplicaciones nunca ven las claves maestras y cada uso queda registrado.
Enviar cada registro al KMS para cifrarlo sería lento y caro, y las API de KMS limitan el tamaño de las solicitudes. El cifrado de sobre resuelve esto. La aplicación le pide al KMS una clave de cifrado de datos (DEK) nueva; el KMS la devuelve dos veces, en texto en claro y envuelta (cifrada) con una clave de cifrado de claves (KEK) que nunca sale del HSM. La aplicación cifra los datos localmente con la DEK en claro, borra la DEK de la memoria y guarda el texto cifrado junto con la DEK envuelta. Para descifrar, envía solo la pequeña DEK envuelta al KMS, que comprueba el permiso de quien llama, registra la solicitud y devuelve la DEK.
import os
from cryptography.hazmat.primitives.ciphers.aead import AESGCM
def encrypt_field(plaintext: bytes, kms, kek_id: str, context: bytes) -> dict:
dek = AESGCM.generate_key(bit_length=256) # fresh data key
nonce = os.urandom(12) # never reuse with this key
ct = AESGCM(dek).encrypt(nonce, plaintext, context) # context binds it to its row
wrapped = kms.encrypt(key_id=kek_id, plaintext=dek) # KEK stays inside the KMS
return {"ct": ct, "nonce": nonce, "wrapped_dek": wrapped, "kek": kek_id}
def decrypt_field(rec: dict, kms, context: bytes) -> bytes:
dek = kms.decrypt(key_id=rec["kek"], ciphertext=rec["wrapped_dek"]) # checked, logged
return AESGCM(dek).decrypt(rec["nonce"], rec["ct"], context)El cifrado de sobre tiene varias ventajas arquitectónicas. La rotación es barata: rotar una KEK crea una nueva versión de la clave para las nuevas operaciones de envoltura, mientras que las versiones antiguas siguen disponibles para descifrar; las DEK existentes pueden volver a envolverse sin tocar los datos, y solo hace falta volver a cifrarlo todo si una DEK puede haber quedado expuesta. El radio de impacto es limitado: con una DEK por registro, archivo o partición, una DEK filtrada expone poco. La separación de funciones se vuelve posible: el servicio de pedidos puede usar su KEK para desenvolver, pero no cambiar su política ni borrarla, mientras que los administradores de seguridad pueden gestionar las claves, pero no descifrar los datos. Las jerarquías de claves se corresponden con la organización: una KEK por servicio y clase de datos, o por cliente (tenant), de modo que una gran cadena de restaurantes podría incluso aportar y controlar su propia clave. Y destruir una clave es una herramienta poderosa: el crypto-shredding hace ilegible cada copia de los datos cifrados con ella, incluidas las copias de seguridad y los logs de eventos inmutables, lo que importa para el supresión según el RGPD (GDPR) y para los sistemas basados en event sourcing.
El precio es una nueva dependencia crítica. Si el KMS no está disponible, los datos cifrados no pueden leerse; si una clave se borra por error, los datos se pierden para siempre. Por eso los KMS en la nube imponen un periodo de espera antes del borrado, y los arquitectos deberían tratar el borrado de claves y los cambios en las políticas de claves como operaciones privilegiadas, registradas y de dos personas, guardar en caché brevemente las DEK desenvueltas donde importe la latencia de las llamadas al KMS e incluir el KMS en los planes de recuperación ante desastres.
Gestión de secretos
Un secreto es cualquier credencial que da acceso: contraseñas de bases de datos, claves de API del proveedor de pagos, claves privadas, claves de firma, secretos de cliente de OAuth, secretos de webhooks. La gestión de secretos parte de una regla: los secretos nunca viven en el código fuente, ni en imágenes de contenedor, ni en archivos de configuración confirmados en repositorios, porque estos se copian, se guardan en caché, se bifurcan y los leen muchas más personas y sistemas de los que deberían acceder al secreto. Una vez que está en el historial de un repositorio, un secreto permanece ahí aunque se borre la línea.
Los secretos deben estar en una bóveda (vault) (HashiCorp Vault, AWS Secrets Manager, Azure Key Vault, Google Secret Manager) que los guarde cifrados, los entregue solo a cargas de trabajo autenticadas según la política, registre cada acceso y admita la rotación. Mejor que rotar secretos de larga duración es no tenerlos: una bóveda puede emitir secretos dinámicos, como una cuenta de base de datos creada para una instancia de servicio con una vigencia (lease) de una hora, y la identidad de carga de trabajo permite que los servicios se autentiquen ante las API de la nube y entre sí sin ningún secreto almacenado. Los secretos inyectados en tiempo de ejecución deberían leerse de archivos o de la API de la bóveda en lugar de variables de entorno visibles para todo el mundo, que tienden a acabar en volcados de memoria por fallos y en logs de depuración.
La prevención necesita automatización, porque las personas se equivocan. Los hooks de pre-commit y los escáneres del pipeline (como gitleaks y detect-secrets) detectan los secretos antes de que se suban; los servicios de alojamiento de repositorios buscan formatos de secretos conocidos, y la protección de push (push protection) de GitHub bloquea los push que los contienen. Los atacantes escanean los repositorios públicos a los pocos minutos de cada push. Las consecuencias están bien documentadas: en 2016, unos atacantes que lograron acceder a un repositorio privado de GitHub usado por ingenieros de Uber encontraron allí una clave de acceso al almacenamiento en la nube de Uber y descargaron datos personales de unos 57 millones de pasajeros y conductores.
Lista de comprobación: cuando se ha filtrado un secreto
Trata como comprometido cualquier secreto que haya llegado a un repositorio, un log, un ticket o un chat, sea o no privado el repositorio.
- Revoca o rota el secreto de inmediatoHaz esto primero. Borrar el commit o el mensaje no sirve de nada: los clones, las bifurcaciones (forks), las cachés y los escáneres ya lo tienen.
- Determina a qué podía accederEnumera los sistemas, los datos y los permisos que concedía el secreto, y cualquier otro secreto al que se pueda llegar desde allí.
- Revisa el uso desde la exposiciónRevisa los registros de acceso del proveedor y de la bóveda en busca de usos desde identidades, direcciones u horas inesperadas desde que apareció el secreto por primera vez.
- Contén y limpiaRota las credenciales dependientes, invalida las sesiones y los tokens emitidos con él y, después, elimina el secreto del historial y de las cachés (después de rotarlo, no en lugar de rotarlo).
- Decide sobre la notificaciónSi es posible que se haya accedido a datos personales, inicia la evaluación de la brecha; según el RGPD, el plazo para notificar a la autoridad de control empieza a contar cuando tienes conocimiento de ella.
- Corrige la causaTraslada el secreto a una bóveda, sustitúyelo por la identidad de carga de trabajo o por un secreto dinámico, y activa el escaneo de secretos y la protección de push para que el mismo error quede bloqueado la próxima vez.
Tokenización y reducción del alcance de PCI DSS
La tokenización sustituye un valor sensible por un token que no tiene ninguna relación matemática con él; el valor real se guarda en una bóveda aparte, muy protegida, y solo la bóveda puede volver a asociar el token con su valor. A diferencia del cifrado, un token robado no puede revertirse con una clave, porque no hay clave, solo una consulta en un sistema que el atacante no controla.
Su uso más importante son los pagos con tarjeta. El Payment Card Industry Data Security Standard (PCI DSS, actualmente en la versión 4.0.1, publicada en junio de 2024) se aplica a todo componente del sistema que almacene, procese o transmita datos del titular de la tarjeta, o que esté conectado a esos componentes o pueda afectar a su seguridad. Una plataforma que deja pasar los números de tarjeta por sus servidores mete en el alcance su API gateway, sus servicios, sus logs, sus redes y sus administradores, con cientos de requisitos y una evaluación anual. Una plataforma que usa los campos de pago alojados o la redirección del proveedor de pagos, de modo que los números de tarjeta van directamente del dispositivo del cliente al proveedor, solo recibe un token y quizá los cuatro últimos dígitos, y su alcance de PCI DSS se reduce drásticamente: un comercio más pequeño puede optar al cuestionario de autoevaluación más breve, e incluso los comercios más grandes, que siguen necesitando una evaluación anual por parte de un evaluador cualificado, tienen muchos menos sistemas que evaluar. Este es el diseño del modelo de amenazas del proceso de pago: los datos de tarjeta más baratos de proteger son los que nunca guardas. Cifrar tú mismo los números de tarjeta no consigue la misma reducción, porque quien pueda descifrarlos sigue dentro del alcance.
La misma idea sirve para otros identificadores sensibles. Un servicio interno de tokenización puede sustituir los números de la seguridad social o los números de pasaporte por tokens en toda la plataforma, de modo que solo un servicio pequeño y muy protegido vea alguna vez los valores reales.
Clasificación de datos
Las decisiones sobre cifrado, tokenización, logging, conservación y acceso dependen de saber qué datos son sensibles y en qué medida. Un esquema de clasificación de datos establece unos pocos niveles con reglas de tratamiento asociadas, para que los equipos no decidan cada caso desde cero. Lo habitual son cuatro niveles; lo que importa es que cada conjunto de datos del catálogo de datos o del esquema de la plataforma lleve un nivel, y que las reglas se apliquen mediante plantillas y comprobaciones, no de memoria.
Un esquema de clasificación de datos para la plataforma de reparto de comida
| Nivel | Ejemplos | Reglas de tratamiento |
|---|---|---|
| Público | Cartas, precios, horarios de apertura de los restaurantes | Solo protección de la integridad; puede guardarse en caché en cualquier lugar. |
| Interno | Cifras de ventas agregadas, configuración de servicios sin secretos | Solo personal y servicios; no en logs públicos. |
| Confidencial | Nombres, direcciones, números de teléfono e historiales de pedidos de los clientes, ubicaciones de los repartidores | TLS y cifrado del almacenamiento; acceso con mínimo privilegio; enmascarado en las herramientas de soporte; minimizado en los análisis; límites de conservación. |
| Restringido | Datos bancarios para los pagos a restaurantes, documentos de identidad de los repartidores, secretos, tokens de pago | Todo lo anterior, más cifrado a nivel de campo con una clave dedicada, acceso solo por servicios designados y registro de cada acceso. |
Cifrado a nivel de campo
El cifrado a nivel de campo, la capa a nivel de aplicación de la primera tabla, cifra campos individuales antes de escribirlos, normalmente con cifrado de sobre y una KEK por clase de datos. Su fortaleza es que todo lo que hay después de la aplicación solo contiene texto cifrado: los administradores de bases de datos, las réplicas de lectura, las copias de seguridad y el almacén de datos (data warehouse) alimentado por captura de datos de cambios. Una brecha en cualquiera de ellos no expone nada legible, y el acceso al texto en claro se reduce a los servicios que pueden llamar al KMS con esa clave, y cada llamada queda registrada.
Sus costos son reales. La base de datos ya no puede indexar, buscar, ordenar ni hacer joins por el campo cifrado. Las búsquedas por igualdad pueden recuperarse con un índice ciego (blind index), una columna aparte que guarda un hash con clave (HMAC) del valor normalizado, a cambio de revelar qué filas comparten un valor. El cifrado determinista tiene la misma fuga, mientras que las consultas por rango necesitan esquemas especializados o, simplemente, no deberían hacerse sobre esos campos. Algunas bases de datos ofrecen cifrado a nivel de campo del lado del cliente o cifrado consultable, que empaquetan estas técnicas. Por estos costos, el cifrado a nivel de campo debería reservarse para los datos restringidos, cuyos campos rara vez se consultan de todos modos.
Ejemplo práctico
Ejemplo práctico: qué cifrar, dónde y con qué claves
El arquitecto de la plataforma de reparto de comida revisa los principales conjuntos de datos con el esquema de clasificación. Todos los servicios ya usan TLS (TLS mutuo internamente) y almacenamiento cifrado con una clave de KMS por servicio, así que la pregunta es qué necesita algo más.
| Números de tarjeta | Nunca se guardan. Los campos de pago alojados los envían al proveedor de pagos; Pagos guarda el token del proveedor, la marca de la tarjeta y los cuatro últimos dígitos. El alcance de PCI DSS se reduce a la integración del proceso de pago con el proveedor. |
|---|---|
| Contraseñas de los clientes | Los servicios de producto no las guardan. El proveedor de identidad ofrece passkeys; las contraseñas que quedan se procesan con hash Argon2id con los parámetros de OWASP, con una pimienta guardada en un HSM. |
| Direcciones y números de teléfono (confidencial) | Cifrado del almacenamiento con la KEK de Pedidos; cuentas con mínimo privilegio; enmascarados en la herramienta de soporte; el almacén de datos solo recibe distritos postales, no direcciones completas. |
| Datos bancarios para los pagos a restaurantes (restringido) | Cifrado de sobre a nivel de campo con una KEK dedicada de Pagos; solo el proceso de pagos a restaurantes puede desenvolver; los cambios exigen volver a autenticarse y se notifican al propietario del restaurante, lo que protege tanto la integridad como la confidencialidad. |
| Documentos de identidad de los repartidores (restringido) | Se guardan como objetos, cada uno con su propia DEK envuelta con una KEK de incorporación; solo el servicio de verificación puede descifrar; cada acceso se registra y se revisa mensualmente; se borran al terminar el periodo legal de conservación. |
| Datos personales en los eventos y en el log de eventos | Los eventos llevan ID de cliente en lugar de direcciones; los pocos campos personales que deben viajar se cifran con una clave por cliente, de modo que destruir la clave los borra del log conservado. |
| Copias de seguridad | Cifradas con una KEK aparte guardada en una cuenta de nube aparte, para que comprometer las credenciales de producción no exponga las copias de seguridad; las restauraciones se prueban trimestralmente. |
| Secretos de los servicios | En la bóveda; las bases de datos usan credenciales dinámicas con vigencias de una hora; la clave de API del proveedor de pagos solo puede leerla la identidad de carga de trabajo de Pagos. |
Unas diez KEK, cada una propiedad de un servicio y rotada automáticamente cada año, cubren toda la plataforma; la palanca está en las decisiones, no en el número de claves.
Dos decisiones eliminan datos en lugar de protegerlos (los números de tarjeta y las direcciones completas en los análisis), y esa es siempre la opción más fuerte.
El diseño se documenta como un ADR por cada conjunto de datos restringido y como el concepto de protección de datos en la descripción de arquitectura.
Comprueba lo que has entendido
¿Frente a qué actores no protege el cifrado transparente de la base de datos?
Frente a cualquiera que pueda consultar la base de datos con una cuenta válida, incluidos la aplicación, un atacante que use inyección SQL y los administradores de bases de datos, porque la base de datos les descifra los datos.
¿Por qué es barato rotar una clave de cifrado de claves en el cifrado de sobre?
Solo hay que volver a envolver las pequeñas claves de datos envueltas con la nueva versión de la clave; los datos voluminosos siguen cifrados con sus claves de datos, que no cambian.
Un desarrollador propone guardar las contraseñas cifradas con AES para que el personal de soporte pueda decir a los usuarios su contraseña. ¿Qué tiene de malo?
Las contraseñas deben guardarse con un hash de contraseñas unidireccional, lento y con sal, para que nadie, ni el personal ni quien robe la clave, pueda recuperarlas; la recuperación debe restablecer la contraseña, no revelarla.
¿Por qué usar los campos alojados de un proveedor de pagos reduce el alcance de PCI DSS más que cifrar tú mismo los números de tarjeta?
Con los campos alojados, los números de tarjeta nunca llegan a los sistemas de la plataforma, así que no están en el alcance; los números de tarjeta cifrados que la plataforma puede descifrar mantienen sus sistemas dentro del alcance.
Fuentes y lecturas recomendadas
¿Tienes una pregunta sobre esta sección? ArchitectBot, el asistente de estudio con IA del curso, responde primero a partir del curso.
Pregunta: “¿Qué campos de la base de datos de mi aplicación merecen cifrado a nivel de campo y cómo debería organizar las claves?”