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
Email 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:

  1. Lawfulness, fairness, transparency: procesar datos legalmente y de forma transparente.
  2. Purpose limitation: recolectar para propósitos específicos, no usar para otros.
  3. Data minimization: solo lo necesario, no más.
  4. Accuracy: mantener datos actualizados.
  5. Storage limitation: no guardar más tiempo del necesario.
  6. 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:

  1. Proactivo no reactivo: prevenir, no remediar.
  2. Privacidad por defecto: la configuración default debe ser la más privada.
  3. Embedded en el diseño: no add-on al final.
  4. Funcionalidad completa: privacidad sin sacrificar features.
  5. End-to-end security: todo el ciclo de vida del dato.
  6. Visibilidad y transparencia: auditable.
  7. 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?

  1. Cuestionar requirements: "¿realmente necesitamos esta data?"
  2. Diseñar opt-in, no opt-out.
  3. No construir dark patterns.
  4. Documentar concerns.
  5. 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:

  1. Recolectan ubicación del usuario incluso cuando la app está cerrada.
  2. Comparten datos con 47 partners "para mejorar la experiencia".
  3. Política de privacidad de 30 páginas en inglés legal.
  4. No hay forma de descargar tus datos.
  5. Para cancelar la cuenta hay que llamar a un teléfono que solo atiende 9-17h.
  6. 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.


2.6 Para profundizar

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.