/////////////////////////////////////////////////////////// // CRIPTOGRAFIA - Técnicas de desarrollo para profesionales /////////////////////////////////////////////////////////// // Capítulo 4: Criptografía en entornos .NET // Sección 4.5: Codificación de funciones de una vía y hash /////////////////////////////////////////////////////////// // Listado 4.8: Ejemplo para el computo y verificación // del hashing MD5 de una cadena de caracteres. Versión C#. /////////////////////////////////////////////////////////// using System; using System.Security.Cryptography; using System.Text; class EjemploMD5 { // Obtener el hash de una cadena y devolverlo también // como una cadena, de 32 caracteres (hexadecimal) static string getMd5Hash(string input) { // Crear una nueva instancia del objeto MD5CryptoServiceProvider MD5CryptoServiceProvider md5Hasher = new MD5CryptoServiceProvider(); // Convertir la cadena de entrada a un array de bytes y computar el hash byte[] data = md5Hasher.ComputeHash(Encoding.Default.GetBytes(input)); // Crear un nuevo Stringbuilder para armar la cadena resultado StringBuilder sBuilder = new StringBuilder(); // Iterar sobre cada byte del resultado del hashing y convertirlo // a una cadena de caracteres (hexadecimal) for (int i = 0; i < data.Length; i++) { sBuilder.Append(data[i].ToString("x2")); } // Devolver la cadena de caracteres resultado return sBuilder.ToString(); } // Verificar el hash de un string static bool verifyMd5Hash(string input, string hash) { // Obtener el hash de la entrada string hashOfInput = getMd5Hash(input); // Crear un StringComparer y comparar ambos resultados StringComparer comparer = StringComparer.OrdinalIgnoreCase; if (0 == comparer.Compare(hashOfInput, hash)) { return true; } else { return false; } } static void Main() { // Cadena de entrada de prueba string source = "Contenido de prueba"; // Obtener el resultado del hash string hash = getMd5Hash(source); // Imprimir resultado Console.WriteLine("El resultado del hash MD5 de " + source + " es: " + hash + "."); Console.WriteLine("Verificando el resultado del hash..."); // Imprimir resultado de comparación if (verifyMd5Hash(source, hash)) { Console.WriteLine("Ambos resultados coinciden."); } else { Console.WriteLine("Los resultados no coinciden."); } } }