Creación correcta de la clave hash_hmac

2

Estoy buscando, pero no puedo encontrar, información definitiva sobre cuánto tiempo se debe guardar el secreto y qué caracteres se pueden usar para crear una firma HMAC en PHP usando SHA256.

Encontré información en stackoverflow pero todavía no estoy seguro de cuán larga debe ser la clave. En este contexto es de 1 carácter 1 bit? ¿Debería mi clave ser a-f0-9 y 256 caracteres?

Solo intento que la firma del mensaje se haga correctamente Gracias.

    
pregunta Erik 20.09.2012 - 16:45
fuente

3 respuestas

2

HMAC utiliza como clave una secuencia de bytes arbitrarios y de longitud arbitraria. Algunas implementaciones de HMAC / SHA-256 pueden (indebidamente) rechazar claves de más de 32 bytes.

Su clave debe ser tal que sea demasiado difícil encontrarla mediante una búsqueda exhaustiva con una probabilidad de éxito no despreciable. Si su clave proviene de una fuente fuerte de bytes aleatorios (por ejemplo, /dev/urandom ), entonces 16 bytes son suficientes. Si la clave proviene de un dispositivo informático biológico (es decir, el cerebro de un ser humano), entonces volverá a toda la problemática de las contraseñas (que es mejor evitar si es posible).

    
respondido por el Thomas Pornin 20.09.2012 - 16:58
fuente
1

La función hash_hmac toma entrada binaria, es decir, cadenas hechas de bytes en bruto. La codificación de caracteres no debería entrar en juego en absoluto.

Por ejemplo, si utilizara SHA256 para calcular la clave HMAC, a partir de una contraseña, haría algo como esto:

// second parameter selects raw bytes or ASCII hex for output (false = hex, true = raw)
$hmac_key = hash("sha256", $password, true);
// last parameter is, again, whether or not to output raw bytes
echo hash_hmac("sha256", $data, $hmac_key, false);

Suponiendo que la contraseña es "polinomial", la variable $hmac_key debería ser:

61890d2331f470cb4caeda6035ae27809bee14a42ba3e024ebcfeec9086764d0

Tenga en cuenta que se trata de un representación hexadecimal del contenido de la variable; en realidad, contendrá bytes sin procesar. Ahora supongamos que nuestro mensaje es "¡Hola!". El resultado es el siguiente:

e075d7284eb03baedabb7c27ae1e9f271e763b67c776f3894417f310378da10b

(lo anterior fue generado por QuickHash )

Los esquemas HMAC requieren que la longitud de la clave sea igual al tamaño de bloque del hash. Algunas implementaciones utilizan un algoritmo hash para producir el tamaño correcto si la entrada es más grande o más pequeña que el tamaño del bloque. Por lo general, el algoritmo hash utilizado es la versión no HMAC de lo que esté usando. No estoy seguro de si PHP hace esto y (si lo hacen) qué método usan.

    
respondido por el Polynomial 20.09.2012 - 16:55
fuente
1

Depende de su nivel de seguridad deseado. Se recomienda utilizar algo SHA256 con una clave de al menos 256 bits para lograr un nivel de seguridad de 128 bits (contra, por ejemplo, ataques de colisión de cumpleaños). Mencionó caracteres, pero es importante tener en cuenta que una clave es binaria y no debe limitarse a caracteres legibles por humanos.

    
respondido por el djozsef 22.09.2012 - 10:40
fuente

Lea otras preguntas en las etiquetas