Que tal, este pequeño articulo lo escribo debido a las multiples dudas que surgen con respecto a este tema, espero que sea de gran ayuda y cualquier comentario bienvenido sea. Empecemos.
Niveles de Seguridad
Una de las novedades de SQL Server 2005 es la infraestructura que viene junto al tema de encripcion de datos, SQL Server 2005 trabaja con una infraestructura jerárquica permitiendo un nuevo nivel de seguridad que no existía en versiones anteriores de SQL Server.
La encripcion de datos es un tema importante especialmente para cierto tipo de datos como datos financieros o datos confidenciales de clientes o usuarios. En una aplicación la encriptación y/o de encriptación puede afectar su rendimiento debido al excesivo uso de estos, así que es conveniente el buen uso de estos métodos de encripcion.
Escenario: cuando se desea que los usuarios solo puedan acceder a la información que ellos mismos han ingresado, de esta forma ellos no pueden visualizar no manipular la información de otros usuarios sin autorización previa.

Configurando Jerarquías de encripcion
Con SQL Server 2005 viene un sistema de encripcion jerárquico basado en una clave maestra de servicio (Service Master Key), esta clave es generada automáticamente cuando se instala SQL Server 2005. El motor de base de datos utiliza la clave maestra de servicio para encriptar los siguientes objetos.
Passwords de Servidores Vinculados (Linked Server Passwords)
Cadenas de Conexión (Connection Strings)
Credenciales de Cuentas (Account Credentials)
Todas las Claves maestras de la base de datos
A la clave maestra de servicio se le debe sacar un backup y almacenarla en un sitio seguro y fuera de línea. Esto para poder administrar más fácilmente ya sea hacer bakcups o restaurar la clave maestra de servicio en caso de que sea necesario.
El siguiente nivel en la jerarquía de encripcion es el nivel de base de datos acá se crea la clave maestra de base de datos (Database master key), esta clave es opcional y es utilizada para encriptar certificados y claves en la base de datos.
SQL Server almacena una copia de la clave maestra de base de datos en la base de datos master y a su vez es encriptada con la clave maestra de servicio. Otra copia es almacenada en la base de datos encriptada con un password.
SQL Server 2005 cifra los datos con una infraestructura de cifrado jerárquico y administración de claves. Cada capa cifra la capa inferior utilizando una combinación de certificados, claves asimétricas y claves simétricas.
Creando y Configurando llaves Simétricas, Asimétricas y Certificados
El siguiente nivel en la jerarquía de encripcion es el nivel de datos, el cual nos ofrece dos opciones entre llaves de encripcion: Simétrica y Asimétrica.
Claves simétricas: Una clave simétrica es una clave que se utiliza para el cifrado y el descifrado. El cifrado y el descifrado con una clave simétrica son más rápidos y adecuados para usarlos de forma rutinaria con datos confidenciales de una base de datos.
Una llave simétrica es el mecanismo mas rápido de encripcion para encriptar y des encriptar datos, es ideal para encriptar datos que son frecuentemente accedidos.
Creación de llave simétrica:
CREATE SYMMETRIC KEY key_name WITH ALGORITHM = AES_256 ENCRYPTION BGY PASSWORD=’password’
Para encriptar y des encriptar datos, se utiliza las funciones EncryptByKey y DecryptByKey.
Claves asimétricas: Una clave asimétrica se compone de una clave privada y su correspondiente clave pública. Cada clave puede descifrar los datos que cifra la otra. El cifrado y descifrado asimétrico consumen una cantidad de recursos relativamente elevada, pero proporcionan un nivel de seguridad superior al del cifrado simétrico. Una clave asimétrica se puede utilizar para cifrar una clave simétrica para almacenar en una base de datos.
Una llave asimétrica es una combinación de una llave privada y su correspondiente llave publica. Una llave asimétrica es más fuerte que una llave simétrica.
Creación de llave asimétrica:
CREATE ASYMETRIC KEY key_name WITH ALGORITHM = RSA_2048 ENCRYPTION NY PASSWORD = ‘password’
Para encriptar y des encriptar datos, se utiliza las funciones EncryptByAsmKey y DecryptByAsmKey.
Certificados: Un certificado de clave pública, normalmente denominado sólo certificado, es una instrucción firmada digitalmente que enlaza el valor de una clave pública con la identidad de la persona. Las entidades emisoras de certificados (CA) son las encargadas de emitir y firmar los certificados. La entidad que recibe un certificado de una CA es el sujeto de ese certificado. Por lo general, los certificados contienen la siguiente información.
• La clave pública del sujeto.
• La información que identifica al sujeto, como el nombre y la dirección de correo electrónico.
• El periodo de validez. Es decir, el periodo de tiempo durante el que el certificado se considera válido.
o Un certificado sólo es válido durante el periodo de tiempo que se especifica en el mismo; todos los certificados contienen una fecha Válido desde y otra Válido hasta. Estas fechas establecen los límites del periodo de validez. Cuando el periodo de validez de un certificado ha transcurrido, es necesario que el sujeto del certificado caducado solicite uno nuevo.
• Información de identificador del emisor.
• La firma digital del emisor.
Configurando Certificados
Un certificado de clave pública, normalmente denominado sólo certificado, es una instrucción firmada digitalmente que enlaza el valor de una clave pública con la identidad de la persona, dispositivo o servicio que tiene la clave privada correspondiente.
Creación del certificado:
CREATE CERTIFICARE certifícate_name WITH SUBJECT = ‘certificate_subject’
Para encriptar y des encriptar datos, se utiliza las funciones EncryptByCert y DecryptByCert.
Pasos para la creación de llaves
Creación de la Master Key
Creación de los certificados
Creación de las llaves Simétricas
Pasos para la manipulación de llaves y certificados
Apertura de llaves simétricas
Inserción de datos
Cierre de llaves
Ejemplo: Encripcion de datos
En este ejemplo vamos a crear una nueva base de datos “AccountsDB” con una tabla “AccountsTable” a esta base de datos le vamos a asignar 2 usuarios específicos (Sophie y Allison), a cada uno de estos usuarios se le asignara una llave con la cual podrán insertar datos encriptados en la tabla y de igual forma consultarlos.
Creación de llaves y certificados
1. Creación de usuarios, base de datos, tabla AccountsTable y asignación de permisos
2. Creación De la Master Key
3. Creación de certificados
4. Creación de las claves simétricas que los protegerán
Manipulación de claves
1. Abrir las claves para la sesión de usuario
2. Inserción de datos encriptados
3. Cierre de claves simétricas
Aplicación
1. Creación de usuarios, base de datos, tabla AccountsTable y asignación de permisos
Vamos a crear los usuarios con sus logins (Sophie y Alison), la base de datos llamada “AccountsDB” y una tabla llamada “AccountsTable”.
USE Master
CREATE LOGIN Sophie WITH Password = ‘pass@word1′
CREATE LOGIN Alison WITH Password = ‘pass@word2′
CREATE DATABASE AccountsDB
USE AccountsDB
CREATE USER Sophie FOR LOGIN Sophie
CREATE USER Alison FOR LOGIN Alison
CREATE TABLE AccountsTable (Id Int, Name NvarChar(30),
Dept VarChar(20), Pay_Num VarBinary(60))
2. Prueba de permisos
Verificamos los permisos para uno de lo usuarios y le otorgamos permisos específicos.
EXECUTE AS USER = ’sophie’
SELECT * FROM AccountsTable
REVERT
GRANT SELECT, INSERT ON AccountsTable TO Sophie
GRANT SELECT, INSERT ON AccountsTable TO Alison
3. Creación De la Master Key
Creamos la llave maestra se la base de datos y la encriptamos con un password. Posteriormente la consultamos la existencia de la misma.
CREATE MASTER KEY
ENCRYPTION BY PASSWORD = ‘Passw0rd’
SELECT * FROM sys.symmetric_keys
4. Creación de certificados
A continuación creamos los certificados y les asignamos los usuarios que las van a utilizar.
CREATE CERTIFICATE AccCert1
AUTHORIZATION Sophie WITH SUBJECT = ‘AccCert1′
GO
CREATE CERTIFICATE AccCert2
AUTHORIZATION Alison WITH SUBJECT = ‘AccCert2′
GO
5. Creación de las llaves simétricas que los protegerán
Una vez creados los certificados creamos las llaves simétricas les asignamos un algoritmos de encripcion, el usuario que las utilizara y el certificado que las cobija.
CREATE SYMMETRIC KEY AccKey1
AUTHORIZATION Sophie
WITH ALGORITHM = TRIPLE_DES
ENCRYPTION BY CERTIFICATE AccCert1
GO
CREATE SYMMETRIC KEY AccKey2
AUTHORIZATION Alison
WITH ALGORITHM = TRIPLE_DES
ENCRYPTION BY CERTIFICATE AccCert2
GO
6. Consultar llaves simétricas y certificados
Verificamos la existencia de las llaves y los certificados.
SELECT * FROM sys.symmetric_keys
SELECT * FROM sys.certificates

Una vez creados y configurados los 2 niveles de seguridad, vamos iniciar la inserción de datos encriptados en la tabla creada. Para ello utilizaremos las funciones de encriptado de las llaves.
7. Abre las llaves para la sesión (Sophie) e inserta datos
Iniciamos con Sophie la inserción de datos a este usuario se le asigno anteriormente una llave simétrica con su respectivo certificado, primero el usuario abre la llave y utilizando la función de encriptación de la llave ingresa el campo que desea encriptar. Por ultimo al finalizar el proceso cierra la llave.
EXECUTE AS USER = ‘Sophie’
OPEN SYMMETRIC KEY AccKey1 DECRYPTION BY CERTIFICATE AccCert1
I. Inserta datos encriptados
INSERT INTO AccountsTable VALUES (1, ‘Susan’,‘HR’,
encryptByKey(Key_GUID(‘AccKey1′),‘463758′))
INSERT INTO AccountsTable VALUES (2, ‘Richard’,‘Sales’,
encryptByKey(Key_GUID(‘AccKey1′),‘463435′))
INSERT INTO AccountsTable VALUES (3, ‘Leah’,‘Purchasing’,
encryptByKey(Key_GUID(‘AccKey1′),‘488544′))
II. Cierra las claves simétricas
CLOSE ALL SYMMETRIC KEYS
REVERT
8. Abre las claves para la sesión (Alison) e inserta datos
Se realiza el mismo proceso para Allison, este usuario realiza los mismos pasos que el anterior para la inserción de los datos utilizando la llave que se le asigno.
EXECUTE AS USER = ‘Alison’
OPEN SYMMETRIC KEY AccKey2 DECRYPTION BY CERTIFICATE AccCert2
I. Inserta Datos Encriptados
INSERT INTO AccountsTable VALUES (4, ‘Tim’,‘HR’,
encryptByKey(Key_GUID(‘AccKey2′),‘463756′))
INSERT INTO AccountsTable VALUES (5, ‘David’,‘Sales’,
encryptByKey(Key_GUID(‘AccKey2′),‘499435′))
INSERT INTO AccountsTable VALUES (6, ‘Celia’,‘Purchasing’,
encryptByKey(Key_GUID(‘AccKey2′),‘488894′))
II. Cierra las claves simétricas
CLOSE ALL SYMMETRIC KEYS
REVERT
9. Revisamos el contenido de la tabla AccountsTable
Visualizamos el contenido de la tabla.
SELECT * FROM AccountsTable
Como pudimos ver en la tabla los datos se encuentran encriptados y solo los usuarios con las llaves correctas pueden acceder a esta información.
10. Desencripcion
Ahora cada uno de los usuarios va a observar la información que ingreso, para ello primero debe abrir su llave y utilizando el método de desencripcion correcto visualizar los datos. Por último cierra la llave.
I. Sophie
EXECUTE AS USER = ‘Sophie’
OPEN SYMMETRIC KEY AccKey1 DECRYPTION BY CERTIFICATE AccCert1
SELECT Id, name, Dept,
CONVERT(VarChar,decryptByKey(Pay_Num)) AS Pay_Num
FROM AccountsTable
CLOSE ALL SYMMETRIC KEYS
REVERT

II. Alison
EXECUTE AS USER = ‘Alison’
OPEN SYMMETRIC KEY AccKey2 DECRYPTION BY CERTIFICATE AccCert2
SELECT Id, name, Dept,
CONVERT(VarChar,decryptByKey(Pay_Num)) AS Pay_Num
FROM AccountsTable
CLOSE ALL SYMMETRIC KEYS
REVERT

11. Ejecución con otro certificado
En el caso de que un usuario desee abrir acceder a la información de otro usuario con la llave del segundo se producirá un error ya que la llave ha sido creada solo para el usuario original y no permitirá desencriptar los datos.
EXECUTE AS USER = ‘Sophie’
OPEN SYMMETRIC KEY AccKey2 DECRYPTION BY CERTIFICATE AccCert2
SELECT Id, name, Dept,
CONVERT(VarChar,decryptByKey(Pay_Num)) AS Pay_Num
FROM AccountsTable
REVERT
Pudimos observar los diferentes niveles de seguridad en lo que refiere al tema de encripcion en SQL Server 2005, vimos como funcionan e interactúan cada uno de los objetos relacionados en este tema.
El tema de encripcion de datos es crucial en el almacenamiento de información pero se debe tener cuidado al momento de manejar este tema ya que un mal uso puede llevar a problemas de rendimiento en el motor de bases de datos y posteriormente en las aplicaciones que hacen uso de esta tecnología.
Gerardo Ramos
Microsoft Student Partner
MCTS – SQL Server 2005