La función hash_hmac() en PHP permite generar un mensaje autenticado con un código de hash (HMAC) utilizando una clave secreta. Este método es útil para asegurar la integridad y autenticidad de los datos, siendo común en la autenticación de API y en aplicaciones donde se necesita validar que los datos no han sido manipulados.
hash_hmac() en PHP?
hash_hmac() genera un hash HMAC usando un algoritmo de hash específico y una clave secreta. Este tipo de hash garantiza que solo quienes conocen la clave pueden generar o validar el hash, lo que proporciona un nivel adicional de seguridad.
string hash_hmac ( string $algo , string $data , string $key [, bool $binary = false ] )
sha256, md5, sha1).
true, el hash se devuelve en formato binario; si es false, se devuelve en formato hexadecimal.
Devuelve el hash HMAC en forma de cadena de texto. Si el parámetro binary es true, el hash se devuelve en binario.
Para conocer todos los algoritmos de hash disponibles en el sistema, se puede usar la función hash_algos(), que devuelve un array de los nombres de los algoritmos compatibles.
<?php
print_r(hash_algos());
hash_hmac()
Este ejemplo genera un hash HMAC utilizando el algoritmo sha256 para un mensaje simple.
<?php
$data = "Mensaje de ejemplo";
$key = "clave_secreta";
$hash = hash_hmac('sha256', $data, $key);
echo "El hash HMAC es: $hash";
El hash HMAC es: <cadena hexadecimal del hash HMAC>
binary
Cuando se especifica el parámetro binary como true, el hash HMAC se devuelve en formato binario, lo cual puede ser útil si se necesita manipular el hash como datos binarios.
<?php
$data = "Otro mensaje";
$key = "clave_secreta";
$hash_binario = hash_hmac('sha256', $data, $key, true);
echo "El hash HMAC en binario es: " . bin2hex($hash_binario); // Convertimos a hexadecimal para mostrarlo
El hash HMAC en binario es: <cadena hexadecimal representando el hash binario>
Imagina que una API requiere validar que el mensaje enviado desde el cliente es auténtico. En este caso, se podría usar hash_hmac() para generar un hash del mensaje con una clave secreta compartida. El servidor puede verificar el hash para asegurarse de que el mensaje no ha sido modificado.
Cliente:
<?php
$data = "datos_importantes";
$key = "clave_secreta";
$hash_hmac = hash_hmac('sha256', $data, $key);
// El cliente envía $data y $hash_hmac al servidor
Servidor:
<?php
$data = $_POST['data']; // Supón que el cliente envió estos datos
$hash_recibido = $_POST['hash_hmac'];
$key = "clave_secreta";
// El servidor genera su propio hash y lo compara con el recibido
$hash_calculado = hash_hmac('sha256', $data, $key);
if (hash_equals($hash_calculado, $hash_recibido)) {
echo "Datos verificados correctamente.";
} else {
echo "Los datos han sido manipulados.";
}
hash_equals()
Para evitar ataques de tiempo, se recomienda utilizar hash_equals() al comparar hashes. Esta función compara las cadenas en un tiempo constante, previniendo ataques que dependen de la duración de la comparación.
Para más información sobre hash_hmac() en PHP, visita la documentación oficial de PHP.
Jorge García
Fullstack developer