Always Encrypted no SQL Server: proteger dados sensíveis end-to-end
João Barros
25 de March de 2026
2 min de leitura
O Always Encrypted é uma funcionalidade do SQL Server (e Azure SQL) que cifra dados sensíveis no lado do cliente, garantindo que o servidor nunca tem acesso às chaves de cifra. Ideal para dados PII, números de cartão e informações médicas.
Arquitectura
Cliente (aplicação) Servidor SQL
├─ Column Master Key (CMK) ├─ Dados cifrados (ciphertext)
│ (Azure Key Vault / cert) ├─ Column Encryption Key (CEK) cifrada
└─ Driver cifra/decifra └─ Nunca vê dados em claro
Tipos de cifra
- Deterministic — mesmo plaintext → mesmo ciphertext. Suporta igualdade e GROUP BY. Mais fácil de atacar por análise de frequência.
- Randomized — cifra diferente cada vez. Mais seguro. Não suporta pesquisa ou ordenação.
Configurar via SSMS Wizard
-- Após configuração via wizard, a coluna fica cifrada:
-- SSMS com Always Encrypted activado mostra dados em claro
-- Ligação sem a CMK mostra ciphertext binário
-- Verificar colunas cifradas
SELECT
c.name AS coluna,
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 em aplicação .NET
// Connection string com Always Encrypted
var connStr = "Server=...;Column Encryption Setting=Enabled;";
// O driver cifra automaticamente os parâmetros antes de enviar
using var cmd = new SqlCommand("SELECT * FROM Clientes WHERE nif = @nif", conn);
cmd.Parameters.AddWithValue("@nif", "123456789"); // cifrado pelo driver
Conclusão
O Always Encrypted é a solução mais robusta para proteger dados sensíveis em SQL Server. A cifra acontece no driver do cliente, tornando os dados inacessíveis mesmo a administradores de base de dados com acesso root ao servidor — um requisito cada vez mais comum em auditorias RGPD.