En el .NET framework, ya que hay un par de maneras de calcular un hash MD5 parece, sin embargo, hay algo que no entiendo;

¿Cuál es la diferencia entre los siguientes? Lo que lo diferencia de uno al otro? 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();
    }
  • Me siento este debe ser mencionado como una parte importante de la respuesta correcta, de igual manera, se proporciona información detallada acerca de las versiones más recientes también!
InformationsquelleAutor Ben Lakey | 2010-04-08

4 Comentarios

  1. 31

    Sistema.De seguridad.La criptografía.MD5.Crear() es en realidad la creación de un MD5CryptoServiceProvider. Es por eso que usted verá los mismos resultados.

    Mirando la definición MD5 es la clase base y es abstracta. Supongo que agregó que el público de la función de creación de la facilidad de uso.

    public sealed class MD5CryptoServiceProvider : MD5
    
    public abstract class MD5 : HashAlgorithm

    Echa un vistazo a las definiciones.

    MD5 Representa la clase abstracta de la que todas las implementaciones del algoritmo de hash MD5 de heredar.

    MD5CryptoServiceProvider Calcula el valor hash MD5 para la entrada de datos mediante la aplicación proporcionada por el proveedor de servicios criptográficos (CSP). Esta clase no se puede heredar.

    • Se debe considerar el MD5.Create() método como una especie de método de fábrica que puede rerturn un MD5CryptoServiceProvider instancia de hoy, pero tiene la flexibilidad para devolver cualquier tipo de MD5 implementación en futuras versiones? Es el tipo de retorno es MD5, así que si usted quiere que su programa usar la última versión de la aplicación, a continuación, utilizar la MD5.Create() método.
    • ¿Cómo es posible que C# para devolver una instancia de una clase abstracta? Pensé que todo el propósito de una clase abstracta se que no puede ser instanciado, pero su heredado los niños pueden.
    • MD5.Crear() devuelve un MD5CryptoServiceProvider no el MD5 clase abstracta.
  2. 10

    Como Jason Rowe mencionados (por favor vote por su respuesta, esto es sólo una palabra de advertencia), no hay ninguna diferencia funcional. Sin embargo, hay una diferencia si usted está considerando MD5Managed (o cualquier criptografía de clase con Managed en el nombre). Managednombre de las clases no puede utilizarse cuando el cifrado compatible con FIPS algoritmos están habilitados a través de la Directiva de Grupo.

  3. 2

    Mis 2 centavos.

    MD5 añade un poco de sobrecarga y es más lento en comparación con MD5CryptoServiceProvider

    Me corrió un poco el estrés de la prueba de generación de 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 i7 core portátil

  4. 1

    También puede crear un MD5CryptoServiceProvider objeto de una de estas maneras:

    (MD5CryptoServiceProvider) HashAlgorithm.Crear(«MD5»);

    (MD5CryptoServiceProvider) HashAlgorithm.Crear(«Del Sistema.De seguridad.La criptografía.MD5»);

    Todos MD5 clases regresan mismo porque los hash MD5 es un algoritmo estándar no porque su código es el mismo.

    Pero el camino para crear una MD5CryptoServiceProvider objeto no es la única opción.

    Gobierno de estados unidos los equipos que ejecutan Windows debe tener habilitado el modo FIPS. De este modo se asegura que el código criptográfico utilizado es NIST validado.

    Los diversos .RED de cifrado clases normalmente existen en varias versiones. Una versión utiliza puro .NET de código, mientras que los otros llamar a una API de Win32 función de cifrado.

    Los diversos Win32 cryptographic Api son:

    • Windows NT 4 API criptográfica: CAPI (CryptoAPI). A mi entender se CSP (Proveedor de Servicios Criptográficos) es un API criptográfica por encima de la CryptoAPI.
    • Windows Vista API criptográfica: GNC (Criptografía de Próxima Generación)

    Microsoft dice: Proveedor de Servicios Criptográficos es obsoleto y puede ser eliminado en futuras versiones de Windows y dice que el GNC es el largo plazo para el reemplazo de CryptoAPI.

    El .RED de cifrado clases de nombres suelen tener estos sufijos:

    • «CryptoServiceProvider» para las clases que llamar a la CryptoAPI de la API de Win32.
    • «Gnc» para las clases que llamar a la GNC de la API de Win32.
    • «Administrado» para los puros .NET de código de las clases.

    Algunos de Win32 API puede no ser compatible con FIPS y parece que para una velada razón por la que Microsoft no solicitado o no se pudo obtener la validación FIPS para criptográfico .NET de código puro.

    Clases que no son compatible con FIPS aumento de un CryptographicException en los equipos que tienen habilitado el modo FIPS. Esto se menciona en la documentación.

    Por lo tanto, si el programa no está diseñado para ejecutarse en un gobierno de EE.UU. PC usted es libre de utilizar el más rápido de la clase.

    Acerca de MD5, como clases de nombres sugieren, MD5CryptoServiceProvider clase debe llamar a los ancianos y a ser obsoleto CryptoAPI y es compatible con FIPS, mientras que MD5Cng de la clase de las llamadas de la API de CNG y no es compatible con FIPS. Esta muestra MD5 puede no ser utilizable en NOSOTROS computadoras del gobierno en las futuras versiones de Windows. De hecho, MD5 .NET clases documentación recomienda la sustitución de MD5 por SHA256 o SHA512.

    Para más información sobre la posición ambigua de Microsoft acerca de FIPS ver:

    https://blogs.technet.microsoft.com/secguide/2014/04/07/why-were-not-recommending-fips-mode-anymore/

    MD5CryptoServiceProvider existe desde .NET Framework 1.1. MD5CryptoServiceProvider clase fue añadido a Windows XP el tiempo. En ese momento el subyacente Win32 API de CNG, no existe. Así MD5.El método Create, no tenía elección de algoritmo y Microsoft probablemente aún no tenía plan para la implementación de GNC en Windows. MD5Cng existe ya .NET Framework 3.5, después de GNC fue agregado a la Vista.

    Aproximados tiempo de ejecución en comparación con MD5CryptoServiceProvider (menos es mejor):

    MD5Cng: x 1.08 (.NET Framework 3.5)

    SHA256CryptoServiceProvider: x 2,5 (.NET Framework 3.5)

    SHA256Cng: x 2.4 (.NET Framework 3.5)

    SHA256Managed: x 4.8 (.NET Framework 1.1)

    Estos inesperados resultados muestran SHA256Managed .NET de código puro de ejecución es más lenta.

    En el momento SHA256Managed se implementó el mejor rendimiento de Windows Vista GNC no existe.

    De ejecución es siempre un poco más rápido cuando se realiza en una Secuencia que en una matriz de bytes.

    Hash para este post, para verificar que no fue modificado por un agente exterior:

    1c84TiredWithMSDNwrittenByAncientegyptians4cfebef40b0ae0a906b97c7

    • ¡Bien dicho! Estoy feliz de que a pesar de que el hilo viejo y la respuesta se marca como aceptado por encima, todavía me desplaza hacia abajo por alguna razón y reconoció algo nuevo y muy útil hoy en día! 🙂

Dejar respuesta

Please enter your comment!
Please enter your name here