Eu tenho usado script baseado no script da Microsoft EXEC sp_help_revlogin
para sincronizar nomes de usuário e senhas do SQL Server entre hosts. Isso tem funcionado bem há muito tempo no SQL Server 2008 R2, mas com o planejamento de nossa mudança para o SQL Server 2014, encontrei um obstáculo.
Eu tenho três máquinas SQL Server 2014 de preparo. Em todos os servidores eu executo o seguinte comando:
CREATE LOGIN [TestAccount]
WITH PASSWORD = N'1234567890',
DEFAULT_DATABASE = [master],
CHECK_EXPIRATION = OFF, CHECK_POLICY = OFF
Para dois deles, recebo um comando "Criar" gerado de:
CREATE LOGIN [TestAccount]
WITH PASSWORD = 0x010075DDCA54FCEF12CB11C4E64040E877B9FF5872C41EB98095 HASHED,
SID = 0xCA78345104805C4E89004969D05D551B,
DEFAULT_DATABASE = [master],
CHECK_POLICY = OFF, CHECK_EXPIRATION = OFF
Legal. Até agora tudo bem. Mas, no terceiro servidor, recebo um comando "Criar" de:
CREATE LOGIN [TestAccount]
WITH PASSWORD = 0x02002F6CB52E7F571AD422689021EB9EC1BE2AB4576AE6EC12485333A4CB892A9197B440E1471376A5AAC5160847F636A637D1F499880D7653ABC4DB4714746856E01DE41E09 HASHED,
SID = 0x19337EA32254A64F8FC018474B58DBA5,
DEFAULT_DATABASE = [master],
CHECK_POLICY = OFF, CHECK_EXPIRATION = OFF
O que não funciona. O hash é muito grande.
Existe algum sinalizador de nível de compatibilidade ou algo que de alguma forma eu tenha ativado neste servidor que está gerando hashes de senha antiquados ou algo assim?
Dando a marca de seleção para Ryan como ele estava certo. Na verdade, eu estava me conectando à instância errada instalada nas mesmas máquinas físicas das instâncias do SQL Server 2014. Eu estava muito cansado na noite de sexta-feira.
Isso ocorre porque desde o SQL Server 2012 o algoritmo de hash mudou.
A partir desta versão, o hash é duas vezes maior.
Você pode ler sobre as três versões de hash usadas para as várias versões do SQL Server no artigo sp_help_revlogin da Microsoft, em Comentários:
O que significa que, se você quiser mover um usuário do SQL Server 2012 ou superior para uma instância 2008r2, precisará encontrar um método diferente.
Eu testei bastante agora. Qualquer usuário criado em SHA1 quando movido usando o hash de senha para um novo servidor de versão (2012+) pode ser movido de volta, desde que a senha não seja alterada. No entanto, qualquer novo usuário criado em 2012+ não poderá ser movido para 2008r2 ou anterior.
Quando você cria um login, o SQL Server adiciona uma chave salt de 4 bytes a ele (ou seja, senha '12345678' + chave 0x1234abcd) e faz o hash usando o algoritmo SHA.
Como a chave salt é gerada aleatoriamente, cada hash será diferente, a menos que use a mesma chave duas vezes. (1 de 65k chaves salt possíveis)
Você pode ver a chave salt no início do hash. Os primeiros 2 bytes são usados para armazenar a versão do algoritmo de hash usado. Os 4 próximos bytes são a chave salt. Os bytes restantes salvam o hash da sua senha.
Quando você faz login, ele retira a chave salt do hash armazenado, adiciona-a à entrada das janelas de login e faz o hash. Em seguida, compara o resultado com a parte da senha do hash armazenado.
Com
0x02002F6CB52E7F571AD422689021EB9EC1BE2AB4576AE6EC12485333A4CB892A9197B440E1471376A5AAC5160847F636A637D1F499880D7653ABC4DB4714746856E01DE41E09
temos:Versão do cabeçalho = 0x0200
Sal = 0x2F6CB52E
Senha = 0x7F571AD422689021EB9EC1BE2AB4576AE6EC12485333A4CB892A9197B440E1471376A5AAC5160847F636A637D1F499880D7653ABC4DB4714746856E01DE41E09