Как узнать, какой алгоритм хеширования SQL Server используется для расшифровки зашифрованных данных при использовании функции DECRYPTBYPASSPHRASE?

12

Мой вопрос связан со следующим экспериментом с двумя примерами:

Экземпляр SQL Server 2017 Express (Microsoft SQL Server 2017 (RTM-CU16)) Экземпляр
SQL Server 2014 Express (Microsoft SQL Server 2014 (SP2-CU18))

Я использовал функцию ENCRYPTBYPASSPHRASE для шифрования текста и использовал результат как @ciphertext для DECRYPTBYPASSPHRASE . Результатом моих испытаний были следующие:

Таблица результатов

Согласно этому исправлению Microsoft ,

[...] SQL Server 2017 использует алгоритм хеширования SHA2 для хеширования парольной фразы. SQL Server 2016 и более ранние версии SQL Server используют алгоритм SHA1, который больше не считается безопасным.

Но как он узнает, какой алгоритм использовался для шифрования данных, если в функции DECRYPTBYPASSPHRASE нет аргументов, связанных с этим? Это часть зашифрованных данных?

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

Роналду
источник

Ответы:

14

Но как он узнает, какой алгоритм использовался для шифрования данных, если в функции DECRYPTBYPASSPHRASE нет аргументов, связанных с этим? Это часть зашифрованных данных?

Да, именно так.

Я собираюсь использовать следующее для вывода:

DECLARE @Data VARBINARY(MAX)
DECLARE @Text NVARCHAR(MAX) = N'I''ll get you, and your little dog too!'
DECLARE @Phrase NVARCHAR(100) = N'Fly My Pretties!'

SELECT @Data = ENCRYPTBYPASSPHRASE(@Phrase, @Text)

SELECT @Data AS [Encrypted_Data]

SELECT CAST(DECRYPTBYPASSPHRASE(@Phrase, @Data) AS NVARCHAR(MAX))

Если я выполню это на своем экземпляре 2014 года, я получу следующее для Encrypted_Data: 0x01000000E565142762F62...

Если я выполню это на своем экземпляре 2017 года, я получу следующее для Encrypted_Data: 0x020000004D261C666204F...

То, что должно появиться, - это преамбула, где вы видите, что экземпляр 2014 года начинается с, 0x01а экземпляр 2017 года начинается с 0x02. Это версия используемого типа шифрования. Обратите внимание, что есть нечто большее, чем просто это, но нет необходимости вдаваться в детали для целей этого ответа, и при этом это не должно быть публичным знанием.

SQL Server 2017 понимает 0x01и 0x02потому, что он новый и знает новые вещи. SQL Server 2014 понимает только 0x01потому, что он старше и не знает ничего нового, поскольку новые вещи не были перенесены.

[...] SQL Server 2017 использует алгоритм хеширования SHA2 для хеширования парольной фразы. SQL Server 2016 и более ранние версии SQL Server используют алгоритм SHA1, который больше не считается безопасным.

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

Шон Галларди
источник
Привет, Шон. Не могли бы вы предоставить более подробную информацию о флаге трассировки из своего ответа?
Константин Таранов