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.