Sql Server 2008R2 Enterprise с шифрованием данных - резервное копирование и восстановление - PullRequest
0 голосов
/ 27 марта 2012

У меня есть БД, на которой я включил симметричное шифрование, чтобы зашифровать некоторые столбцы. Я создал SP для включения шифрования после создания базы данных из сценария, как показано ниже

CREATE PROCEDURE [dbo].[sys_EnableSymmetricEncryption]
AS
BEGIN
--If there is no master key, create one now. 
IF NOT EXISTS 
  (SELECT * FROM sys.symmetric_keys WHERE symmetric_key_id = 101)
  CREATE MASTER KEY ENCRYPTION BY 
  PASSWORD = '9809u0ij989oih9o8yyo98yyo89uyp9p9'

CREATE CERTIFICATE My_Certificate
  WITH SUBJECT = 'My Database';

CREATE SYMMETRIC KEY My_Key_01
  WITH ALGORITHM = AES_256
  ENCRYPTION BY CERTIFICATE My_Certificate;
END 

Итак, после создания базы данных из сценария, я запускаю это и могу хранить данные в зашифрованных столбцах
с

INSERT INTO [dbo].[Cards]
      ([CardNumber]
      ,[CardSecurityCode]
      ,[CardExpirationDate]
      ,[NameOnCard])
 VALUES
  (EncryptByKey(Key_GUID('My_Key_01'), @CardNumber) ,
  EncryptByKey(Key_GUID('My_Key_01'), @CardSecurityCode) ,
  EncryptByKey(Key_GUID('My_Key_01'), @CardExpirationDate) ,
  EncryptByKey(Key_GUID('My_Key_01'), @NameOnCard))

и получить данные с помощью

OPEN SYMMETRIC KEY My_Key_01
   DECRYPTION BY CERTIFICATE My_Certificate;

SELECT [CardID]
      ,CONVERT(nvarchar, DecryptByKey([CardNumber])) as 'CardNumber'
      ,CONVERT(nvarchar, DecryptByKey([CardSecurityCode])) as 'CardSecurityCode'
      ,CONVERT(nvarchar, DecryptByKey([CardExpirationDate])) as 'CardExpirationDate'
      ,CONVERT(nvarchar, DecryptByKey([NameOnCard])) as 'NameOnCard'
    FROM [Cards]

Все работает хорошо, пока я не создам резервную копию БД и не попытаюсь восстановить резервную копию на другом сервере. После восстановления, когда я пытаюсь запустить Select (как указано выше), я получаю эту ошибку

Please create a master key in the database or open the master key in the session before performing this operation.

Итак, я пытался воссоздать ключ с помощью

IF NOT EXISTS 
  (SELECT * FROM sys.symmetric_keys WHERE symmetric_key_id = 101)
  CREATE MASTER KEY ENCRYPTION BY 
  PASSWORD = '9809u0ij989oih9o8yyo98yyo89uyp9p9'

Но затем при выборе In все равно появляется та же ошибка. Если я пытаюсь запустить первый Sp, показанный выше, чтобы создать мастер-ключ, сертификат и симметричный ключ, я получаю ошибку

Msg 15581, Level 16, State 3, Procedure sys_EnableSymmetricEncryption, Line 11 Please create a master key in the database or open the master key in the session before performing this operation. Msg 15282, Level 16, State 1, Procedure sys_EnableSymmetricEncryption, Line 14 A key with name 'OneTest_Key_01' or user defined unique identifier already exists or you do not have permissions to create

Может быть, я должен попытаться удалить сертификат и симметричный ключ, прежде чем пытаться их создать, но я не знаю, где они находятся.

Есть идеи, как с этим справиться?

Спасибо

PS Если я восстановлю на том же сервере, даже на другой базе данных, все будет отлично работать

1 Ответ

1 голос
/ 27 марта 2012

Попробуйте запустить:

ALTER MASTER KEY REGENERATE WITH ENCRYPTION BY PASSWORD = '9809u0ij989oih9o8yyo98yyo89uyp9p9';
...