¿Cuáles son los requisitos para la clave secreta HMAC?

41

Estoy creando un servicio HTTP REST que estará disponible solo a través de tls.

Para fines de autenticación, planeo generar el token JWT para cada usuario que usa HMAC HS256 . Necesito una clave secreta para HMAC.

¿Cuáles son los requisitos para clave secreta ?

¿Necesito una larga cadena de caracteres aleatorios? ¿O una cuerda de longitud fija? ¿O qué?

    
pregunta ivstas 05.08.2015 - 12:49
fuente

4 respuestas

33

He agregado mi respuesta aquí porque siento que las existentes no responden directamente a tu pregunta lo suficiente para mi gusto.

Veamos RFC 4868 (en relación con IPSec, sin embargo, cubre la función HMAC-SHA256 que pretende para usar - em mine ):

  

Tamaño del bloque: el tamaño del bloque de datos del algoritmo hash subyacente         opera sobre Para SHA-256, esto es 512 bits , para SHA-384 y         SHA-512, esto es 1024 bits.

     

Longitud de salida: el tamaño del valor de hash producido por el   subyacente         algoritmo hash. Para SHA-256, esto es de 256 bits , para SHA-384 este         es de 384 bits, y para SHA-512, esto es de 512 bits.

Como notas de WhiteWinterWolf , se desaconseja más que B porque el valor se debe marcar utilizando SHA-256 primero ( es decir, 512 bits en este caso) y menos de L no se recomienda (256 bits en este caso). Sin embargo, una clave de 256 bits es una exageración, ya que cualquier cosa que sea de 128 bits o más no puede ser forzada brutalmente en la vida actual de nadie, incluso si todas las computadoras del mundo estuvieran trabajando para descifrarla.

Por lo tanto, recomendaría una clave de 128 bits, generada con un generador de números pseudoaleatorios criptográficamente seguro (CSPRNG). Si desea almacenar esto como texto, se puede representar una clave de 128 bits generando una cadena hexadecimal de longitud de 32 caracteres al azar, o alternativamente, podría generar 16 bytes aleatorios y luego ejecutarlos a través de una función base64.

    
respondido por el SilverlightFox 07.08.2015 - 12:05
fuente
9

La RFC 2104 que define funciones HMAC responde a esta pregunta:

  

La clave para HMAC puede ser de cualquier longitud (las claves más largas que B bytes son   primer hash utilizando H). Sin embargo, menos de L bytes es fuertemente   desanimado, ya que disminuiría la seguridad de la fuerza   función. Las claves más largas que L bytes son aceptables pero las adicionales   La longitud no aumentaría significativamente la fuerza de la función. (UNA   la clave más larga puede ser aconsejable si la aleatoriedad de la clave es   considerado débil.)

     

Las claves deben elegirse al azar (o usar un código criptográfico)   generador pseudoaleatorio fuerte sembrado con una semilla aleatoria), y   periódicamente refrescado. (Los ataques actuales no indican una   Frecuencia recomendada específica para cambios clave ya que estos ataques son   prácticamente inviable. Sin embargo, el refresco periódico es un   Práctica fundamental de seguridad que ayuda contra potenciales.   debilidades de la función y las teclas, y limita el daño de un   clave expuesta.)

Para información, se utiliza la siguiente notación en este extracto:

  

Suponemos que H es una función criptográfica de hash donde los datos están hash   mediante la iteración de una función de compresión básica en bloques de datos. Nosotros   denota por B la longitud en bytes de dichos bloques (B = 64 para todos los anteriores)   ejemplos mencionados de funciones hash), y por L la longitud de byte de   Salidas de hash (L = 16 para MD5, L = 20 para SHA-1).

    
respondido por el WhiteWinterWolf 05.08.2015 - 13:49
fuente
8

Según RFC 7518 - Algoritmos web JSON (JWA):

  

Una clave del mismo tamaño que la salida de hash (por ejemplo, 256 bits para   "HS256") o mayor DEBE usarse con este algoritmo. (Esta   El requisito se basa en la Sección 5.3.4 (Efecto de seguridad del HMAC).   Clave) de NIST SP 800-117 (sic) [ NIST.800-107 ] , que establece que el   La fuerza de seguridad efectiva es lo mínimo de la fuerza de seguridad.   de la clave y dos veces el tamaño del valor hash interno.)

Entonces, en el caso de JWT, DEBE usar una clave de al menos 256 bits con HS256.

    
respondido por el jordanbtucker 31.12.2016 - 20:17
fuente
1

EDIT: respuesta incorrecta. Se deja sin eliminar para conservar el hilo de comentarios.

Las claves de entrada de usuario de HMAC que son más largas que los algoritmos de hash específicos se reducen primero. (Ejecutando las claves largas a través del hash. Y luego utilizando ese hash como la clave real).

SHA256 genera hashes de 256 bits. Eso es de 32 bytes. Así que sugiero que genere claves secretas HMAC de 256 bits. (Utilizando un generador aleatorio criptográficamente seguro). Las claves ya no ofrecerán seguridad adicional.

    
respondido por el StackzOfZtuff 05.08.2015 - 13:07
fuente

Lea otras preguntas en las etiquetas