Являются ли функции шифрования SQL Server детерминированными?
Я изучаю шифрование SQL Server, и у меня есть вопрос относительно детерминированного поведения.
Являются ли функции шифрования SQL Server детерминированными? Зависит ли это от версии (2005,..., 2017)?
Я имею в виду не функцию "Всегда зашифровано", а такие функции, как encryptedbykey
,
1 ответ
Прежде всего, это можно проверить очень легко. Вы можете просто зашифровать одно и то же значение два раза и проверить, совпадают ли выходные данные. Используйте код ниже:
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '23987hxJ#KL95234nl0zBe';
CREATE CERTIFICATE [CERT_Stackru]
WITH SUBJECT = 'example';
CREATE SYMMETRIC KEY [SK_Stackru]
WITH ALGORITHM = AES_256
ENCRYPTION BY CERTIFICATE [CERT_Stackru];
GO
OPEN SYMMETRIC KEY [SK_Stackru] DECRYPTION BY CERTIFICATE [CERT_Stackru];
SELECT EncryptByKey(Key_GUID('SK_Stackru'), 'stackru');
SELECT EncryptByKey(Key_GUID('SK_Stackru'), 'stackru');
DROP SYMMETRIC KEY [SK_Stackru];
DROP CERTIFICATE [CERT_Stackru];
DROP MASTER KEY;
Таким образом, результат заключается в том, что функция ENCRYPTBYKEY не является детерминированной.
Зачем? Это будет очень легко грубой силой, если бы не было. И если вам интересно, что происходит за кулисами, вы можете проверить следующую статью. В основном, выходной текст рассчитывается так:
CipherTextMessage: = KeyGUID + EncryptionHeader + EncryptedMessage
где:
- KeyGUID: = {16 байт} Key_guid. Этот GUID служит идентификатором ключа и хранится в метаданных (SELECT key_guid FROM sys.symmetric_keys). Он используется во время расшифровки для поиска соответствующего ключа в кольце для ключей. Вот почему, когда мы используем DECRYPTBYKEY, мы не используем его для указания ключа, используемого при шифровании
EncryptedMessage рассчитывается как:
EncryptedMessage: = InitializationVector + _EncryptFunction (SymKey, InitializationVector, InnerMessage)
И ключ InitializationVector
который:
InitializationVector: = {1 блок} длина этого поля зависит от используемого алгоритма. Все ключи семейства AES будут иметь размер 16 байт на блок, а ключи семейства DES - 8 байт на блок. Векторы инициализации используются для инициализации алгоритма блока. Он не предназначен для того, чтобы быть секретом, но должен быть уникальным для каждого вызова функции шифрования во избежание выявления шаблонов.
Если вас интересует функция детерминированного шифрования из-за создания индекса, например, для оптимизации поиска, и вы не хотите использовать Always Encrypted из-за всех его ограничений, я могу рассказать вам, как можно создавать / моделировать детерминированный шифрование с использованием иерархии безопасности SQL Server.