Como encriptar una columna en una base de datos SQL Server
A veces la información que se graba en una base de datos requiere que sea almacenada de manera segura para que no sea legible por terceros en caso de robo. Existen en SQL Server varias maneras de protegerse desde encriptar la base de datos por completo hasta encriptar por columna.
El original de este ejemplo fue publicado en www.mssqltips.com
En este ejemplo vamos va crear una tabla de clientes con el nombre de cliente y su numéro de RUT, o de carné de identidad,
Creación de la tabla
Se asume que existe una base de datos llamada prueba
USE Prueba; GO
-- Creación de la table
CREATE TABLE dbo.tblCliente (C_id int IDENTITY(1,1) constraint cKey Primary Key NOT NULL, C_Nombre varchar(100) NOT NULL, C_RUT varchar(25) NOT NULL)
-- Ingreso de datos
INSERT INTO dbo.tblCliente
VALUES ('Luis Roberto','11222330-4')
GO
INSERT INTO dbo.tblCliente VALUES ('Paola Luis','11222331-2')
GO
INSERT INTO dbo.tblCliente VALUES ('Juan Pablo','11222332-0')
GO
INSERT INTO dbo.tblCliente VALUES ('Viviana Maria','11222333-9')
GO
Ahora revisamos el contenido de esta tabla
-- Ver datos
SELECT * FROM dbo.tblCliente GO
Aquí se puede leer claramente todas la información
1 Luis Roberto 11222330-4
2 Paola Luis 11222331-2
3 Juan Pablo 11222332-0
4 Viviana Maria 11222333-9
Creación de las claves
Revisamos si la base de datos Master permite la tener clave corriendo
USE master;
GO
SELECT * FROM sys.symmetric_keys WHERE name = '##MS_ServiceMasterKey##';
GO
Esta orden tiene que arrojar algo. Si no fuese el caso no se puede encriptar informacion en esta base de datos. Para activar este servicio ver esta pagina
Asumiendo que el servicio esta funcionando vamos a proceder con la creacion de una clave
-- Crear una clave
USE Prueba;
GO CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'ClavePrueba';
GO
Es importante tomar nota de esta clave.
Luego crear el certificado
-- Crear certificado
USE Prueba;
GO CREATE CERTIFICATE Certificado WITH SUBJECT = 'Proteccion Datos';
GO
Y ahora se crea la clave simetrica
USE Prueba;
GO
CREATE SYMMETRIC KEY Clave1 WITH ALGORITHM = AES_128 ENCRYPTION BY CERTIFICATE Certificado;
GO
Agregar columna encriptada.
Ahora agregamos una columna para almacenar el RUT encriptado. Notar que el tipo tiene que ser varbinary(MAX)
USE Prueba;
GO ALTER TABLE tblCliente ADD C_RUT_encriptado varbinary(MAX) NULL
GO
Encriptar los datos
Y ahora se encriptan los datos de la nueva columna
-- Encriptar los datos
USE Prueba;
GO
-- Abrir la clave Clave1
OPEN SYMMETRIC KEY Clave1 DECRYPTION BY CERTIFICATE Certificado;
GO
UPDATE tblCliente SET C_RUT_encriptado = EncryptByKey (Key_GUID('Clave1'),C_RUT) FROM dbo.tblCliente;
GO
-- Cerrar la clave
CLOSE SYMMETRIC KEY Clave1;
GO
Una vez hecho leer el contenido de la tabla con esta orden
USE Prueba;
GO
OPEN SYMMETRIC KEY Clave1 DECRYPTION BY CERTIFICATE Certificado;
GO
-- Leer los datos
SELECT C_Id, C_Nombre, C_RUT_encriptado AS 'RUT encriptado', CONVERT(varchar, DecryptByKey(C_RUT_encriptado)) AS 'RUT decriptado' FROM dbo.tblCliente;
-- Close the symmetric key
CLOSE SYMMETRIC KEY Clave1;
GO
Y el contenido da lo siguiente:
1 Luis Roberto 0x005302A9A2B8DC4A93EB6503E4635462010000009EBC059F009B4D6B82BB8AC03C1C8922BE0F04FAD046D68CAF908CDD3E3A4950D4552277C4E0655EFE8334F9DDE78F10 11222330-4
2 Paola Luis 0x005302A9A2B8DC4A93EB6503E463546201000000CC5657EADD1BBB9021025E6540456B45E5EF28A3EEAE41FAB77E85B01A365799009DEC7CE1CC3490F8A1DB0CBCC206E9 11222331-2
3 Juan Pablo 0x005302A9A2B8DC4A93EB6503E463546201000000DDFE0381D3285144D8BD1DB2B2272FAC27F8525030AAFFB6DBE023CB28EF0E7F7CFED5FE533312C23BFF9DCCE1775C77 11222332-0
4 Viviana Maria 0x005302A9A2B8DC4A93EB6503E463546201000000A63574FDA22CF69557F1E11AB1A8C14E7FCBA6F32DEF5D514475DF160A174FBD3E98DE55407342011857A9FD22E5668C 11222333-9
En este listado se ve el RUT almacenado y su valor decriptado. Removamos la columna que contiene el RUT en claro
USE Prueba;
GO ALTER TABLE tblCliente DROP COLUMN C_RUT;
GO
Agregar un nuevo cliente se hace de esta manera:
USE Prueba;
GO
OPEN SYMMETRIC KEY Clave1 DECRYPTION BY CERTIFICATE Certificado;
-- Agregar un registro
INSERT INTO dbo.tblCliente (C_Nombre, C_RUT_Encriptado) VALUES ('Marcelo Juan', EncryptByKey( Key_GUID('Clave1'), CONVERT(varchar,'11222338-K') ) );
GO
Y el resultado es lo siguiente:
1 Luis Roberto 0x005302A9A2B8DC4A93EB6503E4635462010000009EBC059F009B4D6B82BB8AC03C1C8922BE0F04FAD046D68CAF908CDD3E3A4950D4552277C4E0655EFE8334F9DDE78F10 11222330-4
2 Paola Luis 0x005302A9A2B8DC4A93EB6503E463546201000000CC5657EADD1BBB9021025E6540456B45E5EF28A3EEAE41FAB77E85B01A365799009DEC7CE1CC3490F8A1DB0CBCC206E9 11222331-2
3 Juan Pablo 0x005302A9A2B8DC4A93EB6503E463546201000000DDFE0381D3285144D8BD1DB2B2272FAC27F8525030AAFFB6DBE023CB28EF0E7F7CFED5FE533312C23BFF9DCCE1775C77 11222332-0
4 Viviana Maria 0x005302A9A2B8DC4A93EB6503E463546201000000A63574FDA22CF69557F1E11AB1A8C14E7FCBA6F32DEF5D514475DF160A174FBD3E98DE55407342011857A9FD22E5668C 11222333-9
5 Marcelo Juan 0x005302A9A2B8DC4A93EB6503E463546201000000622374B0BD5F6B8BF95780DC569A57D2C4C4281A44ECC7DE200341F76D804E4580786BDCC61FE06A8397DB1D77E1FA3D 11222338-K
Actualizar la información se hace de una manera similar.
Para mas información sobre encriptación de datos en SQL Server visitar MSSQL Tips aquí