Volver a la página principal
lunes 4 noviembre 2024
53

Cómo generar un hash HMAC en PHP con hash_hmac()

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.

¿Qué es 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.

Sintaxis

string hash_hmac ( string $algo , string $data , string $key [, bool $binary = false ] )
  • algo: Algoritmo de hash a utilizar (por ejemplo, sha256, md5, sha1).
  • data: Los datos (mensaje) sobre los que se va a calcular el hash HMAC.
  • key: La clave secreta que se usa para generar el hash HMAC.
  • binary (opcional): Si es true, el hash se devuelve en formato binario; si es false, se devuelve en formato hexadecimal.

Valores de retorno

Devuelve el hash HMAC en forma de cadena de texto. Si el parámetro binary es true, el hash se devuelve en binario.

Algoritmos soportados

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());

Ejemplo básico de uso de 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";

Resultado esperado

El hash HMAC es: <cadena hexadecimal del hash HMAC>

Ejemplo con el parámetro 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

Resultado esperado

El hash HMAC en binario es: <cadena hexadecimal representando el hash binario>

Ejemplo práctico: Validación de datos en una API

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.";
}

Seguridad adicional con 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.

Referencia oficial

Para más información sobre hash_hmac() en PHP, visita la documentación oficial de PHP.

Etiquetas:
php
Compartir:
Creado por:
Author photo

Jorge García

Fullstack developer