Pregunta

El marco .NET viene con 6 algoritmos hash diferentes:

  • MD5:16 bytes (tiempo para hash de 500 MB:1462 ms)
  • SHA-1:20 bytes (1644 ms)
  • SHA256:32 bytes (5618 ms)
  • SHA384:48 bytes (3839 ms)
  • SHA512:64 bytes (3820 ms)
  • Madurado:20 bytes (7066 ms)

Cada una de estas funciones se realiza de manera diferente;MD5 es el más rápido y RIPEMD el más lento.

MD5 tiene la ventaja de que encaja en el tipo Guid integrado; y es la base del UUID tipo 3. El hash SHA-1 es la base del UUID tipo 5. Lo que los hace realmente fáciles de usar para la identificación.

MD5, sin embargo, es vulnerable a ataques de colisión, SHA-1 también es vulnerable pero en menor grado.

¿En qué condiciones debo utilizar qué algoritmo hash?

Las preguntas particulares que tengo mucha curiosidad por ver las respuestas son:

  • ¿No se puede confiar en MD5?En situaciones normales, cuando utiliza el algoritmo MD5 sin intenciones maliciosas y ningún tercero tiene intenciones maliciosas, esperaría CUALQUIER colisión (es decir, dos bytes arbitrarios [] que producen el mismo hash)

  • ¿Cuánto mejor es RIPEMD que SHA1?(si es mejor) es 5 veces más lento de calcular, pero el tamaño del hash es el mismo que SHA1.

  • ¿Cuáles son las probabilidades de obtener colisiones no maliciosas al aplicar hash a nombres de archivos (u otras cadenas cortas)?(P.ej.2 nombres de archivos aleatorios con el mismo hash MD5) (con MD5/SHA1/SHA2xx) En general, ¿cuáles son las probabilidades de colisiones no maliciosas?

Este es el punto de referencia que utilicé:

    static void TimeAction(string description, int iterations, Action func) {
        var watch = new Stopwatch();
        watch.Start();
        for (int i = 0; i < iterations; i++) {
            func();
        }
        watch.Stop();
        Console.Write(description);
        Console.WriteLine(" Time Elapsed {0} ms", watch.ElapsedMilliseconds);
    }

    static byte[] GetRandomBytes(int count) {
        var bytes = new byte[count];
        (new Random()).NextBytes(bytes);
        return bytes;
    }


    static void Main(string[] args) {

        var md5 = new MD5CryptoServiceProvider();
        var sha1 = new SHA1CryptoServiceProvider();
        var sha256 = new SHA256CryptoServiceProvider();
        var sha384 = new SHA384CryptoServiceProvider();
        var sha512 = new SHA512CryptoServiceProvider();
        var ripemd160 = new RIPEMD160Managed();

        var source = GetRandomBytes(1000 * 1024);

        var algorithms = new Dictionary<string,HashAlgorithm>();
        algorithms["md5"] = md5;
        algorithms["sha1"] = sha1;
        algorithms["sha256"] = sha256;
        algorithms["sha384"] = sha384;
        algorithms["sha512"] = sha512;
        algorithms["ripemd160"] = ripemd160;

        foreach (var pair in algorithms) {
            Console.WriteLine("Hash Length for {0} is {1}", 
                pair.Key, 
                pair.Value.ComputeHash(source).Length);
        }

        foreach (var pair in algorithms) {
            TimeAction(pair.Key + " calculation", 500, () =>
            {
                pair.Value.ComputeHash(source);
            });
        }

        Console.ReadKey();
    }
¿Fue útil?

Solución

En criptografía, las funciones hash proporcionan tres funciones separadas.

  1. Resistencia a colisiones : ¿Qué tan difícil es para alguien encontrar dos mensajes ( cualquiera dos mensajes) que tengan el mismo hash.
  2. Resistencia de preimagen : dado un hash, ¿qué tan difícil es encontrar otro mensaje que tenga el mismo hash? También conocido como función hash unidireccional .
  3. Segunda resistencia de preimagen : dado un mensaje, busque otro mensaje que tenga el mismo valor.

Estas propiedades están relacionadas pero son independientes. Por ejemplo, la resistencia a la colisión implica una segunda resistencia previa a la imagen, pero no al revés. Para cualquier aplicación dada, tendrá diferentes requisitos, necesitando una o más de estas propiedades. Una función hash para proteger las contraseñas en un servidor generalmente solo requerirá resistencia previa a la imagen, mientras que los resúmenes de mensajes requieren los tres.

Se ha demostrado que MD5 no es resistente a colisiones, sin embargo, eso no impide su uso en aplicaciones que no requieren resistencia a colisiones. De hecho, el MD5 a menudo todavía se usa en aplicaciones donde el tamaño y la velocidad de la clave más pequeños son beneficiosos. Dicho esto, debido a sus fallas, los investigadores recomiendan el uso de otras funciones hash en nuevos escenarios.

SHA1 tiene un defecto que permite encontrar colisiones en teoría mucho menos que los 2 ^ 80 pasos que requeriría una función hash segura de su longitud. El ataque se revisa continuamente y actualmente se puede realizar en ~ 2 ^ 63 pasos, apenas dentro del ámbito actual de computabilidad. Por esta razón, NIST está eliminando gradualmente el uso de SHA1, indicando que la familia SHA2 debe usarse después de 2010.

SHA2 es una nueva familia de funciones hash creadas después de SHA1. Actualmente no hay ataques conocidos contra las funciones SHA2. SHA256, 384 y 512 son parte de la familia SHA2, solo que usan diferentes longitudes de clave.

RIPEMD No puedo comentar demasiado, excepto para señalar que no es tan comúnmente utilizado como las familias SHA, y por lo tanto no ha sido analizado tan de cerca por los investigadores criptográficos. Solo por esa razón, recomendaría el uso de funciones SHA sobre él. En la implementación que está utilizando, también parece bastante lenta, lo que la hace menos útil.

En conclusión, no hay una mejor función: todo depende de para qué la necesite. Tenga en cuenta los defectos con cada uno y podrá elegir la función hash correcta para su escenario.

Otros consejos

Todas las funciones hash están "rotas"

El principio de casillero dice que por mucho que lo intentes no podrás meter más de 2 palomas en 2 agujeros (a menos que cortes las palomas).De manera similar, no puede colocar 2^128 + 1 números en 2^128 espacios.Todas las funciones hash dan como resultado un hash de tamaño finito, esto significa que siempre puedes encontrar una colisión si buscas secuencias de "tamaño finito" + 1.Simplemente no es factible hacerlo.No para MD5 y no para Madeja.

MD5/SHA1/Sha2xx no tienen posibilidades de colisión

Todas las funciones hash tienen colisiones, es una realidad.Encontrarse con estas colisiones por accidente equivale a ganar la lotería intergaláctica.Es decir, nadie gana la lotería intergaláctica, simplemente no es así como funciona la lotería.Nunca te encontrarás con un hash MD5/SHA1/SHA2XXX accidental.Cada palabra en cada diccionario, en cada idioma, tiene un valor diferente.Cada nombre de ruta, en cada máquina en todo el planeta, tiene un hash MD5/SHA1/SHA2XXX diferente.¿Cómo sé eso?, te preguntarás.Bueno, como dije antes, nadie gana la lotería intergaláctica, jamás.

Pero ...MD5 está roto

A veces el hecho de que esté roto no importa.

Tal como está, no se conocen ataques de preimagen o segundos preimagen en MD5.

Entonces, ¿qué tiene de malo el MD5?, te preguntarás.Es posible que un tercero genere 2 mensajes, uno de los cuales sea MAL y otro BUENO, y ambos tengan el mismo valor.(Ataque de colisión)

No obstante, la recomendación actual de RSA es no utilizar MD5 si necesita resistencia previa a la imagen.La gente tiende a pecar de cautelosa cuando se trata de algoritmos de seguridad.

Entonces, ¿qué función hash debo usar en .NET?

  • Utilice MD5 si necesita velocidad/tamaño y no le importan los ataques de cumpleaños o los ataques previos a la imagen.

Repite esto después de mí, no hay posibilidad de colisiones MD5, las colisiones maliciosas se pueden diseñar cuidadosamente.Aunque hasta la fecha no se conocen ataques previos a la imagen en MD5, la línea de los expertos en seguridad es que MD5 no debe usarse cuando sea necesario defenderse contra ataques previos a la imagen. LO MISMO ocurre con SHA1.

Tenga en cuenta que no todos los algoritmos necesitan defenderse contra ataques de colisión o preimagen.Tomemos el caso trivial de una búsqueda inicial de archivos duplicados en su disco duro.

  • Utilice la función basada en SHA2XX si desea una función hash criptográficamente segura.

Nadie encontró ninguna colisión SHA512.ALGUNA VEZ.Se han esforzado mucho.De hecho, nadie encontró ninguna colisión SHA256 o 384..

  • No utilice SHA1 o RIPEMD a menos que sea para un escenario de interoperabilidad.

RIPMED no ha recibido la misma cantidad de escrutinio que han recibido SHAX y MD5.Tanto SHA1 como RIPEMD son vulnerables a ataques de cumpleaños.Ambos son más lentos que MD5 en .NET y tienen un tamaño incómodo de 20 bytes.No tiene sentido utilizar estas funciones, olvídate de ellas.

Los ataques de colisión SHA1 se han reducido a 2^52, no pasará mucho tiempo hasta que las colisiones SHA1 estén disponibles.

Para obtener información actualizada sobre las distintas funciones hash, consulte el zoológico de función hash.

Pero espera, hay más

Teniendo un rápido La función hash puede ser una maldición.Por ejemplo:Un uso muy común de las funciones hash es el almacenamiento de contraseñas.Básicamente, calcula el hash de una contraseña combinado con una cadena aleatoria conocida (para impedir los ataques de arcoíris) y almacena ese hash en la base de datos.

El problema es que si un atacante obtiene un volcado de la base de datos, puede adivinar contraseñas de manera bastante efectiva usando fuerza bruta.Cada combinación que prueba sólo le lleva una fracción de milisegundo y puede probar cientos de miles de contraseñas por segundo.

Para solucionar este problema, el bcrypt Se puede utilizar un algoritmo, está diseñado para ser lento, por lo que el atacante se verá muy ralentizado si ataca un sistema que utiliza bcrypt.Recientemente cifrar ha aparecido en algunos titulares y algunos lo consideran más eficaz que bcrypt, pero no conozco una implementación .Net.

Actualización:

Los tiempos han cambiado, tenemos un ganador SHA3. Yo recomendaría usar keccak (también conocido como SHA3 ) ganador del concurso SHA3.

Respuesta original:

En orden de más débil a más fuerte, diría:

  1. RIPEMD BROKEN, nunca debe usarse como se puede ver en este pdf
  2. MD-5 BROKEN, nunca debe usarse, se puede romper en 2 minutos con una computadora portátil
  3. SHA-1 BROKEN, nunca debe usarse, está roto en principio, los ataques mejoran cada semana
  4. SHA-2 DÉBIL, probablemente se romperá en los próximos años. Se han encontrado algunas debilidades. Tenga en cuenta que, por lo general, cuanto mayor sea el tamaño de la clave, más difícil será La función hash es romper. Si bien el tamaño de la clave = fuerza no siempre es cierto, es principalmente cierto. Entonces SHA-256 es probablemente más débil que SHA-512.
  5. Skein SIN DEBILIDADES CONOCIDAS, es candidato para SHA-3 . Es bastante nuevo y, por lo tanto, no se ha probado. Se ha implementado en varios idiomas.
  6. MD6 SIN DEBILIDADES CONOCIDAS, es otro candidato para SHA-3. Probablemente más fuerte que Skien, pero más lento en máquinas de un solo núcleo. Al igual que Skien, no ha sido probado. Algunos desarrolladores con mentalidad de seguridad lo están utilizando, en roles de misión crítica .

Personalmente usaría MD6, porque uno nunca puede ser demasiado paranoico. Si la velocidad es una preocupación real, miraría Skein o SHA-256.

En defensa de MD5, no hay forma conocida de producir un archivo con un hash MD5 arbitrario. El autor original debe planificar con anticipación para tener una colisión funcional. Por lo tanto, si el receptor confía en el remitente, MD5 está bien. MD5 se rompe si el firmante es malicioso, pero no se sabe que sea vulnerable a los ataques de hombre en el medio.

El que uses realmente depende de para qué lo estés usando. Si solo quieres asegurarte de que los archivos no se corrompan en tránsito y no te preocupes tanto por la seguridad, hazlo rápido y pequeño. Si necesita firmas digitales para acuerdos de rescate federal de miles de millones de dólares y necesita asegurarse de que no se falsifiquen, trate de falsificar y frenar.

Me gustaría intervenir (antes de que md5 se rompa) que todavía uso md5 ampliamente a pesar de su abrumadora fragmentación para muchas criptomonedas.

Mientras no te importe protegerte contra colisiones (también puedes usar md5 de forma segura en un hmac) y deseas la velocidad (a veces quieres un hash más lento), entonces puedes usar md5 con confianza .

Sería una buena idea echar un vistazo al BLAKE2 algorythm.

Como se describe, es más rápido que MD5 y al menos tan seguro como SHA-3. También lo implementa varias aplicaciones de software , incluido WinRar.

No soy un experto en este tipo de cosas, pero me mantengo al día con la comunidad de seguridad y mucha gente considera que el hash md5 está roto. Diría que cuál usar depende de cuán sensibles sean los datos y la aplicación específica. Es posible que pueda escapar con un hash ligeramente menos seguro siempre que la clave sea buena y fuerte.

Aquí están mis sugerencias para usted:

  1. Probablemente deberías olvidar MD5 si anticipas ataques. Hay muchas tablas de arcoiris para ellas en línea, y se sabe que corporaciones como la RIAA pueden para producir secuencias con hashes equivalentes.
  2. Use una salt si puede. Incluir la longitud del mensaje en el mensaje puede hacer que sea muy difícil hacer una colisión hash útil.
  3. Como regla general, más bits significa menos colisiones (por principio de casillero) y más lento, y tal vez más seguro (a menos que sea un genio de las matemáticas que pueda encontrar vulnerabilidades).

Vea aquí un documento que detalla un algoritmo para crear colisiones md5 en 31 segundos con una computadora de escritorio Intel P4.

http://eprint.iacr.org/2006/105

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top