Где использовать шифрование SQL на уровне столбцов? - PullRequest
0 голосов
/ 07 декабря 2018

Мне удалось выполнить шифрование столбцов в SQL с помощью следующего кода:

USE EncryptionDemonstration

CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'ThisIsMySampleStrongPassword'

CREATE CERTIFICATE MyServerCertificate WITH SUBJECT = 'This is my Demonstration Certificate'


CREATE SYMMETRIC KEY SSN_Keys  
    WITH ALGORITHM = AES_256  
    ENCRYPTION BY CERTIFICATE MyServerCertificate;  
GO  
CREATE SYMMETRIC KEY CreditCard_Keys  
    WITH ALGORITHM = AES_128  
    ENCRYPTION BY CERTIFICATE MyServerCertificate;  

ALTER TABLE Customer
    ADD SSN_Encrypted varbinary(128),
        CCN_Encrypted varbinary(128)

OPEN SYMMETRIC KEY CreditCard_Keys 
   DECRYPTION BY CERTIFICATE MyServerCertificate 
OPEN SYMMETRIC KEY SSN_Keys 
   DECRYPTION BY CERTIFICATE MyServerCertificate

UPDATE  Customer 
SET SSN_Encrypted = EncryptByKey(Key_GUID('SSN_Keys')  
    , SocialSecurityNumber)

UPDATE  Customer 
SET CCN_Encrypted = EncryptByKey(Key_GUID('CreditCard_Keys  ')  
    , CreditCardNumber)

GO  

OPEN SYMMETRIC KEY SSN_Keys
   DECRYPTION BY CERTIFICATE MyServerCertificate 

OPEN SYMMETRIC KEY CreditCard_Keys
   DECRYPTION BY CERTIFICATE MyServerCertificate 



SELECT SocialSecurityNumber, SSN_Encrypted   
    AS 'Encrypted SSN',  
    CONVERT(varchar, DecryptByKey(SSN_Encrypted))   
    AS 'Decrypted SSN'  
    FROM Customer  

SELECT CreditCardNumber, CCN_Encrypted 
    AS 'Encrypted Credit Card Number',
     CONVERT(varchar, DecryptByKey(CCN_Encrypted))   
     AS 'Decrypted Credit Card Number'
     FROM Customer

Теперь мой вопрос: как это действительно помогает в безопасности, если кто-то, имеющий доступ к этой базе данных, может простозапустить функцию DecryptByKey, чтобы просмотреть расшифрованное значение?Я не полностью знаком с использованием главного ключа базы данных и сертификатов, поэтому, пожалуйста, потерпите меня.

1 Ответ

0 голосов
/ 07 декабря 2018

Ответ таков: каждый может запустить DecryptByKey, но не у всех есть доступ к симметричному ключу, используемому для защиты данных.В SQL Server существует строгая иерархия шифрования , и вы выбрали следующий путь:

  1. Главный ключ базы данных защищен паролем
  2. Сертификат защищен DMK
  3. Симметричный ключ защищен сертификатом
  4. данные, зашифрованные симметричным ключом

enter image description here

Итак, каждый, кто имеет доступк симметричному ключу можно его использовать, но для этого нужно иметь доступ к сертификату, защищающему данный симметричный ключ.Вот почему вы используете:

OPEN SYMMETRIC KEY ... DECRYPTION BY CERTIFICATE ...

Попробуйте создать пользователя, который не имеет доступа к CERTIFICATE, и выполните приведенный выше оператор:

DROP USER IF EXISTS [StackOverflow];

CREATE USER [StackOverflow] WITHOUT LOGIN;

EXECUTE AS USER = 'StackOverflow';

OPEN SYMMETRIC KEY [SK_SecurityUsers_V001] DECRYPTION BY CERTIFICATE [CERT_V001];

REVERT;

Вы получите следующую ошибку:

Msg 15151, Level 16, State 1, Line 7
Cannot find the symmetric key 'SK_SecurityUsers_V001', because it does not exist or you do not have permission.

Таким образом, от вас зависит, кто может использовать симметричный ключ, контролирующий доступ к защищающему его сертификату.И вопрос в том, кто вообще имеет доступ к сертификату?

Диаграмма разрешений показывает более широкую картину, но в основном:

enter image description here

или коротко:

  • sys.admin
  • db_owner
  • создатель сертификата
  • пользователей, которые имеютбыл предоставлен доступ к сертификату

Также кое-что о резервных копиях.Когда вы создаете резервную копию и восстанавливаете ее, например, в другом экземпляре, вам необходимо заново создать иерархию безопасности.По сути, в такой базе данных даже sys.admin не имеет доступа к ключу.

Итак, если кто-то украл вашу резервную копию, данные снова будут защищены.Вам нужно либо создать резервную копию сертификата и восстановить его снова в новой базе данных, либо использовать CERTENCODED для создания того же сертификата.

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

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