2010-04-08 33 views
32

En .NET Framework hay un par de formas de calcular un hash MD5, pero hay algo que no entiendo;¿Cuál es la diferencia entre usar MD5.Create y MD5CryptoServiceProvider?

¿Cuál es la distinción entre los siguientes? ¿Qué los distingue unos de otros? Ellos parecen producir resultados idénticos:

public static string GetMD5Hash(string str) 
    { 
     MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider(); 
     byte[] bytes = ASCIIEncoding.Default.GetBytes(str); 
     byte[] encoded = md5.ComputeHash(bytes); 

     StringBuilder sb = new StringBuilder(); 
     for (int i = 0; i < encoded.Length; i++) 
      sb.Append(encoded[i].ToString("x2")); 

     return sb.ToString(); 
    } 

    public static string GetMD5Hash2(string str) 
    { 
     System.Security.Cryptography.MD5 md5 = System.Security.Cryptography.MD5.Create(); 
     byte[] bytes = Encoding.Default.GetBytes(str); 
     byte[] encoded = md5.ComputeHash(bytes); 

     StringBuilder sb = new StringBuilder(); 
     for (int i = 0; i < encoded.Length; i++) 
      sb.Append(encoded[i].ToString("x2")); 

     return sb.ToString(); 
    } 

Respuesta

29

System.Security.Cryptography.MD5.Create() es en realidad la creación de un MD5CryptoServiceProvider. Es por eso que ves los mismos resultados.

Mirando la definición MD5 es la clase base y es abstracta. Supongo que agregaron la función de creación pública para facilitar su uso.

public sealed class MD5CryptoServiceProvider : MD5 

public abstract class MD5 : HashAlgorithm 

Eche un vistazo a las definiciones.

MD5 Representa la clase abstracta a partir de la cual heredan todas las implementaciones del algoritmo de hash MD5.

MD5CryptoServiceProvider Calcula el valor hash MD5 para los datos de entrada utilizando la implementación proporcionada por el proveedor de servicios criptográficos (CSP). Esta clase no puede heredarse.

+2

Considere el método 'MD5.Create()' como una especie de método de fábrica que puede generar una instancia 'MD5CryptoServiceProvider' hoy pero tiene la flexibilidad para devolver cualquier tipo de implementación MD5 en versiones futuras ? Su tipo de devolución es 'MD5', por lo que si desea que su programa use la última implementación, entonces use el método' MD5.Create() '. – Ben

+0

¿Cómo es posible que C# devuelva una instancia de una clase abstracta? Pensé que el propósito completo de una clase abstracta era que no se puede instanciar, pero sus hijos heredados sí. – silkfire

+0

MD5.Create() devuelve un MD5CryptoServiceProvider no la clase abstracta MD5. –

11

Como mencionó Jason Rowe (vote por su respuesta, esto es solo una palabra de advertencia), no hay diferencia funcional. Sin embargo, existe una diferencia si está considerando MD5Managed (o cualquier clase de criptografía con Managed en el nombre). Managed Las clases con nombre no se pueden usar cuando los algoritmos de cifrado que cumplen con FIPS están habilitados a través de la Política de grupo.

1

Mis 2 centavos.

MD5 añade un poco por encima y es más lento en comparación conMD5CryptoServiceProvider

Me acabo de encontrar un poco de prueba de esfuerzo generando 300k hash de una cadena:

MD5CryptoServiceProvider: 00:00:01.1750834 
MD5: 00:00:01.6398959 

casi 1,5 veces más lento.

PS. Probado en un portátil con núcleo i7

Cuestiones relacionadas