El marco .NET se entrega con 6 algoritmos de hashing diferentes:
- MD5: 16 bytes (Tiempo de hash 500MB: 1462 ms)
- SHA-1: 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 se realiza de manera diferente; MD5 es el más rápido y RIPEMD es el más lento.
MD5 tiene la ventaja de que cabe en el tipo Guid incorporado; 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 los ataques de colisión , SHA-1 también es vulnerable, pero en menor grado.
¿En qué condiciones debo usar qué algoritmo de hash?
Las preguntas particulares que realmente tengo curiosidad por ver respondidas son:
¿No se puede confiar en MD5? En situaciones normales, cuando utiliza el algoritmo MD5 sin intención maliciosa y ningún tercero tiene ninguna intención maliciosa, 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 de hash es el mismo que SHA1.
¿Cuáles son las probabilidades de obtener colisiones no maliciosas al codificar nombres de archivos (u otras cadenas cortas)? (Por ejemplo, 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 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();
}
fuente
Respuestas:
En criptografía, las funciones hash proporcionan tres funciones separadas.
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, MD5 a menudo todavía se usa en aplicaciones donde el tamaño de 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 una falla 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, por lo que 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 lo 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 adecuada para su escenario.
fuente
Todas las funciones hash están "rotas"
El principio del casillero dice que, por mucho que lo intentes, no puedes colocar 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 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 en secuencias de "tamaño finito" + 1. Simplemente no es factible hacerlo. No para MD5 y no para Skein .
MD5 / SHA1 / Sha2xx no tienen colisiones casuales
Todas las funciones hash tienen colisiones, es un hecho de la vida. Encontrar estas colisiones por accidente es el equivalente a ganar la lotería intergaláctica . Es decir, nadie gana la lotería intergaláctica , no es así como funciona la lotería. No se encontrará con un hash MD5 / SHA1 / SHA2XXX accidental, NUNCA. 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 ?, puedes preguntar. Bueno, como dije antes, nadie gana la lotería intergaláctica, nunca.
Pero ... MD5 está roto
A veces el hecho de que está roto no importa .
Tal como está, no se conocen ataques previos a la imagen ni a la segunda imagen previa en MD5.
Entonces, ¿qué tiene de malo MD5? Es posible que un tercero genere 2 mensajes, uno de los cuales es MALO y el otro es BUENO, y ambos tienen el 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. Las personas tienden a equivocarse con precaución cuando se trata de algoritmos de seguridad.
Entonces, ¿qué función hash debo usar en .NET?
Repita 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 donde necesita defenderse contra los ataques previos a la imagen. MISMO va para SHA1 .
Tenga en cuenta que no todos los algoritmos necesitan defenderse contra ataques de imagen previa o colisión. Tome el caso trivial de una búsqueda de primer paso para archivos duplicados en su HD.
Nadie ha encontrado alguna colisión SHA512. NUNCA. Lo han intentado realmente duro. Por lo demás, nadie encontró nunca ninguna colisión SHA256 o 384. .
RIPMED no ha recibido la misma cantidad de escrutinio que SHAX y MD5. Tanto SHA1 como RIPEMD son vulnerables a los 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 redujeron a 2 ^ 52, no pasará mucho tiempo hasta que las colisiones SHA1 estén en libertad.
Para obtener información actualizada sobre las diversas funciones hash, eche un vistazo al zoológico de funciones hash .
Pero espera, hay más
Tener una función hash rápida puede ser una maldición. Por ejemplo: un uso muy común para las funciones hash es el almacenamiento de contraseñas. Esencialmente, calcula el hash de una contraseña combinada con una cadena aleatoria conocida (para impedir ataques de arco iris) 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 las contraseñas con bastante fuerza 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 aparecido en los titulares y algunos lo consideran más efectivo que bcrypt, pero no conozco una implementación de .Net.
fuente
Actualizar:
Los tiempos han cambiado, tenemos un ganador SHA3. 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:
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.
fuente
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.
fuente
El que usa realmente depende de para qué lo está 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, haga las cosas difíciles de falsificar y frenar.
fuente
Me gustaría comentar (antes de que md5 se rompa) que todavía uso md5 ampliamente a pesar de su abrumadora fragmentación para muchas criptomonedas.
Siempre y cuando no te importe protegerte contra colisiones (también puedes usar md5 de forma segura en un hmac) y quieres la velocidad (a veces quieres un hash más lento), entonces puedes usar md5 con confianza.
fuente
Sería una buena idea 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 lo implementan varias aplicaciones de software , incluido WinRar.
fuente
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. 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 escapar con un hash ligeramente menos seguro siempre que la clave sea buena y fuerte.
fuente
Aquí están mis sugerencias para ti:
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
fuente