Encriptar con MD5 C#
Uno de los mayores inconvenientes a la hora de realizar una aplicación en c# que maneje usuarios y bases de datos, es la seguridad de la contraseña del usuario, esto no solo en aplicaciones web sino también en aplicaciones de escritorio o moviles puede ser un problema al que te habrás enfrentado, por lo tanto te presento una alternativa sencilla para que puedas encriptar las contraseñas de tus usuarios en una Base de datos y que no cualquiera que tenga permiso de entrar a esta pueda ver las contraseñas de los usuarios en esta misma.
TUTORIAL C#
Empezando el Proyecto
Primero que nada necesitamos realizar un proyecto del tipo Windows Form, o Web Form en este caso sera un Windows Form que me parece mas sencillo para este tipo de ejemplos, aunque el mismo código puede ser adaptado a un Web Form, crearemos un Form con los elementos que se ven en la imagen, una vez hecho esto solo nos queda entrar al código, aunque tratare de dar una breve explicación de como funciona este antes de verlo.
Como Funciona
Este código es sumamente sencillo, utiliza una librería de .Net la cual es:
System.Security.Cryptography;
La cual es la que realizara el trabajo pesado por nosotros, otra de las cosas que necesitamos es especificar una llave o "key" la cual nos servirá para encriptar y también para desencriptar, la cual podemos incluir en el código como en este ejemplo o manejarla como mejor nos parezca, y tendremos 2 métodos uno para encriptar y otro para revertir o desencriptar, una vez entendido esto veamos el codigo.
Codificando
Primero que nada crearemos una variable del tipo string que contendra la llave:
string key = "mikey";
Después creamos los métodos tanto para encriptar como para desencriptar:
public string Encriptar(string texto)
{
//arreglo de bytes donde guardaremos la llave
byte[] keyArray;
//arreglo de bytes donde guardaremos el texto
//que vamos a encriptar
byte[] Arreglo_a_Cifrar =
UTF8Encoding.UTF8.GetBytes(texto);
//se utilizan las clases de encriptación
//provistas por el Framework
//Algoritmo MD5
MD5CryptoServiceProvider hashmd5 =
new MD5CryptoServiceProvider();
//se guarda la llave para que se le realice
//hashing
keyArray = hashmd5.ComputeHash(
UTF8Encoding.UTF8.GetBytes(key));
hashmd5.Clear();
//Algoritmo 3DAS
TripleDESCryptoServiceProvider tdes =
new TripleDESCryptoServiceProvider();
tdes.Key = keyArray;
tdes.Mode = CipherMode.ECB;
tdes.Padding = PaddingMode.PKCS7;
//se empieza con la transformación de la cadena
ICryptoTransform cTransform =
tdes.CreateEncryptor();
//arreglo de bytes donde se guarda la
//cadena cifrada
byte[] ArrayResultado =
cTransform.TransformFinalBlock(Arreglo_a_Cifrar,
0, Arreglo_a_Cifrar.Length);
tdes.Clear();
//se regresa el resultado en forma de una cadena
return Convert.ToBase64String(ArrayResultado,
0, ArrayResultado.Length);
}
{
//arreglo de bytes donde guardaremos la llave
byte[] keyArray;
//arreglo de bytes donde guardaremos el texto
//que vamos a encriptar
byte[] Arreglo_a_Cifrar =
UTF8Encoding.UTF8.GetBytes(texto);
//se utilizan las clases de encriptación
//provistas por el Framework
//Algoritmo MD5
MD5CryptoServiceProvider hashmd5 =
new MD5CryptoServiceProvider();
//se guarda la llave para que se le realice
//hashing
keyArray = hashmd5.ComputeHash(
UTF8Encoding.UTF8.GetBytes(key));
hashmd5.Clear();
//Algoritmo 3DAS
TripleDESCryptoServiceProvider tdes =
new TripleDESCryptoServiceProvider();
tdes.Key = keyArray;
tdes.Mode = CipherMode.ECB;
tdes.Padding = PaddingMode.PKCS7;
//se empieza con la transformación de la cadena
ICryptoTransform cTransform =
tdes.CreateEncryptor();
//arreglo de bytes donde se guarda la
//cadena cifrada
byte[] ArrayResultado =
cTransform.TransformFinalBlock(Arreglo_a_Cifrar,
0, Arreglo_a_Cifrar.Length);
tdes.Clear();
//se regresa el resultado en forma de una cadena
return Convert.ToBase64String(ArrayResultado,
0, ArrayResultado.Length);
}
public string Desencriptar(string textoEncriptado)
{
byte[] keyArray;
//convierte el texto en una secuencia de bytes
byte[] Array_a_Descifrar =
Convert.FromBase64String(textoEncriptado);
//se llama a las clases que tienen los algoritmos
//de encriptación se le aplica hashing
//algoritmo MD5
MD5CryptoServiceProvider hashmd5 =
new MD5CryptoServiceProvider();
keyArray = hashmd5.ComputeHash(
UTF8Encoding.UTF8.GetBytes(key));
hashmd5.Clear();
TripleDESCryptoServiceProvider tdes =
new TripleDESCryptoServiceProvider();
tdes.Key = keyArray;
tdes.Mode = CipherMode.ECB;
tdes.Padding = PaddingMode.PKCS7;
ICryptoTransform cTransform =
tdes.CreateDecryptor();
byte[] resultArray =
cTransform.TransformFinalBlock(Array_a_Descifrar,
0, Array_a_Descifrar.Length);
tdes.Clear();
//se regresa en forma de cadena
return UTF8Encoding.UTF8.GetString(resultArray);
}
{
byte[] keyArray;
//convierte el texto en una secuencia de bytes
byte[] Array_a_Descifrar =
Convert.FromBase64String(textoEncriptado);
//se llama a las clases que tienen los algoritmos
//de encriptación se le aplica hashing
//algoritmo MD5
MD5CryptoServiceProvider hashmd5 =
new MD5CryptoServiceProvider();
keyArray = hashmd5.ComputeHash(
UTF8Encoding.UTF8.GetBytes(key));
hashmd5.Clear();
TripleDESCryptoServiceProvider tdes =
new TripleDESCryptoServiceProvider();
tdes.Key = keyArray;
tdes.Mode = CipherMode.ECB;
tdes.Padding = PaddingMode.PKCS7;
ICryptoTransform cTransform =
tdes.CreateDecryptor();
byte[] resultArray =
cTransform.TransformFinalBlock(Array_a_Descifrar,
0, Array_a_Descifrar.Length);
tdes.Clear();
//se regresa en forma de cadena
return UTF8Encoding.UTF8.GetString(resultArray);
}
Una vez terminado esto solo nos queda ingresar las llamadas a estos métodos desde los botones de la aplicación:
private void button1_Click(object sender, EventArgs e)
{
textBox2.Text = Encriptar(textBox1.Text);
}
{
textBox2.Text = Encriptar(textBox1.Text);
}
private void button2_Click(object sender, EventArgs e)
{
textBox3.Text = Desencriptar(textBox2.Text);
}
{
textBox3.Text = Desencriptar(textBox2.Text);
}
El resultado final seria este:
Con esto terminamos este ejemplo, pero recuerden que entre mas sencilla sea la forma de encriptar y desencriptar mas fácil sera para un usuario experimentado averiguar la forma de desencriptar nuestra información, este ejemplo es meramente educativo sin embargo no es el mas seguro, saludos.
Exelente articulo,
ResponderEliminarDisculpa haz intentado crear el menu de windows 8 Metro style desconozco como codificar los itmems del grupo alojado sabes como es mi duda Gracias y excelente post..................
ResponderEliminarLa verdad aun desconozco sobre todo lo relacionado con Windows 8, quizás mas adelante.
EliminarBuenísimo! muchas gracias! me ha ayudado muchísimo!
ResponderEliminarBuenisimo exelente aporte uno de los mejores diria yo!!!
ResponderEliminarMuchas gracias...muy claro y conciso tu articulo!!! :)
ResponderEliminarExcelente .. groso..!!!
ResponderEliminarGrande Amigo me haz salvado (y)
ResponderEliminarExelente me sirvio mucho gracias por compartir tus conocimientos.
ResponderEliminarMuy buen articulo solo como una aportación en tu método Encriptar
ResponderEliminartienes un parametro de tipo String que es el texto que obtienes del TextBox de tu Formulario para poder cifrarlo ok.
y para llamar este metodo haces esto
textBox2.Text = Encriptar(textBox1.Text);
Si tu pones en tu metodo
public string Encriptar(this string texto)
{
}
puedes mandar a llamar tu metodo de la siguiente manera
textBox2.Text.Encriptar(textBox1.Text);
tal y como mandas a llamar el metodo ToString();
Esto le da una mejor vista a tu codigo y es mas practico.