I was able to create a registry with encrypted password, but in the method of access (log in) I am in doubt on how to get the password entered and compare it with the password registered with encryption. Here is 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 looks 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;
}
}