C#hash encryption

Asked

Viewed 452 times

-1

I was able to create a registration with an encrypted password, but in the access method (login) I have doubts on how to take the password typed and compare with the password registered with encryption. Follows my code:

class FuncionarioDAO
    {
        public bool tem = false;
        public String mensagem = "";
        SqlCommand cmd = new SqlCommand();
        Conexao conexaoBD = new Conexao();
        SqlDataReader dr;

        public bool acessar(String usuario, String senha)
        {
            var hash = new Hash(SHA512.Create());
            string hashTxtSenha = null;            

            cmd.CommandText = "select * from funcionario where FuncionarioLogin = @usuario and Senha = @senha";
            cmd.Parameters.AddWithValue("@usuario", usuario);
            cmd.Parameters.AddWithValue("@senha", senha);           

            try
            {
                cmd.Connection = conexaoBD.Conectar();
                dr = cmd.ExecuteReader();
               hashTxtSenha = hash.CriptografarSenha(senha);
                if (dr.HasRows)
                {
                    if(hash.VerificarSenha(hashTxtSenha, senha))
                    {
                        tem = true;
                    }                                                          
                }
                conexaoBD.Desconectar();
                dr.Close();
            }
            catch (SqlException)
            {

                this.mensagem = "Erro com Banco de Dados!";
            }
            return tem;
        }

        public String cadastrar(String usuario, String senha, String confirmar, String nome, String email, String telefone, String celular, String nivelAcesso, String nomeExibicao)
        {
            var hash = new Hash(SHA512.Create());
            tem = false;
            if(senha.Equals(confirmar))
            {
                cmd.CommandText = @"insert into Funcionario  
                                (FuncionarioLogin, Senha, Nome, Email, Telefone, Celular, NivelAcesso, NomeExibicao)
                               values (@usuario, @senha, @nome, @email, @telefone, @celular, @nivelAcesso, @nomeExibicao)";
                cmd.Parameters.AddWithValue("@usuario", usuario);
                cmd.Parameters.AddWithValue("@senha", hash.CriptografarSenha(senha));
                cmd.Parameters.AddWithValue("@nome", nome);
                cmd.Parameters.AddWithValue("@email", email);
                cmd.Parameters.AddWithValue("@telefone", telefone);
                cmd.Parameters.AddWithValue("@celular", celular);
                cmd.Parameters.AddWithValue("@nivelAcesso", nivelAcesso);
                cmd.Parameters.AddWithValue("@nomeExibicao", nomeExibicao);                

                try
                {
                    cmd.Connection = conexaoBD.Conectar();
                    cmd.ExecuteNonQuery();
                    conexaoBD.Desconectar();
                    this.mensagem = "Cadastrado com Sucesso!";
                    tem = true;

                }
                catch (SqlException)
                {

                    this.mensagem = "Erro com Banco de Dados!";
                }
            } 
            else
            {
                this.mensagem = "Senhas não correspondem!";
            }
            return mensagem;
        }
}

My hash class is like this:

public class Hash
{
    private HashAlgorithm _algoritmo;

    public Hash(HashAlgorithm algoritmo)
    {
        _algoritmo = algoritmo;
    }

    public string CriptografarSenha(string senha)
    {
        var valorCodificado = Encoding.UTF8.GetBytes(senha);
        var senhaCifrada = _algoritmo.ComputeHash(valorCodificado);
        var sb = new StringBuilder();
        foreach (var caractere in senhaCifrada)
        {
            sb.Append(caractere.ToString("X2"));
        }
        return sb.ToString();
    }
    public bool VerificarSenha(string senhaDigitada, string senhaCadastrada)
    {
        if (string.IsNullOrEmpty(senhaCadastrada))
            throw new NullReferenceException("Cadastre uma senha.");
        var senhaCifrada = _algoritmo.ComputeHash(Encoding.UTF8.GetBytes(senhaDigitada));
        var sb = new StringBuilder();
        foreach (var caractere in senhaCifrada)
        {
            sb.Append(caractere.ToString("X2"));
        }
        return sb.ToString() == senhaCadastrada;
    }
}
  • Put your Hash class on so we can see what she’s comparing

  • 1

    Don’t just take what the user typed, encrypt and check if the return of a select to that password returns true or false from the database?

  • My question is exactly how do I compare what was typed with what is registered

1 answer

0

As you are encrypting the password before entering in the bank, you will need encryption in the same way to use in your select parameter otherwise you will not find your data in the bank.

See how it would look.

public bool acessar(String usuario, String senha)
{
    bool tem = false;
    var hash = new Hash(SHA512.Create());
    string hashTxtSenha = = hash.CriptografarSenha(senha);            

    cmd.CommandText = "select * from funcionario where FuncionarioLogin = @usuario and Senha = @senha";
    cmd.Parameters.AddWithValue("@usuario", usuario);
    cmd.Parameters.AddWithValue("@senha", hashTxtSenha);           

    try
    {
        cmd.Connection = conexaoBD.Conectar();
        dr = cmd.ExecuteReader();      

        tem = dr.HasRows;
        BD.Desconectar();

        dr.Close();
    }
    catch (SqlException)
    {
        this.mensagem = "Erro com Banco de Dados!";
    }
    return tem;
}

Browser other questions tagged

You are not signed in. Login or sign up in order to post.