viernes, 9 de octubre de 2020

COPIA DE SEGURIDAD (BACKUP) DE CERTIFICADO EN SQL SERVER Y RESTAURACIÓN DEL CERTIFICADO

Posted by InfoTacticas Soluciones  |  No comments

Los certificados deben tener una copia de seguridad como la base de datos misma debido a que en el caso de que perdamos el certificado solo esa copia de seguridad nos podrá asegurar la recuperación de toda la data encriptada con ese certificado, caso contrario, la información permanecerá perdida debido a que ya no se tiene el mismo certificado que la encriptó.
Breve Ejemplo de creación de certificado y registro de datos encriptados.

  1. IF (DATABASEPROPERTY('FinancieraDemoBD','version') > 0)
  2. BEGIN
  3. USE MASTER
  4. ALTER DATABASE FinancieraDemoBD SET single_user WITH ROLLBACK IMMEDIATE
  5. DROP DATABASE FinancieraDemoBD
  6. END
  7.  
  8.  
  9. -- Creamos la Base de Datos de prueba
  10. use master
  11. GO
  12.  
  13. create database FinancieraDemoBD
  14. GO
  15.  
  16. -- Usamos la Base de Datos de Prueba
  17. use FinancieraDemoBD
  18. GO
  19.  
  20. -- Creamos una tabla cliente con las columnas Nombre y NombreCorto
  21. -- de tipo varbinary para que contenga la informacion encriptada
  22. CREATE TABLE [dbo].[CLIENTE](
  23. [IDCLIENTE] [int] IDENTITY(1,1) NOT NULL,
  24. [FECING] [datetime] NULL,
  25. [USUING] [varchar](6) NULL,
  26. [FECACT] [datetime] NULL,
  27. [USUACT] [varchar](6) NULL,
  28. [NOMBRE] [varbinary](max) NOT NULL,
  29. [NOMBRECORTO] [varbinary](max) NULL,
  30. PRIMARY KEY CLUSTERED
  31. (
  32. [IDCLIENTE] ASC
  33. )
  34. ) ON [PRIMARY]
  35.  
  36. GO
  37.  
  38.  
  39.  
  40. -- Crear una Database Master Key
  41. CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'ClaveSecretaINFO2020'
  42. GO
  43.  
  44. -- Crear el Certificado
  45. CREATE CERTIFICATE FinancieraCertificado WITH SUBJECT='INFOTACTICAS Certificate',
  46. EXPIRY_DATE = '20211231'
  47. GO
  48.  
  49.  
  50. -- Consultar los certificados creados en la base de datos
  51. SELECT name, pvt_key_encryption_type_desc, subject, expiry_date
  52. FROM sys.certificates
  53. /*
  54. name pvt_key_encryption_type_desc subject expiry_date
  55. FinancieraCertificado ENCRYPTED_BY_MASTER_KEY INFOTACTICAS Certificate 2021-12-31 00:00:00.000
  56. */
  57.  
  58.  
  59. -- Insertar un valor
  60. INSERT INTO dbo.CLIENTE (FECING, USUING, NOMBRE, NOMBRECORTO)
  61. VALUES (getdate(), 'IRE001', ENCRYPTBYCERT(CERT_ID('FinancieraCertificado'),'CARLOS FLORES RIOS'), ENCRYPTBYCERT(CERT_ID('FinancieraCertificado'),'CARLOS FLORES'))
  62. GO
  63. -- Select convencional
  64. SELECT IDCLIENTE, NOMBRE, NOMBRECORTO, FECING
  65. FROM dbo.CLIENTE
  66. /*
  67. IDCLIENTE NOMBRE NOMBRECORTO FECING
  68. 1 0xC118457BFAA... 0xEF308BFC78424F717... 2020-10-08 23:47:39.520
  69. */
  70.  
  71.  
  72. -- Select desencriptando los datos con el certificado correcto
  73. SELECT IDCLIENTE, CONVERT(VARCHAR(100), DECRYPTBYCERT(CERT_ID('FinancieraCertificado'),NOMBRE)) as 'NOMBRE',
  74. CONVERT(VARCHAR(70), DECRYPTBYCERT(CERT_ID('FinancieraCertificado'),NOMBRECORTO)) as 'NOMBRECORTO',
  75. FECING
  76. FROM dbo.CLIENTE
  77. /*
  78. IDCLIENTE NOMBRE NOMBRECORTO FECING
  79. 1 CARLOS FLORES RIOS CARLOS FLORES 2020-10-08 23:47:39.520
  80. */

Ejemplo de cómo sacarle una copia de seguridad al certificado.
  1. USE FinancieraDemoBD
  2. GO
  3.  
  4. -- Sacar una copia de seguridad del certificado
  5. BACKUP CERTIFICATE FinancieraCertificado TO FILE = 'D:\BACKUPS\PERSONAL\FinancieraCertificado.cer'
  6. WITH PRIVATE KEY ( FILE = 'D:\BACKUPS\PERSONAL\FinancieraCertificado.key' ,
  7. ENCRYPTION BY PASSWORD = 'TopSecretINFO2020' );
  8. GO
  9.  
Se borrará el certificado para simular su pérdida en escenarios donde se hace un backup de la base de datos y se restaurá en otro servidor y dicho certificado no se guardó con el backup.
  1. -- Eliminar el certificado.
  2. DROP CERTIFICATE FinancieraCertificado
  3. GO
  4.  
  5.  
  6. -- Podemos confirmar que nuestro certificado no esta y no podemos desencriptar nuestra informacion
  7. SELECT name, pvt_key_encryption_type_desc, subject, expiry_date
  8. FROM sys.certificates
  9.  
  10. SELECT IDCLIENTE, CONVERT(VARCHAR(100), DECRYPTBYCERT(CERT_ID('FinancieraCertificado'),NOMBRE)) as 'NOMBRE',
  11. CONVERT(VARCHAR(70), DECRYPTBYCERT(CERT_ID('FinancieraCertificado'),NOMBRECORTO)) as 'NOMBRECORTO',
  12. FECING
  13. FROM dbo.CLIENTE
  14.  
  15. /*
  16. IDCLIENTE NOMBRE NOMBRECORTO FECING
  17. 1 NULL NULL 2020-10-08 23:47:39.520
  18. */
Probaremos a crear nuevamente el certificado a ver si todo funcionara nuevamente.
  1. -- Creamos el certificado
  2. CREATE CERTIFICATE FinancieraCertificado WITH SUBJECT='INFOTACTICAS Certificate',
  3. EXPIRY_DATE = '20211231'
  4. GO
  5.  
  6. -- Probamos desencriptar la informacion
  7. SELECT IDCLIENTE, CONVERT(VARCHAR(100), DECRYPTBYCERT(CERT_ID('FinancieraCertificado'),NOMBRE)) as 'NOMBRE',
  8. CONVERT(VARCHAR(70), DECRYPTBYCERT(CERT_ID('FinancieraCertificado'),NOMBRECORTO)) as 'NOMBRECORTO',
  9. FECING
  10. FROM dbo.CLIENTE
  11. /*
  12. IDCLIENTE NOMBRE NOMBRECORTO FECING
  13. 1 NULL NULL 2020-10-08 23:47:39.520
  14. */
Sin embargo, no funcionó debido a que el certificado que se usó no es el mismo que encripto la información, a pesar de que se creó el certificado con la misma instrucción. Volveremos a eliminar el certificado y restaurarlo desde el backup.
  1. -- Volvemos a eliminar el certificado
  2. DROP CERTIFICATE FinancieraCertificado
  3. GO
  4.  
  5. -- Ahora restauramos el certificado desde nuestra copia de seguridad
  6. CREATE CERTIFICATE FinancieraCertificado
  7. FROM FILE = 'D:\BACKUPS\PERSONAL\FinancieraCertificado.cer'
  8. WITH PRIVATE KEY (FILE = 'D:\BACKUPS\PERSONAL\FinancieraCertificado.key',
  9. DECRYPTION BY PASSWORD = 'TopSecretINFO2020');
  10. GO
  11.  
  12. -- Finalmente volvemos a consultar la informacion
  13. SELECT IDCLIENTE, CONVERT(VARCHAR(100), DECRYPTBYCERT(CERT_ID('FinancieraCertificado'),NOMBRE)) as 'NOMBRE',
  14. CONVERT(VARCHAR(70), DECRYPTBYCERT(CERT_ID('FinancieraCertificado'),NOMBRECORTO)) as 'NOMBRECORTO',
  15. FECING
  16. FROM dbo.CLIENTE

La clave especificada en: DECRYPTION BY PASSWORD = 'TopSecretINFO2020' tiene que ser la misma que la especificada en: ENCRYPTION BY PASSWORD = 'TopSecretINFO2020' y no tiene que se la misma que se usó al crear la MASTER KEY en: CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'ClaveSecretaINFO2020'

10/09/2020 10:52:00 a. m. Share:

0 comentarios:

Get updates in your email box
Complete the form below, and we'll send you the best coupons.

Deliver via FeedBurner