2016-03-02 3 views
0

Я просто запустить следующий тест, и я глубоко смущен:Симметричного шифрования по ключу поведению

Я создал таблицу, как так:

CREATE TABLE [dbo].[enxtest](
    [id] [int] NOT NULL, 
    [cleara] [varchar](50) NULL, 
    [encrypta] [varbinary](2000) NULL, 
    [clearb] [varchar](50) NULL, 
CONSTRAINT [PK_enxtest] PRIMARY KEY CLUSTERED 
(
    [id] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

GO 

Я населенный его с данными, как так:

id | cleara  | encrypta | clearb 
1 | teststring!1 | NULL  | NULL 
2 | teststring!1 | NULL  | NULL 
3 | teststring!2 | NULL  | NULL 
4 | teststring!2 | NULL  | NULL 

Я побежал сценарий, чтобы зашифровать содержимое cleara, по одному с помощью симметричного ключа SQL Server и пару сертификатов, как это (только соответствующий код, sproc внутренних органов) и вставьте зашифрованное значение в е ncrypta поле:

OPEN SYMMETRIC KEY THIS_IS_THE_KEY 
    DECRYPTION BY CERTIFICATE THIS_IS_THE_CERT 
CONVERT(varbinary(2000), EncryptByKey(Key_GUID('THIS_IS_THE_KEY'), cleara), 1) 

Затем мы удалили мастер-ключ базы данных, симметричный ключ и сертификат и воссоздали их, давая им такое же имя, что было раньше. Я запустил скрипт для дешифрования varbinary аналогично приведенному выше шифровальному коду и вставил его в clearb.

Этот запрос дает мне следующие результаты:

SELECT id, cleara, clearb 
FROM enxtest; 

id | cleara  | encrypta | clearb 
1 | teststring!1 | NULL  | teststring!1 
2 | teststring!1 | NULL  | teststring!1 
3 | teststring!2 | NULL  | teststring!2 
4 | teststring!2 | NULL  | teststring!2 

Вопросы:

  1. Как это возможно? Я ожидал получить clearb == clearb, но clearb! = Cleara. Я надеялся, что смена ключей приведет к неизменно неправильным значениям varchar.
  2. Есть ли способ восстановить резервную копию на другой сервер, оставив двоичные данные в таблицах нетронутыми, создав новые ключи, которые надежно расшифруют эти данные до непротиворечивых, но некорректных значений (по сравнению с исходным значением чистого текста)?

Редактировать: Вот полный скрипт, который мы запускали партиями.

--Batch 1 
declare @e1 varbinary(2000); 
declare @c1 varchar(50); 
select @c1 = cleara from enxtest where id = 1; 
exec dbo.spEncryptString @cleartextString = @c1, @encryptedString = @e1 OUTPUT; 

declare @e2 varbinary(2000); 
declare @c2 varchar(50); 
select @c2 = cleara from enxtest where id = 2; 
exec dbo.spEncryptString @cleartextString = @c2, @encryptedString = @e2 OUTPUT; 

declare @e3 varbinary(2000); 
declare @c3 varchar(50); 
select @c3 = cleara from enxtest where id = 3; 
exec dbo.spEncryptString @cleartextString = @c3, @encryptedString = @e3 OUTPUT; 

declare @e4 varbinary(2000); 
declare @c4 varchar(50); 
select @c4 = cleara from enxtest where id = 4; 
exec dbo.spEncryptString @cleartextString = @c4, @encryptedString = @e4 OUTPUT; 

update enxtest 
set encrypta = @e1 
where id = 1; 

update enxtest 
set encrypta = @e2 
where id = 2; 

update enxtest 
set encrypta = @e3 
where id = 3; 

update enxtest 
set encrypta = @e4 
where id = 4; 


/* 
--Batch 2 
drop symmetric key THIS_IS_THE_KEY; 
drop certificate THIS_IS_THE_CERT; 
drop master key; 

create master key encryption by password = 'somepassword'; 
create certificate THIS_IS_THE_CERT with subject = 'subject' expiry_date = '20161231'; 
create symmetric key THIS_IS_THE_KEY with algorithm = AES_256 
    key_source = 'source' identity_value = 'identity' encryption by certificate THIS_IS_THE_CERT; 
*/ 

--Batch 3 
declare @e1 varbinary(2000); 
declare @c1 varchar(50); 
select @e1 = encrypta from enxtest where id = 1; 
exec dbo.spDecryptString @encryptedString = @e1, @cleartextString = @c1 OUTPUT; 

declare @e2 varbinary(2000); 
declare @c2 varchar(50); 
select @e2 = encrypta from enxtest where id = 2; 
exec dbo.spDecryptString @encryptedString = @e2, @cleartextString = @c2 OUTPUT; 

declare @e3 varbinary(2000); 
declare @c3 varchar(50); 
select @e3 = encrypta from enxtest where id = 3; 
exec dbo.spDecryptString @encryptedString = @e3, @cleartextString = @c3 OUTPUT; 

declare @e4 varbinary(2000); 
declare @c4 varchar(50); 
select @e4 = encrypta from enxtest where id = 4; 
exec dbo.spDecryptString @encryptedString = @e4, @cleartextString = @c4 OUTPUT; 

update enxtest 
set clearb = @c1 
where id = 1; 

update enxtest 
set clearb = @c2 
where id = 2; 

update enxtest 
set clearb = @c3 
where id = 3; 

update enxtest 
set clearb = @c4 
where id = 4; 

--Check 
select * from enxtest; 
+0

Это кажется странным. У вас есть полный скрипт? –

+0

Я делаю, я опубликую редактирование утром. – saarrrr

+0

@BenThul Я добавил полный скрипт, который мы запускали, отпустил в партии. – saarrrr

ответ

1

Вы не совсем производить REPRO скрипт (например, у меня нет тела хранимой процедуры), но я вижу проблему. Когда вы создаете симметричный ключ с тем же параметром KEY_SOURCE, вы по существу создаете тот же самый ключ. Как только вы это знаете, исправление прост - при каждом создании ключа выдается другое значение для KEY_SOURCE.

Смежные вопросы