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 estes:
De acordo com esta correção da Microsoft ,
[...] SQL Server 2017 usa o algoritmo de hash SHA2 para fazer o hash da senha. 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 os dados se não houver nenhum argumento relacionado a isso na função DECRYPTBYPASSPHRASE? Faz parte dos dados criptografados?
Pelos resultados dos meus testes, 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 os dados até encontrar um que se ajuste ou retorne NULL quando nenhum algoritmo correspondente for encontrado . É apenas um palpite, já que não consegui encontrar nenhuma maneira de verificar qual algoritmo de hash o SQL Server usou para descriptografar os dados criptografados.
Sim, bem no ponto.
Vou usar o seguinte para a saída:
Se eu executar isso na minha instância de 2014, obterei o seguinte para Encrypted_Data:
0x01000000E565142762F62...
Se eu executar isso na minha instância de 2017, obterei o seguinte para Encrypted_Data:
0x020000004D261C666204F...
O que deve aparecer é o preâmbulo, onde você pode ver que a instância de 2014 começa com
0x01
e a instância de 2017 começa com0x02
. Este é 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 em detalhes para os fins desta resposta, nem precisa ser de conhecimento público.O SQL Server 2017 entende
0x01
e0x02
porque é novo e conhece as novidades. O SQL Server 2014 entende apenas0x01
porque é mais antigo e não conhece nenhuma das novidades, pois as coisas novas não foram retroportadas.Isso não é a mesma coisa, mas geralmente tem a ver com a criação de chaves simétricas com o mesmo vetor de inicialização em ambas as versões. Eu escrevi sobre isso quando 2017 foi lançado e foi corrigido um pouco mais tarde com o sinalizador de rastreamento que deve ser usado, enquanto na sua pergunta não há sinalizador de rastreamento necessário para 2017 ler os dados de 2014, conforme mostrado.