Always Encrypted en SQL Server: proteger datos sensibles end-to-end
João Barros
25 de March de 2026
2 min de lectura
Always Encrypted es una funcionalidad de SQL Server (y Azure SQL) que cifra los datos sensibles en el lado del cliente, garantizando que el servidor nunca tiene acceso a las claves de cifrado. Ideal para datos PII, números de tarjeta e información médica.
Arquitectura
Cliente (aplicación) SQL Server
├─ Column Master Key (CMK) ├─ Datos cifrados (ciphertext)
│ (Azure Key Vault / cert) ├─ Column Encryption Key (CEK) cifrada
└─ Driver cifra/descifra └─ Nunca ve datos en claro
Tipos de cifrado
- Deterministic — mismo plaintext → mismo ciphertext. Soporta igualdad y GROUP BY. Más fácil de atacar por análisis de frecuencia.
- Randomized — cifrado diferente cada vez. Más seguro. No soporta búsqueda ni ordenación.
Configurar vía el SSMS Wizard
-- Tras la configuración vía wizard, la columna queda cifrada:
-- SSMS con Always Encrypted activado muestra datos en claro
-- Una conexión sin la CMK muestra ciphertext binario
-- Verificar columnas cifradas
SELECT
c.name AS columna,
t.name AS tipo,
c.encryption_type_desc,
c.encryption_algorithm_name
FROM sys.columns c
JOIN sys.types t ON c.user_type_id = t.user_type_id
WHERE c.encryption_type IS NOT NULL;
Usar en una aplicación .NET
// Connection string con Always Encrypted
var connStr = "Server=...;Column Encryption Setting=Enabled;";
// El driver cifra automáticamente los parámetros antes de enviar
using var cmd = new SqlCommand("SELECT * FROM Clientes WHERE nif = @nif", conn);
cmd.Parameters.AddWithValue("@nif", "123456789"); // cifrado por el driver
Conclusión
Always Encrypted es la solución más robusta para proteger datos sensibles en SQL Server. El cifrado ocurre en el driver del cliente, haciendo los datos inaccesibles incluso para administradores de base de datos con acceso root al servidor — un requisito cada vez más común en auditorías RGPD.