DEV Community

Cover image for Privacidad por Diseño: Checklist técnico para la Ley 7593/2025
Hugo Campañoli
Hugo Campañoli

Posted on • Originally published at campa.dev

Privacidad por Diseño: Checklist técnico para la Ley 7593/2025

La privacidad por diseño deja de ser una sugerencia ética para transformarse en el estándar legal obligatorio bajo la Ley 7593/2025 de Paraguay. Este cambio legislativo marca un hito en la madurez digital del país, obligando a empresas y desarrolladores a repensar cómo capturan, almacenan y protegen la información ciudadana.

El MITIC ha sido claro: no bastará con términos y condiciones genéricos; el software debe integrar protecciones técnicas desde la arquitectura inicial, no como un parche posterior.


¿Qué exige la Ley 7593/2025 a tu software?

La ley establece que el responsable del tratamiento de datos debe implementar medidas técnicas y organizativas desde el diseño del sistema. No es un checklist que se añade antes del deploy. Es arquitectura.

Sanciones: La Ley 7593/2025 prevé multas de hasta 20.000 jornales mínimos para quienes no implementen medidas de protección adecuadas. Con el jornal de 2026, eso supera los ₲ 2.230 millones por incidente.

La traducción técnica de la ley es directa:

Artículo de Ley Qué dice Requerimiento Técnico
Art. 4(d) — Minimización Datos "limitados a lo necesario" Validar que solo se recopilan campos necesarios
Art. 6 — Consentimiento "Previo, libre, e inequívoco" Opt-in explícito + registro auditado de versión legal
Art. 9 — Responsable "Medidas técnicas apropiadas" Privacy-by-design en la arquitectura
Art. 16 — Seguridad "Monitoreo y mejora continua" Cifrado en tránsito y en reposo (AES-256)
Arts. 26-31 — Derechos ARCO Acceso y supresión en ≤30 días API de exportación + endpoint de eliminación

¿Cómo implementar privacidad por diseño en tu stack?

La respuesta corta: no guardes lo que no necesitás, cifrá lo que sí guardás, y dejá que el usuario borre todo cuando quiera.

Paso 1: Minimización de datos

Cada campo que agregás a un formulario es una responsabilidad legal. Validá en el schema, no en el frontend:

import * as z from "zod";

// Schema que rechaza datos innecesarios por diseño
export const ContactFormSchema = z.strictObject({
  email: z.email(),
  message: z.string().min(10).max(500),
  // Sin teléfono, sin nombre completo, sin dirección
});

export type ContactForm = z.infer<typeof ContactFormSchema>;
Enter fullscreen mode Exit fullscreen mode

z.strictObject() rechaza cualquier campo que no esté en el schema. Si alguien intenta inyectar data extra, Zod tira un error. La minimización se vuelve inquebrantable.

Paso 2: Consentimiento explícito

Una casilla pre-marcada no es consentimiento. Necesitás un opt-in explícito y auditado:

export interface ConsentRecord {
  userId: string;
  purpose: string;
  timestamp: Date;
  userAgent: string;
  legalTextVersion: string; // El hash del texto legal vigente
}
Enter fullscreen mode Exit fullscreen mode

El legalTextVersion es clave: si actualizás los términos, necesitás saber qué versión aceptó cada usuario.

Paso 3: Cifrado y retención

Los datos que guardás tienen fecha de vencimiento. La retención indefinida es incumplimiento automático:

// Job diario que purga datos expirados
export async function purgeExpiredData() {
  const RETENTION_DAYS = 365;
  const cutoff = new Date();
  cutoff.setDate(cutoff.getDate() - RETENTION_DAYS);

  await db.user.updateMany({
    where: {
      AND: [{ lastActiveAt: { lt: cutoff } }, { purposeConsent: null }],
    },
    data: {
      email: `anon-${crypto.randomUUID()}@anonimizado.local`,
      name: "Usuario Anonimizado",
      status: "pending_deletion",
    },
  });
}
Enter fullscreen mode Exit fullscreen mode

La privacidad por diseño no te hace menos ágil — te hace más profesional. Y en Paraguay, donde la transformación digital del agro y el comercio apenas arranca, ser el que cumple primero es un diferencial que tus clientes van a notar.


Para ver el código completo y los componentes de arquitectura, revisá el artículo original en mi blog.

Top comments (0)