Pregunta ¿Cuál es la diferencia entre usar MD5.Create y MD5CryptoServiceProvider?


En el marco de .NET hay un par de formas de calcular un hash MD5, pero hay algo que no entiendo;

¿Cuál es la distinción entre lo siguiente? ¿Qué los distingue unos de otros? 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();
    }

32
2018-04-08 02:11


origen


Respuestas:


System.Security.Cryptography.MD5.Create () en realidad está creando 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 hash MD5.

MD5CryptoServiceProvider Calcula el valor de 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.


29
2018-04-08 02:16



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


11
2018-04-08 02:34



Mis 2 centavos.

MD5 agrega un poco de sobrecarga y es más lento comparado con MD5CryptoServiceProvider

Acabo de realizar una pequeña prueba de estrés generando 300k hashes de una cadena:

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

Casi 1.5 veces más lento.

PD. Probado en una laptop con núcleo i7


1
2018-03-13 10:50