Encriptación de Datos en SQL Server - Parte 2 - Memorias de Un DBA
Encriptación de Datos en SQL Server - Parte 2 - Memorias de Un DBA
http://dbamemories.wordpress.com/2011/10/04/encriptacion-de-datos-...
Memorias de un DBA
Un blog dedicado a contribuir a la comunidad SQL Server en espaol
1 de 6
10/05/2013 14:39
http://dbamemories.wordpress.com/2011/10/04/encriptacion-de-datos-...
Creamos una tabla cualquiera con una columna DocNum de tipo varbinary para que contenga la informacion encriptada CREATE TABLE dbo.CerticateEncription (Nombres VARCHAR(100) ,DocNum VARBINARY(128)) GO Creamos una Database Master Key CREATE MASTER KEY ENCRYPTION BY PASSWORD = MiClaveSegura GO Creamos el certicado CREATE CERTIFICATE MiPrimerCerticado WITH SUBJECT=DBAMemories Certicate, EXPIRY_DATE = 12/31/2012 GO Revisamos los certicados que tengo creados en la db SELECT name, pvt_key_encryption_type_desc, subject, expiry_date FROM sys.certicates /* name pvt_key_encryption_type_desc subject expiry_date - - MiPrimerCerticado ENCRYPTED_BY_MASTER_KEY DBAMemories Certicate 2012-12-31 00:00:00.000 */ insertamos un valor INSERT INTO dbo.CerticateEncription (Nombres, DocNum) VALUES (Juan Perez, ENCRYPTBYCERT(CERT_ID(MiPrimerCerticado),12345678)) GO Intentamos hacer un select convencional SELECT Nombres, DocNum FROM dbo.CerticateEncription /* Nombres DocNum - Juan Perez 0x9E363FDB9 */ Ahora seleccionamos los datos pero antes los desencriptamos con el certicado SELECT Nombres, CONVERT(VARCHAR(8),DECRYPTBYCERT(CERT_ID(MiPrimerCerticado),DocNum)) AS DocNum FROM dbo.CerticateEncription /* Nombres DocNum - Juan Perez 12345678 */ Creamos un usuario de prueba
2 de 6
10/05/2013 14:39
http://dbamemories.wordpress.com/2011/10/04/encriptacion-de-datos-...
CREATE LOGIN [Usuario1] WITH PASSWORD = N123 GO CREATE USER [Usuario1] FOR LOGIN [Usuario1] GO GRANT SELECT ON dbo.CerticateEncription TO Usuario1 GO Probamos seleccionar la informacion con el certicado EXECUTE AS USER = Usuario1 SELECT Nombres, CONVERT(VARCHAR(8),DECRYPTBYCERT(CERT_ID(MiPrimerCerticado),DocNum)) AS DocNum FROM dbo.CerticateEncription; REVERT /* Nombres DocNum - Juan Perez NULL */ Como se puede ver la informacion sale como NULL debido a que no tenemos permiso para usuar el certicado como el Usuario1 Para poder hacer uso del certicado debemos tener el permiso de control sobre el certicado. Ahora asignaremos ese permiso al Usuario1 GRANT CONTROL ON CERTIFICATE::[MiPrimerCerticado] TO [Usuario1] GO Probamos nuevamente seleccionar la informacion con el certicado EXECUTE AS USER = Usuario1 SELECT Nombres, CONVERT(VARCHAR(8),DECRYPTBYCERT(CERT_ID(MiPrimerCerticado),DocNum)) AS DocNum FROM dbo.CerticateEncription; REVERT /* Nombres DocNum - Juan Perez 12345678 */ Como vemos ahora la informacion si aparece. Es muy importante mencionar que los certicados deben tener una copia de seguridad como la base de datos misma debido a que en el caso de que perdamos el certicado solo esa copia de seguridad nos podr asegurar la recuperacin de toda la data encriptada con ese certicado, caso contrario, la informacin permanecer perdida debido a que ya no se tiene el mismo certicado que la encript. Ahora veremos un ejemplo de cmo sacarle una copia de seguridad al certicado y simularemos la prdida del mismo y los distintos escenarios para la recuperacin de la informacin. USE SecureDB GO
3 de 6
10/05/2013 14:39
http://dbamemories.wordpress.com/2011/10/04/encriptacion-de-datos-...
-- Sacaremos una copia de seguridad del certificado BACKUP CERTIFICATE MiPrimerCertificado TO FILE = 'D:\DBAMemories \MiPrimerCertificado.cert' WITH PRIVATE KEY ( FILE = 'D:\DBAMemories\MiPrimerCertificado.key' , ENCRYPTION BY PASSWORD = 'pass' ); GO -- Ahora perderemos el certificado. DROP CERTIFICATE MiPrimerCertificado GO -- Podemos confirmar que nuestro certificado no esta y no podemos desencriptar nuestra informacion SELECT Nombres, CONVERT(VARCHAR(8),DECRYPTBYCERT(CERT_ID('MiPrimerCertificado'),DocNum)) AS DocNum FROM dbo.CertificateEncription /* Nombres DocNum ---------- -------------Juan Perez NULL */ -- Ahora que se puede hacer, bueno se puede pensar que -- si se crea nuevamente el certificado, todo funcionara nuevamente. Veamos -- Creamos el certificado CREATE CERTIFICATE MiPrimerCertificado WITH SUBJECT='DBAMemories Certificate', EXPIRY_DATE = '12/31/2012' GO -- Probamos desencriptar la informacion SELECT Nombres, CONVERT(VARCHAR(8),DECRYPTBYCERT(CERT_ID('MiPrimerCertificado'),DocNum)) AS DocNum FROM dbo.CertificateEncription /* Nombres DocNum ---------- -------------Juan Perez NULL */ ----Que paso? Por que no funciono? Debido a que el certificado que se uso no es el mismo que encripto la informacin, a pesar de que se creo el certificado con la misma sentencia
-- Volvemos a eliminar el certificado DROP CERTIFICATE MiPrimerCertificado GO -- Ahora restauramos el certificado desde nuestra copia de seguridad CREATE CERTIFICATE MiPrimerCertificado
4 de 6
10/05/2013 14:39
http://dbamemories.wordpress.com/2011/10/04/encriptacion-de-datos-...
FROM FILE = 'D:\DBAMemories\MiPrimerCertificado.cert' WITH PRIVATE KEY (FILE = 'D:\DBAMemories\MiPrimerCertificado.key', DECRYPTION BY PASSWORD = 'pass'); GO -- Finalmente volvemos a consultar la informacion SELECT Nombres, CONVERT(VARCHAR(8),DECRYPTBYCERT(CERT_ID('MiPrimerCertificado'),DocNum)) AS DocNum FROM dbo.CertificateEncription /* Nombres DocNum ---------- -------------Juan Perez 12345678 */ -- Y como podemos observar nuestra informacion volvio a estar disponible.
Escrito por dbamemories octubre 4, 2011 a 9:28 pm Escrito en Encriptacin, SQL Server Database, T-SQL Etiquetado con DECRYPTBYCERT, Encriptacin, ENCRYPTBYCERT
5 comentarios
Suscrbete a los comentarios mediante RSS. [...] hp://dbamemories.wordpress.com/2011/10/04/encriptacion-de-datos-en-sql-server%E2%80%93-parte-2/ October 5, 2011 // MsSQL // No Comments // [...] Encriptacin de datos en SQL Server Parte 2 DbRunas Noticias y Recursos sobre Bases de Datos octubre 5, 2011 a 2:48 pm
5 de 6
10/05/2013 14:39
http://dbamemories.wordpress.com/2011/10/04/encriptacion-de-datos-...
Responder [...] sobre la encriptacin 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 [...] Encriptacin de datos en SQL Server Parte 3 Memorias de un DBA octubre 14, 2011 a 9:33 pm Responder me ayudo mucho para mi tarea drake jon vides vidu junio 29, 2012 a 12:45 pm Responder Me da gusto ser de ayuda. dbamemories julio 18, 2012 a 9:37 pm Responder Muy buen tutorial, muy til, muy prctico y muy claro, muchas gracias. Enrique Luna octubre 4, 2012 a 11:04 am Responder
6 de 6
10/05/2013 14:39