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!!!
Postado em C#, Dicas, Visual Studio | Marcado como C#, Dicas, MD5, System.Security.Cryptography.MD5, Visual Studio
legal, e a descriptografia?
Não existe descriptografia para MD5.
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.
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.
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:
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;
}
QUERO SABER COMO EU FAÇO PARA DESCRIPTOGRAFAR ESTE METODO E PARABENS PELO ARTIGO
O MD5 não é possivel descriptografar porque ele é um algoritmo hash.
Veja mais nesses links:
mas existe algum meio que eu consiga ler ele
Reverter não. Uma vez feto não é possivel desfazer.
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