Como posso saber qual algoritmo de hash o SQL Server usou para descriptografar os dados criptografados ao usar a função DECRYPTBYPASSPHRASE?

12

Minha pergunta está relacionada ao seguinte experimento com duas instâncias:

Instância do SQL Server 2017 Express (Microsoft SQL Server 2017 (RTM-CU16)) Instância do
SQL Server 2014 Express (Microsoft SQL Server 2014 (SP2-CU18))

Usei a função ENCRYPTBYPASSPHRASE para criptografar um texto e usei o resultado como @ciphertext para DECRYPTBYPASSPHRASE . O resultado dos meus testes foram os seguintes:

Tabela de resultados

De acordo com esta correção da Microsoft ,

[...] O SQL Server 2017 usa o algoritmo de hash SHA2 para fazer o hash da senha. O SQL Server 2016 e versões anteriores do SQL Server usam o algoritmo SHA1 que não é mais considerado seguro.

Mas como ele sabe qual foi o algoritmo usado para criptografar dados se não há argumento relacionado a isso na função DECRYPTBYPASSPHRASE? Faz parte dos dados criptografados?

Pelos resultados dos meus testes, eu acho que o SQL Server sempre usa a versão mais recente do algoritmo disponível na instância para criptografar dados, mas tenta todos os algoritmos para descriptografar dados até encontrar um que se ajuste ou retorne NULL quando nenhum algoritmo correspondente for encontrado . É apenas um palpite, já que eu não consegui encontrar nenhuma maneira de verificar qual algoritmo de hash o SQL Server usou para descriptografar os dados criptografados.

Ronaldo
fonte

Respostas:

14

Mas como ele sabe qual foi o algoritmo usado para criptografar dados se não há argumento relacionado a isso na função DECRYPTBYPASSPHRASE? Faz parte dos dados criptografados?

Sim, bem no ponto.

Vou usar o seguinte para a saída:

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

Se eu executar isso na minha instância de 2014, obtenho o seguinte para Encrypted_Data: 0x01000000E565142762F62...

Se eu executar isso na minha instância de 2017, obtenho o seguinte para Encrypted_Data: 0x020000004D261C666204F...

O que deve aparecer é o preâmbulo, onde você pode ver a instância de 2014 0x01e a instância de 2017 0x02. Esse é o controle de versão do tipo de criptografia usado. Observe que há mais do que apenas isso, mas não há necessidade de entrar nesses detalhes para os fins desta resposta, nem precisa ser de conhecimento público.

O SQL Server 2017 entende 0x01e 0x02porque é novo e conhece as coisas novas. O SQL Server 2014 entende apenas 0x01porque é mais antigo e não conhece nenhuma das novidades, pois as novas não foram suportadas.

[...] O SQL Server 2017 usa o algoritmo de hash SHA2 para fazer o hash da senha. O SQL Server 2016 e versões anteriores do SQL Server usam o algoritmo SHA1 que não é mais considerado seguro.

Isso não é a mesma coisa, mas geralmente tem a ver com chaves simétricas sendo criadas com o mesmo vetor de inicialização nas duas versões. Eu escrevi sobre isso quando 2017 saiu e foi corrigido um pouco mais tarde com o sinalizador de rastreamento que deve ser usado, enquanto na sua pergunta não há nenhum sinalizador de rastreamento necessário para 2017 ler os dados de 2014, como mostrado.

Sean Gallardy
fonte
Olá Sean. Você poderia fornecer informações mais detalhadas sobre o sinalizador de rastreamento a partir de sua resposta?
Konstantin Taranov