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

Итак, каждый, кто имеет доступк симметричному ключу можно его использовать, но для этого нужно иметь доступ к сертификату, защищающему данный симметричный ключ.Вот почему вы используете:
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.
Таким образом, от вас зависит, кто может использовать симметричный ключ, контролирующий доступ к защищающему его сертификату.И вопрос в том, кто вообще имеет доступ к сертификату?
Диаграмма разрешений показывает более широкую картину, но в основном:

или коротко:
- sys.admin
- db_owner
- создатель сертификата
- пользователей, которые имеютбыл предоставлен доступ к сертификату
Также кое-что о резервных копиях.Когда вы создаете резервную копию и восстанавливаете ее, например, в другом экземпляре, вам необходимо заново создать иерархию безопасности.По сути, в такой базе данных даже sys.admin
не имеет доступа к ключу.
Итак, если кто-то украл вашу резервную копию, данные снова будут защищены.Вам нужно либо создать резервную копию сертификата и восстановить его снова в новой базе данных, либо использовать CERTENCODED для создания того же сертификата.
Это просто касается поверхности, очень хорошо спланируйтелюбой аспект перед зашифровкой данных (например, индекс зашифрованных столбцов бесполезен, поскольку к каждому значению при шифровании добавляется случайная соль - шифруйте одно значение несколько раз, и каждый раз вы будете получать разные двоичные файлы).