¿Cómo puedo saber qué algoritmo de hashing usó SQL Server para descifrar los datos cifrados al usar la función DECRYPTBYPASSPHRASE?

12

Mi pregunta está relacionada con el siguiente experimento con dos instancias:

Instancia Express de SQL Server 2017 (Microsoft SQL Server 2017 (RTM-CU16)) Instancia
SQL Server 2014 Express (Microsoft SQL Server 2014 (SP2-CU18))

Utilicé la función ENCRYPTBYPASSPHRASE para cifrar un texto y utilicé el resultado como @ciphertext para DECRYPTBYPASSPHRASE . El resultado de mis pruebas fueron estas:

Tabla de resultados

Según esta corrección de Microsoft ,

[...] SQL Server 2017 usa el algoritmo de hash SHA2 para codificar la frase de contraseña. SQL Server 2016 y versiones anteriores de SQL Server usan el algoritmo SHA1 que ya no se considera seguro.

Pero, ¿cómo sabe cuál fue el algoritmo utilizado para cifrar datos si no hay un argumento relacionado con eso en la función DECRYPTBYPASSPHRASE? ¿Forma parte de los datos cifrados?

Según los resultados de mis pruebas, supongo que SQL Server siempre usa la versión más nueva del algoritmo disponible en la instancia para cifrar datos, pero intenta todos los algoritmos para descifrar los datos hasta que encuentre uno que se ajuste o devuelva NULL cuando no se encuentre el algoritmo correspondiente . Sin embargo, es solo una suposición, ya que no pude encontrar ninguna manera de verificar qué algoritmo de hash usó SQL Server para descifrar los datos cifrados.

Ronaldo
fuente

Respuestas:

14

Pero, ¿cómo sabe cuál fue el algoritmo utilizado para cifrar datos si no hay un argumento relacionado con eso en la función DECRYPTBYPASSPHRASE? ¿Forma parte de los datos cifrados?

Sí, justo en el punto.

Voy a usar lo siguiente para la salida:

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))

Si ejecuto esto en mi instancia de 2014, obtendré lo siguiente para Encrypted_Data: 0x01000000E565142762F62...

Si ejecuto esto en mi instancia de 2017, obtendré lo siguiente para Encrypted_Data: 0x020000004D261C666204F...

Lo que debería aparecer es el preámbulo, donde puede ver que la instancia de 2014 comienza con 0x01y la instancia de 2017 comienza con 0x02. Esta es la versión del tipo de cifrado que se utiliza. Tenga en cuenta que hay algo más que esto, pero no es necesario entrar en ese detalle a los fines de esta respuesta, ni tampoco debe ser de conocimiento público.

SQL Server 2017 comprende 0x01y 0x02porque es nuevo y conoce las cosas nuevas. SQL Server 2014 entiende solo 0x01porque es más antiguo y no conoce ninguna de las cosas nuevas, ya que las cosas nuevas no fueron respaldadas.

[...] SQL Server 2017 usa el algoritmo de hash SHA2 para codificar la frase de contraseña. SQL Server 2016 y versiones anteriores de SQL Server usan el algoritmo SHA1 que ya no se considera seguro.

Esto no es lo mismo, pero generalmente tiene que ver con la creación de claves simétricas con el mismo vector de inicialización en ambas versiones. Escribí un blog sobre esto cuando salió 2017 y se solucionó un poco más tarde con la marca de seguimiento que debe usarse, mientras que en su pregunta no se necesita una marca de seguimiento para 2017 para leer los datos de 2014 como se muestra.

Sean Gallardy
fuente
Hola sean ¿Podría proporcionar información más detallada sobre la marca de seguimiento de su respuesta?
Konstantin Taranov