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