Llevo un par de semanas pegado a los artículos de The Guardian y The Washington Post. Las revelaciones de Edward Snowden, un ex-contratista de la NSA, han provocado un terremoto en la industria que todavía no somos capaces de asimilar. Leer las diapositivas filtradas sobre el programa PRISM y ver cómo las agencias de inteligencia tienen acceso directo a los servidores de gigantes como Google, Facebook, Apple o Microsoft me ha dejado helado. Aunque en parte siempre hay un lado conspiranoico de nuestras cabezas que dice "esto ya se sabía".

Pero más allá de la política, esto nos golpea de lleno a los informáticos. Nosotros somos los fontaneros de este ecosistema. Si la NSA o cualquier otro actor puede leer los datos de nuestros usuarios, en gran parte es porque se lo hemos puesto demasiado fácil.

El problema del texto plano

Hasta ahora, la seguridad la enfocábamos casi exclusivamente en el perímetro: proteger la red con firewalls y evitar inyecciones SQL para que nadie nos robe la base de datos desde fuera. Asumíamos que si el dato estaba guardado en nuestro servidor, estaba a salvo.

Snowden nos ha demostrado que esa premisa es falsa. Si te obligan legalmente a entregar un disco duro, o si el tráfico de fibra óptica entre tus datacenters está pinchado, el firewall no sirve de nada. Necesitamos empezar a aplicar cifrado en reposo (encryption at rest) a nivel de aplicación.

Imagina que revisando tu aplicacion ves que números de cuentas bancarias y direcciones se guardan en columnas de texto tipo VARCHAR normales. Si alguien copiaba el fichero .mdf de SQL Server, tenía todo. Cambiar esto a nivel de base de datos no es tan complejo como parece:

-- Ejemplo en MySQL usando funciones nativas de cifrado AES
-- OJO: La clave debe gestionarse fuera de la BD en un entorno real seguro.

-- Inserción de un dato sensible cifrado
INSERT INTO ClientesSensibles (Id, Nombre, TarjetaCreditoCifrada)
VALUES (
    1, 
    'Carlos', 
    AES_ENCRYPT('4500-1234-5678-9012', 'mi_clave_maestra_super_secreta_256')
);

-- Lectura del dato desencriptándolo al vuelo
SELECT 
    Nombre, 
    CAST(AES_DECRYPT(TarjetaCreditoCifrada, 'mi_clave_maestra_super_secreta_256') AS CHAR) as TarjetaPlana
FROM ClientesSensibles
WHERE Id = 1;

Para las contraseñas, por favor, ya deberíamos haber dejado atrás algoritmos rápidos como MD5 o SHA1. Usar algo como bcrypt con un buen salt debería ser un estándar innegociable.

Reflexión: La ética de retener datos

Este escándalo me ha hecho reflexionar sobre un vicio que tenemos en los entornos de Big Data y Business Intelligence: el síndrome de Diógenes digital. Tendemos a guardar absolutamente todo en nuestros logs ("por si acaso nos sirve para un modelo predictivo en el futuro"). Registramos IPs, horas de conexión, clics, ubicaciones.

El caso Snowden nos enseña que los datos que retienes son un pasivo tóxico. Si guardas el historial de ubicaciones de un usuario durante cinco años en texto plano, estás construyendo una bomba de relojería contra su privacidad. Como informáticos, tenemos una responsabilidad ética brutal. Nuestro nuevo lema no debería ser "guárdalo todo", sino "recopila solo lo estrictamente necesario, cífralo con fuerza y bórralo en cuanto deje de ser útil". Si no tenemos los datos legibles, nadie nos los podrá exigir.