Являются ли функции шифрования SQL Server детерминированными? - PullRequest
0 голосов
/ 02 февраля 2019

Я изучаю шифрование SQL Server и у меня возник вопрос о детерминированном поведении.

Являются ли функции шифрования SQL Server детерминированными?Зависит ли это от версии (2005, ..., 2017)?

Я имею в виду не функцию «Всегда зашифровано», а такие функции, как encryptedbykey.

1 Ответ

0 голосов
/ 02 февраля 2019

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

CREATE MASTER KEY ENCRYPTION BY PASSWORD = '23987hxJ#KL95234nl0zBe';  

CREATE CERTIFICATE [CERT_StackOverflow]
WITH SUBJECT = 'example';

CREATE SYMMETRIC KEY [SK_StackOverflow]   
WITH ALGORITHM = AES_256  
ENCRYPTION BY CERTIFICATE [CERT_StackOverflow];  
GO  


OPEN SYMMETRIC KEY [SK_StackOverflow] DECRYPTION BY CERTIFICATE [CERT_StackOverflow];  

SELECT EncryptByKey(Key_GUID('SK_StackOverflow'), 'stackoverflow');  
SELECT EncryptByKey(Key_GUID('SK_StackOverflow'), 'stackoverflow');  


DROP SYMMETRIC KEY [SK_StackOverflow];
DROP CERTIFICATE [CERT_StackOverflow];
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: = {1block} длина этого поля зависит от используемого алгоритма.Все ключи семейства AES будут иметь размер 16 байт на блок, а ключи семейства DES - 8 байт на блок.Векторы инициализации используются для инициализации алгоритма блока.Он не предназначен для того, чтобы быть секретом, но должен быть уникальным для каждого вызова функции шифрования во избежание выявления шаблонов.

Если вас интересует функция детерминированного шифрования из-за создания индекса, например, для оптимизации поиска, и вы не хотите использовать Always Encrypted из-за всех его ограничений, я могурассказать, как вы можете создать / смоделировать детерминированное шифрование с помощью SQL Server иерархия безопасности .

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