Як я можу знати, який алгоритм хешування 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 року, як показано.


Привіт, Шон. Чи могли б ви надати більш детальну інформацію про слід прапора з вашої відповіді?
Костянтин Таранов
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.