Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Criptografar senhas no Sql Server 2008 usando SHA1


Senhas de hash e salt em C#

https://crackstation.net/hashing-security.htm

https://www.bentasker.co.uk/blog/security/201-why-you-should-be-asking-how-your-passwords-are-stored

Como afirmei em meus comentários, o hash de senhas é algo que você provavelmente não deveria fazer sozinho.

Algumas coisas a serem observadas:
  • SHA1 não é recomendado para senhas
  • As senhas devem ser salgadas
  • Você deve usar uma estrutura de armazenamento de usuários verificada em vez de tentar criar a sua própria, pois provavelmente "fará errado"
  • Tenho certeza de que há muito mais

Dito isso , para realizar sua pergunta específica, você desejaria algo assim:
Users
----
userId
passwordHashed

passwordHashed armazena uma versão com hash da senha do usuário (a senha de texto simples nunca é armazenada em nenhum lugar na persistência.)

para verificar a senha válida, algo assim é feito:
ALTER procedure [dbo].[proc_UserLogin]
 @userid varchar(20),
  @password nvarchar(50)
  As 

  declare
  @ReturnVal              varchar(500)


SET NOCOUNT ON      

  if exists(select userid,password from LoginManager where [email protected] and password=HASHBYTES('SHA1', @password))
  set @ReturnVal='0|Logged in Successfully'
  else
  set @ReturnVal='1|Login Failed/Username does not exist'

  select @ReturnVal

Para inserir/atualizar senhas de usuário, você precisa ter certeza de armazenar a senha com hash e não a senha de texto simples, como tal;
INSERT INTO users(userId, passwordHashed) 
VALUES (@userId, HASHBYTES('SHA1', @rawPassword)

ou
UPDATE users 
SET passwordHased = HASHBYTES('SHA1', @rawPassword) 
WHERE userId = @userId

EDITAR:

acabei de perceber que você está perguntando como realizar o hash em C#, não em SQL. Você pode executar o seguinte (retirado de Hashing com SHA1 Algoritmo em C# ):
public string Hash(byte [] temp)
{
    using (SHA1Managed sha1 = new SHA1Managed())
    {
        var hash = sha1.ComputeHash(temp);
        return Convert.ToBase64String(hash);
    }
}

Seu recorte de código pode ser:
            conn.Open();
            string query = "EXEC dbo.proc_UserLogin'" + username.Text+ "', '" + this.Hash(System.Text.Encoding.UTF8.GetBytes(password.Text))+"'";
            OleDbCommand cmd = new OleDbCommand(query, conn);

Você também deve observar que deve parametrizar seus parâmetros para seu procedimento armazenado em vez de passá-los da maneira que você está - o que parece que você já tem uma pergunta separada em relação a isso.