c# - golang - Diferencia entre HMACSHA256 y HMACSHA512
hmac sha256 kotlin (3)
HMAC invoca el algoritmo hash dos veces frente a SHA3 no requiere la construcción HMAC para el hashing con clave, por lo que la invocación dual es fácilmente evitable. Como resultado, SHA3 supera a HMAC-SHA2 en rendimiento y HMAC-SHA1 en seguridad (lo mejor de ambos mundos).
Estamos utilizando el siguiente código para generar un hash HMac contra un valor sensible en C #
public string GenerateHMac(string key, string message)
{
var decodedKey = Convert.FromBase64String(key);
var hasher = new HMACSHA256(decodedKey);
var messageBytes = Encoding.Default.GetBytes(message);
var hash = hasher.ComputeHash(messageBytes);
return Convert.ToBase64String(hash);
}
La clave pasada es una cadena codificada de base 64 de 256 bits. Se planteó una pregunta sobre si deberíamos usar HMACSHA256, HMACSHA384 o HMACSHA512 para calcular el valor.
- ¿Cuáles son las ventajas de usar HMACSHA512 sobre HMACSHA256?
- ¿Es significativamente más seguro?
- ¿Hay implicaciones dramáticas en el rendimiento cuando se usa una llave más larga?
Como nota al margen; ¿el valor decodedKey
que estoy pasando al constructor necesita ser una clave de 512 bits si uso HMACSHA512?
No creo que tenga que preocuparse por las ventajas de seguridad, todavía se cree que HmacSha1 es seguro y la seguridad debe considerarse en relación con la longitud de la clave. El rendimiento de Sha256 vs Sha512 dependerá de la implementación, plataforma, etc., tendrá que probarse usted mismo. Y las longitudes de clave que proporciona a HMAC son independientes del algoritmo hash, consulte pseudocódigo .
Para ver la fuerza de los métodos de hash, sírvanse echar un vistazo al sitio web keylength.com . Verá que incluso SHA-256 tiene un margen de seguridad bastante grande.
Lo que es más, el algoritmo HMAC es bastante ajeno a los ataques al algoritmo hash subyacente. HMAC es impermeable al problema del cumpleaños, que reduce a la mitad la fuerza de la tecla a la mitad de la salida de hash. No se aplica simplemente porque el adversario no tiene la clave secreta y, por lo tanto, no puede intentar crear colisiones. Es por eso que incluso HMAC-SHA1 es bastante seguro.
Ahora la velocidad del hash depende del entorno de ejecución. Pero, en general, puede hacer las siguientes suposiciones:
- SHA-1 generalmente es más rápido que cualquier implementación de SHA-2 en la misma plataforma;
- SHA-512 es más rápido que SHA-256 en máquinas de 64 bits (ya que usan aritmética de 64 bits internamente);
- SHA-256 es más rápido que SHA-512 en máquinas de 8, 16 y 32 bits.
Use SHA-1 si está esperando problemas de compatibilidad. De lo contrario, puede ir por SHA-512 (y cortar el resultado a un número razonable de bits). El estado interno y mayor seguridad de SHA-512 puede ser una ligera ventaja. Me encontré con problemas con los clientes que no aceptan ninguna forma de SHA-1 debido a problemas generales con el algoritmo; en otras palabras, el hecho de que no es seguro en general puede obstaculizar la aceptación.
Tenga en cuenta que SHA-384 y los métodos menos conocidos SHA-512/256 y SHA-512/224 son una forma especial de SHA-512, con salida de 384, 256 y 224 bits. Entonces la velocidad de estos algoritmos es idéntica. La única diferencia aparte del tamaño de salida es que estas formas especiales usan valores iniciales diferentes internamente. De lo contrario, SHA-512 cortado a 384 bit es tan seguro y tan rápido como SHA-512/384. Sin embargo, debe usar SHA-384 para seguir siendo compatible.
El tamaño de la clave de entrada no depende de la función hash subyacente. La clave es primero XOR-enmascarado y luego hash por la función hash subyacente; algoritmos de hash pueden tomar cantidades prácticamente ilimitadas de datos como entrada.
Se recomienda utilizar un tamaño de clave que sea al menos del tamaño del método hash utilizado, de lo contrario, puede degradar el margen de seguridad proporcionado por el método HMAC. Puede haber una penalización de rendimiento menor si el tamaño de la clave fuerza al algoritmo de hash a hash múltiples bloques.
También podría usar el (próximo) estándar SHA-3 en el sentido de que sería seguro. HMAC-SHA-3 actualmente no tiene demasiado sentido. HMAC es en realidad excesivo para SHA-3 (Keccak); SHA-3 debe ser seguro incluso sin la construcción HMAC. [Editar] por ahora, KMAC se ha estandarizado como construcción MAC para SHA-3.
Además de eso, los constructos SHA-2 han demostrado, de manera algo sorprendente, una resistencia bastante buena contra el análisis de criptas durante la competencia SHA-3. Por lo tanto, no es necesario actualizar a SHA-3.