É possível alterar todas as senhas de usuários para maiúsculas

1

Atualmente estou migrando alguns servidores do MS sql server 2000 para 2008. Alguns dos aplicativos herdados são protegidos por senha essencialmente verificando se um usuário com esse nome e senha existe no servidor.

Cada aplicativo converte a senha em maiúscula antes de enviá-la ao servidor, mas sim, você adivinhou, as senhas no servidor não são necessariamente armazenadas em maiúsculas: isso não foi um problema para 2000, mas é em 2008 (e com razão!).

Os aplicativos não têm nenhum recurso inteligente que permita ao usuário alterar sua senha, e eu não quero ter que pedir a cada usuário para alterar sua senha ou alterar os aplicativos, portanto, eu queria saber se é possível para um script para alterar todas as senhas de usuários para upper e como se poderia criar (tabelas para modificar, como modificar campos de hash etc)?

    
por Kurut 14.08.2009 / 09:52

6 respostas

6

Você pode, de fato, fazer o script de senhas do sql server 2000 e importá-las para o sql server 2008, de modo que elas sejam reconhecidas como senhas maiúsculas. Aqui estão algumas leitura em segundo plano que serão úteis para entender os hashes de senha do sql server, para que você possa acompanhar com o exemplo.

As senhas do SQL Server 2000 na verdade eram insensíveis a maiúsculas e minúsculas, como descrito em este discurso. Mesmo assim, os hashes do sql server armazenam uma cópia sensível a maiúsculas e minúsculas da senha, de modo que quando você migra hashes de senha para o sql server 2005/2008, suas senhas são sensíveis a maiúsculas e minúsculas.

Para testar isso, você pode executar o seguinte no seu SQL Server 2000 Server:

exec sp_addlogin  @loginame= 'usera' , @passwd='password'

acessando o SQL Server 2000 como o user funciona com 'PASSWORD', mesmo que não deva. Para migrar o usera para o SQL Server 2005/2008, podemos usar o seguinte para copiar o login mantendo o sid & hash de senha:

select 
'exec sp_addlogin @loginame ='''
+ [name] + ''''
+ ', @passwd= ' 
+ master.dbo.fn_varbintohexstr([password])
+ ', @sid= ' 
+ master.dbo.fn_varbintohexstr([sid])
+ ', @encryptopt = ''skip_encryption_old'''
from sysxlogins where name='usera'

Você receberá a seguinte saída (com sid & hash diferente, é claro):

 exec sp_addlogin @loginame ='usera', 
@passwd= 0x01004409eb54922c0cd2bedbad754f37afad4053bdadf719ff80c8a8abf5801b813114be6ba0c2c8543b2db77b33, 
@sid= 0x06cf56eb108a12428712f8b7c66ca1cd, @encryptopt = 'skip_encryption_old'

O que você pode fazer é executar algum 'processamento' no hash da senha antes de importá-lo para 2008, para que o segundo hash maiúsculo substitua o hash sensível a maiúsculas e minúsculas. Isso significará que todas as suas senhas estão em maiúsculas. Usando a senha acima, você pode executar a seguinte operação, que eu fiz aqui no t-sql:

declare @old_passwd char(94)  -- original hash from sql server 2000
declare @new_passwd char(94)  -- new upper case password for sql server 2008
declare @cs_hash char(40) -- case sentive part
declare @ci_hash char(40) -- case insentive part 
declare @salt char(14)
set @old_passwd = '0x01004409EB54922C0CD2BEDBAD754F37AFAD4053BDADF719FF80C8A8ABF5801B813114BE6BA0C2C8543B2DB77B33'

set @salt    = SUBSTRING(@old_passwd,1,14)
set @cs_hash = SUBSTRING(@old_passwd,15,40)  -- not used, but here for understanding
set @ci_hash = SUBSTRING(@old_passwd,55,40)

set @new_passwd = @salt + @ci_hash + @ci_hash

SELECT @new_passwd

usando esta @new_password como o parâmetro @passwd para sp_addlogin significa que a senha é reconhecida como maiúscula!

    
por 16.08.2009 / 18:10
2

Não há como alterar as senhas existentes, elas são efetivamente criptografadas localmente, mas você pode redefinir as senhas para algo em letras maiúsculas e informá-las

    
por 14.08.2009 / 10:18
1

a resposta correta é corrigir os aplicativos legados para que eles não façam isso (isso se qualifica para um DailyWTF - reduzindo deliberadamente o espaço de busca para um crack de força bruta).

esperamos que você tenha o código-fonte e possa fazer isso.

se não, a resposta do chopper3 funcionará.

    
por 14.08.2009 / 13:19
1

Apenas para FYI, a diferenciação de maiúsculas e minúsculas depende do agrupamento. Existem colações que não diferenciam maiúsculas de minúsculas que você poderia usar como uma solução alternativa, talvez temporariamente.

    
por 17.08.2009 / 01:29
0

Você pode fazer o que o Chopper3 sugere, porque você terá que informar os usuários de qualquer maneira. Mesmo que você possa fazer o script de uma alteração para maiúsculas, ainda é uma alteração de senha e os usuários precisam ser informados sobre isso.

    
por 14.08.2009 / 12:04
0

O problema é que a configuração de agrupamento de banco de dados que você tinha no antigo banco de dados 2000 não fazia distinção entre maiúsculas e minúsculas, mas você migrou para um novo banco de dados em que a configuração de agrupamento fazia distinção entre maiúsculas e minúsculas. Tudo o que você precisa fazer é alterar a configuração de agrupamento em suas propriedades de bancos de dados mais recentes e, depois, corresponderá aos nomes, independentemente do caso.

Seu aplicativo foi codificado para Maiúsculas, porque os desenvolvedores não entenderam que o banco de dados 2000 fazia distinção entre maiúsculas e minúsculas. Eles poderiam ter facilmente alterado a configuração do banco de dados de 2000 para não diferenciar maiúsculas de minúsculas para resolver seu problema, mas eles obviamente optaram por "hackear" em torno dele.

Acho interessante que todos os outros respondam a essa pergunta seguindo o mesmo caminho ingênuo. Imagine todo o tempo perdido na história porque os desenvolvedores não entenderam esse problema simples.

    
por 18.08.2009 / 18:14