1. Encriptación parte 1
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
2. – 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
————- ————– ———————
3. 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
4. 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 dat