¿Qué función hash criptográfica debo elegir?


El. NET framework viene con 6 algoritmos hash diferentes:

  • MD5: 16 bytes (Tiempo para hash 500MB: 1462 ms)
  • SHA1: 20 bytes (1644 ms)
  • SHA256: 32 bytes (5618 ms)
  • SHA384: 48 bytes (3839 ms)
  • SHA512: 64 bytes (3820 ms)
  • RIPEMD: 20 bytes (7066 ms)

Cada una de estas funciones funciona de manera diferente; MD5 es la más rápida y RIPEMD es la más lenta.

MD5 tiene la ventaja de que cabe en el Guid incorporado tipo. Lo que hace que sea muy fácil de usar para la identificación.

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

¿Bajo qué condiciones debo usar qué algoritmo de hash?

Las preguntas particulares que tengo mucha curiosidad por ver respondidas son:

  • ¿No se puede confiar en MD5? En situaciones normales, cuando se utiliza el algoritmo MD5 sin intención maliciosa y ningún tercero tiene ninguna intención maliciosa ¿esperarías cualquier colisión (es decir, dos bytes arbitrarios[] produciendo el mismo hash)

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

  • ¿Cuáles son las probabilidades de obtener colisiones no maliciosas al hashear nombres de archivos (u otras cadenas cortas)? (Eg. 2 nombres de archivo 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 usé:

    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();
    }
Author: icktoofay, 2009-04-29

9 answers

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

  1. Resistencia a colisiones: Qué difícil es para alguien encontrar dos mensajes (cualquier dos mensajes) que tengan el mismo hash.
  2. Resistencia Preimágina : Dado un hash, ¿qué tan difícil es encontrar otro mensaje que hash igual? También conocida como función hash unidireccional.
  3. Segunda resistencia de preimagen : Dado un mensaje, encuentre otro mensaje que contenga el mismo hash.

Estas propiedades están relacionadas pero son independientes. Por ejemplo, la resistencia a la colisión implica resistencia a la segunda 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 asegurar contraseñas en un servidor normalmente solo requerirá resistencia preimagen, mientras que los digests de mensajes requieren las tres.

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

SHA1 tiene un defecto que permite que las colisiones se encuentren teóricamente en mucho menos de los 2^80 pasos que una función hash segura de su longitud requeriría. El ataque está siendo continuamente revisado y actualmente puede ser hecho en ~2^63 pasos-apenas dentro del reino actual de la computabilidad. Por esta razón, el NIST está eliminando gradualmente el uso de SHA1, afirmando que la familia SHA2 debería usarse después de 2010.

SHA2 es una nueva familia de funciones hash creadas después de SHA1. Actualmente no hay ataques conocidos contra 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 tener en cuenta que no es tan común utilizado como las familias SHA, y por lo tanto no ha sido examinado tan de cerca por los investigadores criptográficos. Por esa sola razón, recomendaría el uso de funciones SHA sobre él. En la implementación que está utilizando parece bastante lento, así, lo que hace que sea menos útil.

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

 128
Author: Eric Burnett,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-04-29 06:30:15

Todas las funciones hash están " rotas"

El principio del casillero dice que intenta tan duro como quieras no puedes meter más de 2 palomas en 2 agujeros (a menos que cortes las palomas). Del mismo modo, no puede caber 2^128 + 1 números en 2^128 ranuras. Todas las funciones hash resultan en un hash de tamaño finito, esto significa que siempre puede encontrar una colisión si busca a través de" tamaño finito " + 1 secuencias. Simplemente no es factible hacerlo. No para MD5 y no para Madeja.

MD5 / SHA1 / Sha2xx no tienen chance de colisiones

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

Pero ... MD5 está roto

A Veces, el hecho de que su roto no importa.

Tal como está, no se conocen ataques previos a la imagen o segundos ataques previos a la imagen en MD5.

Entonces, ¿qué es lo que está tan roto acerca de MD5, se puede preguntar? Es posible para que un tercero genere 2 mensajes, uno de los cuales es MALO y otro de los cuales es BUENO que ambos hash al mismo valor. (Ataque de colisión )

Sin embargo, la recomendación actual de RSA es no usar MD5 si necesita resistencia previa a la imagen. La gente tiende a errar por el lado de la precaución cuando se trata de algoritmos de seguridad.

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

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

Repita esto después de mí, no hay posibilidad de colisiones MD5, colisiones maliciosas pueden ser cuidadosamente diseñadas. A pesar de que no hay ataques previos a la imagen conocidos hasta la fecha en MD5, la línea de los expertos en seguridad es que MD5 no debe usarse donde necesite 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 preimagen o colisión. Tomemos el caso trivial de una primero pase la búsqueda de archivos duplicados en su HD.

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

Nadie encontró nunca ninguna colisión SHA512. NUNCA. Se han esforzado mucho. Para el caso nadie encontró ninguna colisión SHA256 o 384 nunca. .

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

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

Los ataques de colisión SHA1 se reducen a 2^52, no va a pasar mucho tiempo hasta que las colisiones SHA1 estén fuera en la naturaleza.

Para obtener información actualizada sobre las diversas funciones hash, eche un vistazo a la función hash zoo.

Pero espera, hay más

Teniendo una función hash fast puede ser una maldición. Por ejemplo: un uso muy común para las funciones hash es el almacenamiento de contraseñas. Esencialmente, se calcula el hash de una contraseña combinada con una cadena aleatoria conocida (para impedir los ataques rainbow) y se 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 intenta solo toma una fracción de milisegundo, y puede probar cientos de miles de contraseñas por segundo.

Para solucionar este problema, se puede usar el algoritmo bcrypt, está diseñado para ser lento, por lo que el atacante se ralentizará mucho si ataca un sistema que usa bcrypt. Recientemente scrypt ha hecho algunos titulares y es considerado por algunos como más eficaz que bcrypt, pero no sé de una implementación de.Net.

 100
Author: Sam Saffron,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:34:50

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 Yo diría:

  1. RIPEMD BROKEN, nunca debe usarse como se puede ver en este pdf
  2. MD-5 ROTO, nunca debe usarse, se puede romper en 2 minutos con una computadora portátil
  3. SHA-1 ROTO, nunca debe ser utilizado, es roto en principio, los ataques están mejorando por 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á romper la función hash. Si bien key size = strength no siempre es cierto, en su mayoría es cierto. Así que SHA-256 es probablemente más débil que SHA-512.
  5. Madeja NO HAY DEBILIDADES CONOCIDAS, es un candidato para SHA-3. Es bastante nuevo y por lo tanto no probado. tiene se ha implementado en un montón de 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 está probado. Algunos desarrolladores preocupados por la seguridad lo están usando, 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 me fijaría en Madeja, o SHA-256.

 33
Author: Ethan Heilman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-03-14 07:20:45

El que utilices realmente depende de para qué lo estés usando. Si solo desea asegurarse de que los archivos no se corrompan en tránsito y no está tan preocupado por la seguridad, opte por rápido y pequeño. Si necesita firmas digitales para acuerdos de rescate federales de miles de millones de dólares y necesita asegurarse de que no sean falsificados, vaya por duro para falsificar y lento.

 2
Author: tvanfosson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-04-29 02:53:04

Me gustaría mencionar (antes de que md5 se rompa) que todavía uso md5 ampliamente a pesar de su aplastante quebrantamiento para una gran cantidad de cripto.

Mientras no te importe protegerte contra colisiones (aún puedes usar md5 en un hmac) y quieras la velocidad (a veces quieres un hash más lento), puedes usar md5 con confianza.

 2
Author: Mike Boers,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-04-29 02:53:54

En defensa de MD5, no hay forma conocida de producir un archivo con un hash MD5 arbitrario. El autor original debe planificar de antemano para tener una colisión de trabajo. 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 man-in-the-middle.

 2
Author: rlbond,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-04-29 05:10:05

Sería una buena ideaa echar un vistazo al algoritmo BLAKE2.

Como se describe, es más rápido que MD5 y al menos tan seguro como SHA-3. También es implementado por varias aplicaciones de software , incluyendo WinRAR.

 1
Author: Florin Mircea,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-21 21:33:58

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

 0
Author: blueintegral,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-04-29 02:54:47

Aquí están mis sugerencias para usted:

  1. Probablemente debería olvidar MD5 si anticipa ataques. Hay muchas tablas rainbow para ellos en línea, y se sabe que corporaciones como la RIAA pueden producir secuencias con hashes equivalentes.
  2. Usa un sal si puedes. 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 seas un genio de las matemáticas que puede 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

 0
Author: Unknown,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-04-30 20:22:27