¿Cómo Encriptar Los Datos De Una Columna En SQL Server?

Requerimiento: Queremos encriptar la información sensible de una tabla en nuestra base de datos para que no sea legible a los usuarios que tienen acceso a ella.

Solución: La encriptación a nivel de columna es una de las funcionalidades que nos permite asegurar nuestros datos. De esta manera, si un usuario llega a obtener acceso a la tabla, esta es inútil sin una correspondiente clave de desencriptación o password. Esta característica está disponible desde SQL Server 2008 en su versión Standard.

En este ejemplo, encriptaremos la data de la columna ‘nrotarjeta’ de la tabla ‘dbo.clientes’ . Echamos un vistazo a la tabla clientes:

customer table sensitive sql server

Primero, creamos una Database Master Key, la cual protegerá el certificado que crearemos en el siguiente paso.

--Script #1
USE BitacoraDBA;
GO
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'Bitac@2020';

Segundo, creamos un certificado, el cual protegerá la clave simétrica que crearemos en el paso 3.

--Script #2
USE BitacoraDBA;
GO
CREATE CERTIFICATE Certificado_prueba WITH SUBJECT = 'Encripta una columna';
GO

Tercero, creamos una clave simétrica usando el certificado creado en el paso anterior.

--Script #3
CREATE SYMMETRIC KEY LlaveSimetrica_Prueba 
WITH ALGORITHM = AES_256 ENCRYPTION BY CERTIFICATE Certificado_prueba;

Cuarto, añadimos una nueva columna a la tabla, que almacenará la data ya encriptada. Esta nueva columna debe ser de tipo VARBINARY.

--Script #4
ALTER TABLE dbo.clientes ADD nrotarjeta_encriptado varbinary(MAX)

Por último, encriptamos la data usando la clave simétrica y el comando ENCRYPTBYKEY:

--Script #5
OPEN SYMMETRIC KEY LlaveSimetrica_prueba 
DECRYPTION BY CERTIFICATE Certificado_prueba;

--Almacenamos la data encriptada en la nueva columna 
UPDATE dbo.clientes
SET nrotarjeta_encriptado = ENCRYPTBYKEY(Key_GUID('LlaveSimetrica_prueba'), nrotarjeta)
FROM dbo.clientes;
GO

--Cerramos la llave simétrica después de haberla usado
CLOSE SYMMETRIC KEY LlaveSimetrica_prueba;
GO

Si echamos un vistazo a la tabla dbo.clientes veremos la data encriptada en la nueva columna.

encrypted table sql server

Una vez comprobemos el cambio, podemos proceder a eliminar la columna con la data no encriptada.

Si tienes alguna duda, comentarios o sugerencias, me puedes enviar un correo a bitácoradeundba@gmail.com.

2 Replies to “¿Cómo Encriptar Los Datos De Una Columna En SQL Server?”

  1. Hola, espero te encuentres muy bien, traté de realizar tu ejemplo, pero al momento de ejecutar la sentencia “OPEN SYMMETRIC KEY LlaveSimetrica_prueba DECRYPTION BY CERTIFICATE Certificate_prueba;”

    me surge el siguiente mensaje: “Cannot find the certificate ‘Certificate_prueba’, because it does not exist or you do not have permission.”

    ¿esto a que se debe?

    1. Hola Diana, esto se debe a un error en mi script. Gracias por notarlo.
      Debemos indicar el nombre del certificado que creamos anteriormente (Certificado_prueba) al momento de abrir la llave simétrica.
      He actualizado el script #5 para reflejar el cambio.

Deja un comentario