Privacidad y datos personales
"Si el producto es gratis, vos sos el producto."
Qué vas a aprender en este capítulo
Cada app que usás te trackea. Cada sitio web sabe quién sos. Los datos personales son el nuevo petróleo. Este capítulo cubre los principios éticos y legales de cómo tratar datos personales.
2.1 ¿Qué son datos personales?
📐 Fundamento
Dato personal: cualquier información que identifica o permite identificar a una persona.
| Identificadores directos | Identificadores indirectos | Datos sensibles |
|---|---|---|
| Nombre | Dirección IP | Salud |
| DUI / cédula | Cookie ID | Origen étnico |
| User agent | Religión | |
| Teléfono | Fingerprint del browser | Orientación sexual |
| Foto | Comportamiento de uso | Ideología política |
| Voz | Ubicación aproximada | Datos biométricos |
Reidentificación: datos "anónimos" pueden combinarse para identificar.
Estudio famoso (Sweeney, 2000): 87% de los estadounidenses pueden ser
identificados solo con: código postal + fecha de nacimiento + género.
→ Los datos "agregados" frecuentemente NO son anónimos.
Casos famosos de reidentificación:
- AOL (2006): liberó "anonimizadas" 20 millones de búsquedas. NYT identificó individuos por sus búsquedas.
- Netflix Prize (2007): liberó ratings "anónimos". Investigadores cruzaron con IMDB → identificaron usuarios.
- NYC Taxi data (2014): liberó viajes "anónimos". Investigadores des-anonimizaron destinos privados de celebridades.
Principio: la verdadera anonimización es muy difícil. Asumir que los datos son re-identificables.
2.2 GDPR — el estándar mundial de facto
📐 Fundamento
GDPR (General Data Protection Regulation, UE 2018) — la ley de privacidad más estricta y influyente.
Aplica si procesás datos de cualquier residente de la UE, sin importar dónde esté tu empresa.
6 principios fundamentales:
- Lawfulness, fairness, transparency: procesar datos legalmente y de forma transparente.
- Purpose limitation: recolectar para propósitos específicos, no usar para otros.
- Data minimization: solo lo necesario, no más.
- Accuracy: mantener datos actualizados.
- Storage limitation: no guardar más tiempo del necesario.
- Integrity and confidentiality: proteger los datos.
6 bases legales para procesar datos:
| Base | Cuándo usar |
|---|---|
| Consent | Marketing, cookies no esenciales |
| Contract | Datos necesarios para cumplir contrato |
| Legal obligation | Cumplir leyes (ej: facturas tax) |
| Vital interests | Vida o muerte (emergencias médicas) |
| Public task | Funciones públicas |
| Legitimate interest | Justificar caso por caso |
Derechos del usuario (data subject rights):
1. Right to be informed: saber qué datos tenés.
2. Right of access: pedir copia de sus datos.
3. Right to rectification: corregir datos incorrectos.
4. Right to erasure: "right to be forgotten" — eliminar.
5. Right to restrict: limitar uso temporalmente.
6. Right to data portability: exportar datos a otra plataforma.
7. Right to object: oponerse a procesamiento (ej: marketing).
8. Rights re: automated decision-making: no ser sujeto a decisiones puramente automáticas significativas.
Implementar derechos en código:
@app.delete("/api/users/{user_id}/data")
def derecho_al_olvido(user_id: str, current_user=Depends(verify_user)):
"""GDPR Art. 17 — Right to erasure."""
if current_user.id != user_id and not current_user.is_admin:
raise HTTPException(403)
# Eliminar/anonimizar datos en TODAS las tablas
db.execute("""
UPDATE pedidos SET cliente_nombre = 'ELIMINADO',
cliente_email = 'eliminado@deleted.local'
WHERE cliente_id = %s
""", user_id)
db.execute("DELETE FROM sesiones WHERE user_id = %s", user_id)
db.execute("DELETE FROM preferencias WHERE user_id = %s", user_id)
db.execute("DELETE FROM users WHERE id = %s", user_id)
# Logs de auditoría se mantienen (interés legítimo) pero anonimizados
audit.log("user_deleted", {"user_id_hash": hashlib.sha256(user_id.encode()).hexdigest()})
# Notificar a procesadores externos (Stripe, Sendgrid, etc.)
stripe.customers.delete(user.stripe_id)
sendgrid.delete_recipient(user.email)
return {"status": "deleted"}
@app.get("/api/users/{user_id}/export")
def derecho_a_portabilidad(user_id: str, current_user=Depends(verify_user)):
"""GDPR Art. 20 — Data portability."""
if current_user.id != user_id:
raise HTTPException(403)
return {
"user": db.get_user(user_id),
"pedidos": db.get_user_orders(user_id),
"preferences": db.get_preferences(user_id),
"exported_at": datetime.utcnow().isoformat()
}
Multas GDPR:
- Hasta €20 millones o 4% del revenue global anual (lo mayor).
- Aplicado: Meta multada €1.2B (2023), Amazon €746M (2021).
El Salvador y Latinoamérica:
- El Salvador: Ley de Protección de Datos Personales (2024), Defensoría del Consumidor.
- Argentina: Ley 25.326 (similar a GDPR, anterior).
- Brasil: LGPD (2020, basada en GDPR).
- México: LFPDPPP (2010).
- Chile: Ley 21.096.
CCPA (California, USA, 2020): similar a GDPR, aplicable a residentes de California.
2.3 Privacy by Design
📐 Fundamento
Privacy by Design (Ann Cavoukian, 1995): privacidad incorporada desde el diseño, no agregada después.
7 principios:
- Proactivo no reactivo: prevenir, no remediar.
- Privacidad por defecto: la configuración default debe ser la más privada.
- Embedded en el diseño: no add-on al final.
- Funcionalidad completa: privacidad sin sacrificar features.
- End-to-end security: todo el ciclo de vida del dato.
- Visibilidad y transparencia: auditable.
- Respeto al usuario: centrado en el usuario.
Aplicaciones prácticas:
✗ MAL ✓ BIEN
Default: tracking on, opt-out Default: tracking off, opt-in
Recoger todos los datos posibles Recoger solo lo estrictamente necesario
Guardar para siempre "por si acaso" TTL definido por dato
Mismo dataset usado para todo Datasets segregados por propósito
Toda la app accede a todos los datos Mínimo privilegio en código
Anonimización vs pseudonimización:
Original: nombre=Ana García, email=ana@x.com, edad=25, ciudad=SS
Pseudonimización: id=xyz123, edad=25, ciudad=SS
(mapping nombre→id guardado separado)
→ sigue siendo dato personal bajo GDPR
Anonimización: grupo: 25-30 años, ciudad=SS, conteo=143
→ ya no es dato personal (si está bien hecha)
Differential privacy:
Agregar ruido estadístico controlado para que las consultas agregadas sean precisas, pero individuos no sean identificables.
# Ejemplo conceptual:
import numpy as np
def consulta_diferencialmente_privada(datos, epsilon=1.0):
suma_real = sum(datos)
# Agregar ruido Laplace
noise = np.random.laplace(0, 1/epsilon)
return suma_real + noise
# Útil para: census, estadísticas públicas, ML training
# Apple, Google y el censo de EE.UU. lo usan.
Consentimiento informado:
NO es válido:
- Cookies banner de "Aceptar" gigante y "Configurar" oculto.
- Aceptar términos de 50 páginas de un clic.
- "Continuar implica aceptación".
SÍ es válido:
- Opciones claras y equivalentes (Aceptar / Rechazar / Configurar).
- Explicación clara y breve.
- Granular: "aceptar cookies analíticas pero no de marketing".
- Revocable en cualquier momento.
2.4 Surveillance capitalism
💡 Intuición
Surveillance capitalism (Shoshana Zuboff, 2019): modelo de negocio donde la materia prima es el comportamiento humano, capturado masivamente, procesado para predecir y modificar acciones.
Google, Facebook, TikTok, Amazon — todos lo practican en distintos grados.
📐 Fundamento
Cómo funciona:
Usuario interactúa con producto gratuito
↓
Datos comportamentales (clicks, tiempo, ubicación, contactos)
↓
ML construye perfil profundo
↓
Predice qué vas a hacer / querer
↓
Vende esa predicción a anunciantes
↓
Anunciantes intentan modificar tu comportamiento
↓
Usuario interactúa más con producto (loop)
Casos:
- Cambridge Analytica (2018): datos de 87M usuarios de Facebook usados para influenciar elecciones (Brexit, Trump 2016).
- TikTok algorithm leak (2022): documentos internos describen explícitamente el objetivo de maximizar tiempo en app, sin importar el daño.
- Google location tracking (2018): rastreaba ubicación incluso cuando "Location History" estaba desactivado.
Como ingeniero, ¿qué hacer?
- Cuestionar requirements: "¿realmente necesitamos esta data?"
- Diseñar opt-in, no opt-out.
- No construir dark patterns.
- Documentar concerns.
- Considerar el costo personal de no participar (ver capítulo 5).
Dark patterns:
UI/UX diseñado para engañar al usuario.
✗ "¿Cancelar suscripción?" → "Sí" en chico gris, "Mejor sigue conmigo!" en botón gigante azul.
✗ Confirmación negativa: "Sí, no quiero recibir descuentos" → confunde.
✗ Roach motel: fácil entrar, casi imposible salir (cancelaciones por teléfono solamente).
✗ Sneak into basket: agregar items en el checkout sin avisar claramente.
✗ Privacy zuckering: enterrar opciones de privacidad en menús laberínticos.
(Lista mantenida en darkpatterns.org)
🛠️ En la práctica
La Esquina Cloud — privacidad por diseño:
# Buenas prácticas implementadas:
# 1. Mínimo necesario al registrar
class RegistroUsuario(BaseModel):
email: EmailStr
nombre: str # solo para mostrar
password: str
# NO pedimos: fecha nacimiento, género, dirección — no lo necesitamos
# 2. Cookies banner real
{
"necesarias": True, # checkbox grayed (obligatorias para login)
"analíticas": False, # opt-in real, default off
"marketing": False # opt-in real, default off
}
# 3. Retention policy
def cleanup_old_data():
# Eliminar pedidos > 7 años (compliance + storage)
db.execute("DELETE FROM pedidos WHERE fecha < NOW() - INTERVAL '7 years'")
# Eliminar logs de seguridad > 90 días
db.execute("DELETE FROM security_logs WHERE created_at < NOW() - INTERVAL '90 days'")
# 4. Acceso por mínimo privilegio
class AppRoles:
MOZO = ["read:pedidos", "create:pedidos"]
COCINA = ["read:pedidos", "update:pedido_estado"]
ADMIN = ["read:*", "update:*"]
REPORTING = ["read:pedidos_anonymized"] # solo dataset anonimizado
# 5. Datos sensibles cifrados
def guardar_dui(user_id, dui):
# NUNCA guardar DUI en texto plano
encrypted = fernet.encrypt(dui.encode())
db.execute("UPDATE users SET dui_encrypted = %s WHERE id = %s", encrypted, user_id)
# 6. Endpoints de derechos GDPR
# /api/me/export, /api/me/delete, /api/me/data
# 7. Logging sin PII
log.info("Pedido creado", extra={
"pedido_id": pedido.id,
# NO loggear: nombre, email, dirección
"cliente_id_hash": hash_user(pedido.cliente_id)
})
2.5 Ejercicios
✏️ Ejercicio 2.1 — Auditoría de privacidad
Imaginá que sos contratado para auditar la privacidad de una app de delivery local. Encontrás:
- Recolectan ubicación del usuario incluso cuando la app está cerrada.
- Comparten datos con 47 partners "para mejorar la experiencia".
- Política de privacidad de 30 páginas en inglés legal.
- No hay forma de descargar tus datos.
- Para cancelar la cuenta hay que llamar a un teléfono que solo atiende 9-17h.
- Los emails y teléfonos están guardados en texto plano en la BD.
Listá las violaciones de GDPR y propone qué cambios urgentes hacer.
Solución
| # | Violación | Artículo GDPR | Cambio urgente |
|---|---|---|---|
| 1 | Tracking en background sin justificación | Art. 5 (data minimization), Art. 6 (legal basis) | Usar location SOLO durante uso activo, opt-in explícito para background |
| 2 | Compartir con 47 partners sin consentimiento granular | Art. 6, Art. 7 | Listar cada partner, opt-in granular por categoría, justificación clara |
| 3 | Política incomprensible en idioma extranjero | Art. 12 (transparencia) | Política en español, lenguaje claro, < 5 páginas, resumen visual |
| 4 | No hay export de datos | Art. 20 (portability) | Endpoint /api/me/export que devuelve JSON con todos los datos |
| 5 | Cancelación con barreras (dark pattern) | Art. 17 (right to erasure) | Botón "Eliminar cuenta" en settings, ejecución automática |
| 6 | Datos sensibles sin cifrar | Art. 32 (security) | Cifrado at-rest (al menos hash de email para lookup, encryption para teléfono) |
Adicional:
- Designar un Data Protection Officer (DPO) si procesan a gran escala.
- Hacer Data Protection Impact Assessment (DPIA).
- Notificar brechas en 72 horas a la autoridad.
- Mantener Registry of Processing Activities (RoPA).
Riesgo financiero: multas de hasta 4% del revenue global. Para una empresa con 2M.
2.6 Para profundizar
- GDPR official text (gdpr.eu).
- "Privacy is Power" — Carissa Véliz.
- "The Age of Surveillance Capitalism" — Shoshana Zuboff.
- darkpatterns.org — catálogo de dark patterns.
- Siguiente: Propiedad intelectual.
2.X Errores comunes
⚠️ Trampa común
Creer que "anonimizar" es irreversible. Borrar el nombre y el DUI no anonimiza nada si quedan código postal + fecha de nacimiento + género: con esos tres campos se puede reidentificar al 87 % de la población (estudio de Sweeney, 2000). Lo que parece dato anónimo, cruzado con un padrón electoral o LinkedIn, vuelve a ser personal.
Tip: anonimización real requiere técnicas formales: k-anonimato, differential privacy, agregación a buckets grandes. Si el dataset se va a publicar, audita con un experto antes.
⚠️ Trampa común
Pedir "consentimiento" con un botón gigante de OK y "rechazar" escondido. Es un dark pattern: legalmente puede pasar como consentimiento, pero éticamente (y bajo GDPR) no es válido si no es libre, específico, informado y unívoco. Diseños asimétricos manipulan el clic.
Tip: "Aceptar todo" y "Rechazar todo" deben tener el mismo peso visual (mismo tamaño, color, posición simétrica). Si tenés que esconder el "Rechazar", es señal de que tu modelo de negocio no es viable sin engañar.
Definiciones nuevas: dato personal, dato sensible, reidentificación, GDPR, base legal, derechos del data subject, right to erasure, data portability, Privacy by Design, anonimización, pseudonimización, differential privacy, consentimiento informado, surveillance capitalism, dark pattern, DPO, DPIA.