Pergunta

Infelizmente, tenho senhas de texto simples em um banco de dados. Quero passar esses valores de texto simples o mínimo possível para, digamos, comparações e atualizações. Para esse fim, estou tentando criar uma visualização da tabela de usuários que exclui as senhas de texto simples e, em vez disso, fornece um valor de hash dessa senha.

Aqui está minha visualização atual do SQL Server, que não funciona:

SELECT CAST(CAST(32768 * RAND() AS INT) AS NVARCHAR) AS PasswordSalt
       HashBytes('SHA1', PasswordSalt + u.Password) AS PasswordHash
FROM dbo.Users AS u

Ficaria feliz em ouvir sobre alternativas a essa abordagem, mas, caso contrário, o problema parece estar concatenando a coluna virtual PasswordSalt com qualquer coisa. Por exemplo, a seguinte visualização simples funciona:

SELECT u.Login AS Column1, u.Login + 'b' AS Column2

Mas este não é:

SELECT u.Login AS Column1, Column1 + 'b' AS Column2

O erro que estou recebendo do estúdio de gerenciamento é

Nome da coluna inválida 'Column1'.

Agradecemos antecipadamente por quaisquer idéias sobre o que estou fazendo de errado!

Foi útil?

Solução

O problema está ocorrendo porque a cláusula de sua instrução indica que os dados a serem selecionados vem da tabela de usuários, mas a peça de seleção faz referência a uma coluna chamada PasswordSalt. O SQL Server não pode encontrar uma coluna com esse nome na tabela de usuários, daí o erro.

A abordagem alternativa pode ser gerar o sal em uma subconeração. Por exemplo

SELECT x.PasswordSalt,  HashBytes('SHA1', x.PasswordSalt + x.Password) AS PasswordHash FROM ( SELECT  CAST(CAST(32768 * RAND() AS INT) AS NVARCHAR) AS PasswordSalt, Password FROM dbo.Users) x

Outras dicas

A respeito

SELECT CAST(CAST(32768 * RAND() AS INT) AS NVARCHAR) AS PasswordSalt 
       HashBytes('SHA1', CAST(CAST(32768 * RAND() AS INT) AS NVARCHAR) + u.Password) AS PasswordHash 
FROM dbo.Users AS u 
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top