У меня есть БД, на которой я включил симметричное шифрование, чтобы зашифровать некоторые столбцы.
Я создал 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 Если я восстановлю на том же сервере, даже на другой базе данных, все будет отлично работать