Dica - Criptografia MD5 com C-Sharp - C# Brasil


Dica – Criptografia MD5 com C-Sharp

{lang: 'pt-BR'}

Olá caro leitor, aqui vai mais uma dica legal na hora de pensar em segurança.
Quando desenvolvo um sistema, seja ele Desktop ou Web, procuro sempre criptografar as Senhas ou outras informações que julgo pertinentes.

Esse método utilizo para criptografar uma string qualquer para o formato MD5 para deixa-las armazenadas no banco, tornando mais difícil de ser descoberta.

Segue o código


public string getMD5Hash(string input)
{
System.Security.Cryptography.MD5 md5 = System.Security.Cryptography.MD5.Create();
byte[] inputBytes = System.Text.Encoding.ASCII.GetBytes(input);
byte[] hash = md5.ComputeHash(inputBytes);
System.Text.StringBuilder sb = new System.Text.StringBuilder();
for (int i = 0; i < hash.Length; i++)
{
sb.Append(hash[i].ToString("X2"));
}
return sb.ToString();
}

Aproveitem mais essa dica.

Abraço e sucesso!!!

Join the forum discussion on this post

Postado em C#, Dicas, Visual Studio | Marcado como , , , ,

11 respostas para “Dica – Criptografia MD5 com C-Sharp”

  1. legal, e a descriptografia?

  2. Não existe descriptografia para MD5.

  3. r0na1d0 disse:

    Estou migrando do ASP clássico para c#.Net e ainda apanho em coisas básicas.

    Estou usando o componente de login. Entendi como ele funciona, aparentemente conecta ao DB para autenticar mas, como a senha no DB está criptografada (md5) acho que não está trazendo correto.
    Usei sua sugestão. Segue abaixo o código. Poderia me dizer onde estou errando?

    No exemplo, informo a senha 999999 (cadastrada na tabela do DB – campo login – como 52c69e3a57331081823331c4e69d3f2e)

    Login.aspx

    ********************************************************

    officium 1.0

    body {
    background-color:#C6CDD1;
    }

    #tela {
    width:360px;
    height:300px;
    margin:80px auto;
    background: url(img/login.png) no-repeat;
    }

    #login {
    float:right;
    padding:100px 20px 0 0;
    font-family:segoe ui, arial, tahoma, verdana;
    font-size:14px;
    }

    #login input {
    font-family:arial, tahoma, verdana;
    font-size:14px;
    text-align:left;
    color:#000;
    }

    .msg {
    font-family:arial, tahoma, verdana;
    font-size:14px;
    font-weight:700;
    text-align:center;
    color:#C00;

    }

    #login .campo {
    width:140px;
    font-family:arial, tahoma, verdana;
    font-size:12px;
    text-align:left;
    color:#000;
    background-color:#FFF;
    padding:4px;
    }

    #login .campo:focus {
    border:1px dashed #FF8306;
    }

    ********************************************************

    Login.cs

    ********************************************************

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.Security;
    using System.Data.OleDb;
    using System.Configuration;
    using System.Data;
    using System.Data.SqlClient;

    public partial class Login : System.Web.UI.Page
    {

    public string getMD5Hash(string input)
    {
    System.Security.Cryptography.MD5 md5 = System.Security.Cryptography.MD5.Create();
    byte[] inputBytes = System.Text.Encoding.ASCII.GetBytes(input);
    byte[] hash = md5.ComputeHash(inputBytes);
    System.Text.StringBuilder sb = new System.Text.StringBuilder();
    for (int i = 0; i < hash.Length; i++)
    {
    sb.Append(hash[i].ToString("X2"));
    }
    return sb.ToString();
    }

    protected void Page_Load(object sender, EventArgs e)
    {

    }

    protected void Login1_Authenticate(object sender, AuthenticateEventArgs e)
    {
    bool Authenticated = false;
    Authenticated = SiteLevelCustomAuthenticationMethod(Login1.UserName, Login1.Password);
    e.Authenticated = Authenticated;
    if (Authenticated == true)
    {
    Response.Redirect("Default.aspx");
    }
    }

    private bool SiteLevelCustomAuthenticationMethod(string UserName, string Password)
    {

    bool boolReturnValue = false;
    // Insert code that implements a site-specific custom
    // authentication method here.
    // This example implementation always returns false.
    string strConnection = "server=web01\\sqlexpress;database=dbxxxxx;uid=sa;pwd=xxxxxx;";
    SqlConnection Connection = new SqlConnection(strConnection);
    String strSQL = "Select * From tbPessoa";
    SqlCommand command = new SqlCommand(strSQL, Connection);
    SqlDataReader Dr;
    Connection.Open();
    Dr = command.ExecuteReader();
    while (Dr.Read())
    {
    if ((UserName == Dr["login"].ToString()) & (Password == getMD5Hash(Dr["senha"].ToString())))
    {
    boolReturnValue = true;
    break;
    }
    }
    Dr.Close();
    return boolReturnValue;
    }

    }

    ********************************************************

    Agradeço antecipadamente a ajuda.

  4. r0na1d0 disse:

    Anderson Bueno, o bom do MD5 é que gera uma chave que não tem como descriptografar e ser descoberta, mesmo que alguém consiga vê-la. É usada apenas para comparação com a senha informada no login.
    Exemplo:

    Em um Banco de dados há uma tabela Pessoa com um campo “senha varchar(50)”.

    1) Quando vc for cadastrar um novo usuário, antes de gravar a informação, no código vc usa uma função MD5 para criptografar a senha.
    senha = teste
    vsenha = md5(senha)
    vsenha =”698dc19d489c4e4db73e28a713eab07b” (string que será guardada no campo da tabela).

    2) Quando for autenticar o usuário, no código vc criptografa o valor que vier do input correspondente a senha. ex: .

    vPassword = md5(password)

    3) Conecta-se ao DB, pega a string armazenada no campo senha (gerada com md5) e compara com vPassword. Se elas forem iguais dá acesso ao usuário. Se não, nega o acesso.

    Aqui não usei a sintaxe de nenhuma linguagem. Em cada uma o código será diferente e haverá funcões md5 específicas da linguagem. Foi só para passar a lógica do funcionamento. No visual Studio C#.net já tem uma classe nativa (System.Web.Security) para isso, como o autor do artigo mostrou no exemplo acima.

  5. r0na1d0 disse:

    Aproveitando, como ao invés de usar:

    string strConnection = “server=web01\\sqlexpress;database=dbxxxxx;uid=sa;pwd=xxxxxx;”;
    SqlConnection Connection = new SqlConnection(strConnection);

    Usar a conexão definida no web.config:

  6. Ronaldo, acredito que o problema que você está tendo é outro.
    A forma como você implementou está correta, porem tem um detalhe no seu metodo SiteLevelCustomAuthenticationMethod que deveria ser diferente e você teria que informar o WHERE no SELECT.

    Select * From tbPessoa where login = ‘usuario’ and senha = ‘senha_md5′

    A forma como esta fazendo para verificar o usuario e senha usando o laço de repetição WHILE não seria a melhor pratica.
    Veja abaixo o seu codigo reescrito.


    private bool SiteLevelCustomAuthenticationMethod(string UserName, string Password)
    {
    bool boolReturnValue = false;

    Password = getMD5Hash(Password);

    string strConnection = "server=web01\\sqlexpress;database=dbxxxxx;uid=sa;pwd=xxxxxx;";
    System.Data.SqlClient.SqlConnection Connection = new System.Data.SqlClient.SqlConnection(strConnection);
    // O replace na aspa simples é para evitar SQL Injection
    String strSQL = "Select codigo From tbPessoa where login = '" + UserName.Replace("'", "") + "' and senha = '" + Password + "'";
    System.Data.SqlClient.SqlCommand command = new System.Data.SqlClient.SqlCommand(strSQL, Connection);
    Connection.Open();
    // Retorna a primeira coluna da primeira linha
    object obj = command.ExecuteScalar();
    // IF Ternario para verificar se o objeto é nulo. Caso seja atribui 0 (zero), senao converte o objeto para Integer
    int codigo = obj == null ? 0 : Convert.ToInt32(obj);
    // Verifica se o valor é maior que 0 (zero), ou seja, se o codigo é maior que 0 (zero)
    boolReturnValue = codigo > 0;

    return boolReturnValue;
    }

  7. heitorhog disse:

    QUERO SABER COMO EU FAÇO PARA DESCRIPTOGRAFAR ESTE METODO E PARABENS PELO ARTIGO

  8. O MD5 não é possivel descriptografar porque ele é um algoritmo hash.
    Veja mais nesses links:

  9. heitorhog disse:

    mas existe algum meio que eu consiga ler ele

  10. Reverter não. Uma vez feto não é possivel desfazer.

  11. heitorhog disse:

    no caso existe um meio de fazer uma criptografia que possa indicar os algoritimos da criptografia tipo eu quero que as letras fique tudo- asd – o texto da criptografia inteiro tem como ? exemplo heitor > asdasd

Deixe uma resposta

Qual a soma da expressão:
4 + 2