Шифрование столбцов SQL - PullRequest
       6

Шифрование столбцов SQL

2 голосов
/ 13 февраля 2011

Лично я считаю, что шифрование столбцов SQL является огромной тратой ;-), но оно должно быть реализовано в связи с потребностями клиентов.Итак, мои вопросы:

  1. Что на самом деле это делает - администратор увидит зашифрованные данные, но приложение увидит данные в виде открытого текста?
  2. Что происходит с данными при получениирезервное копирование?Я предполагаю, что резервные копии остаются зашифрованными, и в этом случае они пригодны для использования, если нам нужно восстановить данные на другом сервере?
  3. Откуда на самом деле берется ключ шифрования?
  4. Можно ли указать фиксированное шифрованиеключ, так что по крайней мере восстановление базы данных будет легко работать на сервере, на который я перееду.Я действительно не хочу какой-либо алгоритм магического ключа, который стреляет мне в ногу в будущем, когда ключ внезапно становится недоступным.

Ответы [ 3 ]

3 голосов
/ 13 февраля 2011

Если клиент настаивает на шифровании столбца, но вы не знаете, откуда на самом деле будет ключ, ваш клиент тратит свои деньги, а вы - его время. Тем более, если вы даже думаете о фиксированных ключах.

В MSDN имеется исчерпывающее объяснение, объясняющее ключ иерархия шифрования . Все схемы имеют цепочку ключей, коренящуюся либо в DPAPI для случая, когда сама служба должна обращаться к зашифрованному хранилищу без любого ключа, предоставленного пользователем, либо в пароле, явно предоставленном пользователем.

Шифрование - это мера, применяемая для смягчения конкретных угроз безопасности. В зависимости от того, что представляют собой эти угрозы (они нигде не указаны в вашем сообщении), шифрование на уровне столбца может быть правильным ответом, но почти всегда развертывание Transparent Database Encryption является гораздо лучшим решением.

Не существует схемы шифрования, которая могла бы скрывать контент от администратора, который хочет видеть контент. Период. Каждое решение, которое утверждает обратное, - змеиное масло.

2 голосов
/ 13 февраля 2011

http://msdn.microsoft.com/en-us/library/ms179331.aspx

Вы можете создать симметричный ключ для шифрования данных и использовать строку для его создания (с опцией KEY_SOURCE), которая позволит вам воссоздать его позже (этого нет в связанном примере, бит находится в документации) , Это должно быть открыто для доступа к фактическим данным. Это защищено сертификатом, который в свою очередь защищен главным ключом базы данных. НЕ теряйте пароль для вашего главного ключа базы данных. Главный ключ базы данных защищен ключом сервера, поэтому при восстановлении на другом сервере необходимо открыть главный ключ базы данных с паролем и повторно зашифровать с помощью главного ключа службы нового сервера.

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

-- backup service master key tied to computer (used to decrypt database master password,
-- if this is the same on two servers you can move the database between them)
BACKUP SERVICE MASTER KEY TO FILE = 'C:\ServiceMasterKey.smk' 
    ENCRYPTION BY PASSWORD = 'topsecret'
go
-- create database master key
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'dbpassword'
go
-- create certificate to use to encrypt symmetric key
CREATE CERTIFICATE TestCertificate WITH SUBJECT = 'Test Certificate', 
    EXPIRY_DATE = '01/01/2016'
go
-- create symmetric key to encrypt data
CREATE SYMMETRIC KEY TestKey WITH ALGORITHM = TRIPLE_DES, 
    KEY_SOURCE ='pass_phrase' ENCRYPTION BY CERTIFICATE TestCertificate
go
create table CCInfo (ID int, Plain varchar(16), Encrypted varbinary(128))
go
insert into CCInfo (ID, Plain) values (1, '1234567890ABCDEF')
insert into CCInfo (ID, Plain) values (2, '1234123412341234')
insert into CCInfo (ID, Plain) values (3, '1234567890ABCDEF')
insert into CCInfo (ID, Plain) values (4, '1111111123456789')
go
-- encrypt credit card data
OPEN SYMMETRIC KEY TestKey DECRYPTION BY CERTIFICATE TestCertificate
update CCInfo set Encrypted = EncryptByKey(Key_GUID('TestKey'), Plain)
CLOSE SYMMETRIC KEY TestKey
go
-- check that data is the same
OPEN SYMMETRIC KEY TestKey DECRYPTION BY CERTIFICATE TestCertificate
select ID, Plain, Encrypted, convert(varchar(16), DecryptByKey(Encrypted)) as Decrypted
from CCInfo
CLOSE SYMMETRIC KEY TestKey
0 голосов
/ 13 февраля 2011

Несколько замечаний:

  • Это называется шифрованием на уровне ячейки, и это ручной процесс - вы не можете просто пометить столбец как «зашифрованный»
  • Для этого может потребоваться доступ к службам сертификации, которые несут свой собственный набор проблем и накладных расходов (я не уверен в этом, это может зависеть от того, используете ли вы AD)

Чтобы ответить на вашконкретные вопросы:

  1. Никто не видит незашифрованные данные непосредственно в базе данных - вы должны использовать хранимую процедуру для шифрования и дешифрования данных.Сам столбец должен быть преобразован в столбец varbinary.Я считаю, что доступ можно контролировать как на основе ключа, так и на основе хранимых процедур.
  2. Данные резервируются в виде столбца varbinary.
  3. Ключ шифрования генерируется в базе данных кем-то с соответствующимразрешения
  4. я так думаю?Последняя часть этого учебника по шифрованию должна дать вам представление о том, что влечет за собой.

Дополнительную информацию можно найти в документации MSDN Database Encryption .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...