-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
– Victor Laio
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?
– Caio de Paula Silva
My question is exactly how do I compare what was typed with what is registered
– T. Silv