Memorias de un DBA

Un blog dedicado a contribuir a la comunidad SQL Server en español

Encriptación de datos en SQL Server – Parte 1

with one comment

Muchas veces en los sistemas de información se maneja mucha data que es sensible y que las compañías quieren proteger para evitar que caiga en manos maliciosas. Ejemplos de esta información son los números de tarjetas de crédito, números de documentos de identidad, números de teléfono, etc.

La protección de esta información se puede programar en la aplicación, pero que es lo que sucedería si es que un empleado interno consulta la base de datos, obtiene esos datos y los vende o los entrega a la competencia; bueno pues nuestra seguridad estaría violada y la información que queríamos proteger se encontraría totalmente expuesta. Una solución alterna a esto sería tener la información encriptada dentro de la base de datos, de esta manera la información se encontraría protegida incluso si alguna persona dentro de la organización consulta la base de datos directamente.

Pero como podemos tener la información encriptada dentro de la base de datos; bueno podríamos crear una compleja función que encripte los datos con un complicado algoritmo. Esto no sería muy óptimo ya que el tiempo que pasaríamos creando esta función lo podríamos usar para hacer otras cosas, sin contar que nuestra función puede tener una serie de bugs. SQL Server, a partir de la versión 2005, nos ofrece una variedad de formas para encriptar la información en la base de datos, entre las cuales tenemos:

  • Passphrase
  • Certificate
  • Symmetric key
  • Asymmetric key

Passphrase: Esta es la forma más simple y básica de encriptación de datos que se puede tener en SQL Server. Bajo este método, lo único que se necesita para encriptar los datos es una frase o contraseña “segura”. Deben notar que el asegurar esta frase o contraseña deberá ser el trabajo de ustedes, SQL Server no validara que esta contraseña cumpla con las restricciones de seguridad que Windows establece para las contraseñas de los usuarios. Además si alguien llega a saber la contraseña toda nuestra información quedaría expuesta sin necesidad de tener permisos adicionales más que leer la información de la tabla. Otro posible problema que se puede llegar a tener con este método es que no todos los valores de una columna se encripten con la misma contraseña, en ese caso la información quedaría irrecuperable. Ahora voy a hacer un pequeño ejemplo para demostrar su uso:

-- limpiamos el ambiente
IF (DATABASEPROPERTY('SecureDB','version') > 0)
BEGIN
USE MASTER
ALTER DATABASE
SecureDB SET single_user WITH ROLLBACK IMMEDIATE
DROP DATABASE
SecureDB
END

— Creamos la base de datos de prueba
USE MASTER
GO
CREATE DATABASE SecureDB
GO

—  Usamos nuestra base de datos de demo
USE SecureDB
GO
— Creamos una tabla cliente con una columna TarjetaCredito
— de tipo varbinary para que contenga la informacion encriptada
CREATE TABLE dbo.Cliente
(CodigoCliente INT NOT NULL IDENTITY(1,1)
,
Nombres VARCHAR(100) NOT NULL
,
TarjetaCredito VARBINARY(128))
GO
— insertamos un valor
INSERT INTO dbo.Cliente (Nombres, TarjetaCredito)
VALUES (‘Frank Lampard’, ENCRYPTBYPASSPHRASE(‘EstaEsMiFraseSecreta’,‘1111-1111-1111-1111’))
GO
— Intentamos hacer un select convencional
SELECT CodigoCliente, Nombres, TarjetaCredito
FROM dbo.Cliente
/*
CodigoCliente Nombres        TarjetaCredito
————- ————– ———————
1             Frank Lampard  0x01000000F2884AC9…
*/

— Intentamos hacer un select con una frase incorrecta
SELECT CodigoCliente, Nombres, CONVERT(VARCHAR(50),
DECRYPTBYPASSPHRASE(‘EstaNoEsMiFraseSecreta’,TarjetaCredito))
FROM dbo.Cliente
/*
CodigoCliente Nombres        TarjetaCredito
————- ————– ———————
1             Frank Lampard  NULL
*/

— Ahora hacemos un select con la frase correcta
SELECT CodigoCliente, Nombres, CONVERT(VARCHAR(50), DECRYPTBYPASSPHRASE(‘EstaEsMiFraseSecreta’,TarjetaCredito))
FROM dbo.Cliente
/*
CodigoCliente Nombres        TarjetaCredito
————- ————– ———————
1             Frank Lampard  1111-1111-1111-1111
*/

— Intentamos hacer un select con una frase incorrecta
SELECT CodigoCliente, Nombres, CONVERT(VARCHAR(50),
DECRYPTBYPASSPHRASE(‘EstaNoEsMiFraseSecreta’,TarjetaCredito))
FROM dbo.Cliente
/*
CodigoCliente Nombres        TarjetaCredito
————- ————– ———————
1             Frank Lampard  NULL
*/

— Ahora hacemos un select con la frase correcta
SELECT CodigoCliente, Nombres, CONVERT(VARCHAR(50), DECRYPTBYPASSPHRASE(‘EstaEsMiFraseSecreta’,TarjetaCredito))
FROM dbo.Cliente
/*
CodigoCliente Nombres        TarjetaCredito
————- ————– ———————
1             Frank Lampard  1111-1111-1111-1111
*/

— Intentamos hacer un select con una frase incorrecta
SELECT CodigoCliente, Nombres, CONVERT(VARCHAR(50),
DECRYPTBYPASSPHRASE(‘EstaNoEsMiFraseSecreta’,TarjetaCredito))
FROM dbo.Cliente
/*
CodigoCliente Nombres        TarjetaCredito
————- ————– ———————
1             Frank Lampard  NULL
*/

— Ahora hacemos un select con la frase correcta
SELECT CodigoCliente, Nombres, CONVERT(VARCHAR(50), DECRYPTBYPASSPHRASE(‘EstaEsMiFraseSecreta’,TarjetaCredito))
FROM dbo.Cliente
/*
CodigoCliente Nombres        TarjetaCredito
————- ————– ———————
1             Frank Lampard  1111-1111-1111-1111
*/

Este método adicionalmente tiene una variante para dar un poco mas de seguridad a los datos y es que las funciones ENCRYPTBYPASSPHRASE y DECRYPTBYPASSPHRASE aceptan un tercer parámetro que es el autenticador, el cual tiene que ser colocado para desencriptar la información si es que se encriptó con el autenticador. El autenticador podría ser el usuario que guardo la información, de esta manera cada usuario tendría encriptada su información y esta no sería visible a los demás usuarios. Veamos un ejemplo:

-- insertamos un valor
DECLARE @v_Usuario SYSNAME
SET
@v_Usuario = 'Usuario1'
INSERT INTO dbo.Cliente (Nombres, TarjetaCredito)
VALUES ('Fernando Torres', ENCRYPTBYPASSPHRASE('EstaEsMiFraseSecreta','2222-2222-2222-2222',1,@v_Usuario))
GO

— Intentamos hacer un select convencional
SELECT CodigoCliente, Nombres, TarjetaCredito
FROM dbo.Cliente
/*
CodigoCliente Nombres         TarjetaCredito
————- ————— ———————
1              Frank Lampard   0x01000000F2884AC9…
2              Fernando Torres 0x01000000D0E7D822…
*/

— Ahora hacemos un select con la frase correcta
— y con el autenticador correcto
DECLARE @v_Usuario SYSNAME
SET
@v_Usuario = ‘Usuario1’
SELECT CodigoCliente, Nombres, CONVERT(VARCHAR(50), DECRYPTBYPASSPHRASE(‘EstaEsMiFraseSecreta’,TarjetaCredito,1,@v_Usuario))
FROM dbo.Cliente
/*
CodigoCliente Nombres         TarjetaCredito
————- ————— ———————
1              Frank Lampard   NULL
2              Fernando Torres 2222-2222-2222-2222
*/

Proximamente publicara articulos referentes a los demas tipos de enciptacion de datos que nos da SQL Server.

Written by dbamemories

septiembre 28, 2011 a 10:06 pm

Una respuesta

Subscribe to comments with RSS.

  1. […] encriptación de los datos de una manera mas informada. Si gustan pueden visitar la Parte 2 or la Parte 1 de los post relacionados con este tema. Ahora procederemos a explicar la encriptación basada en […]


Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: