hash_hmac

funkcja

Oblicza HMAC — skrót wiadomości uwierzytelniony kluczem tajnym. Gwarantuje integralność i autentyczność danych. Używaj do podpisywania tokenów i webhooków.

hash_hmac(string $algo, string $data, string $key, bool $binary = false): string

hash_hmac generuje kod uwierzytelniania wiadomości (HMAC) — łączy skrót kryptograficzny z kluczem tajnym, dzięki czemu odbiorca może sprawdzić, czy dane nie zostały zmienione i czy pochodzą od właściwego nadawcy. Sam skrót (hash()) tego nie gwarantuje — HMAC wymaga znajomości klucza.

Właściwe zastosowania HMAC: podpisywanie webhooków GitHub/Stripe, tokeny jednorazowe w mailach, weryfikacja integralności danych między serwisami. Do bezpiecznego przechowywania haseł użytkowników nie używaj HMAC — użyj password_hash().

Wyniki porównuj zawsze przez hash_equals() — chroni przed atakami czasowymi (timing attacks).

<?php
declare(strict_types=1);

$wiadomosc = 'wiadomosc';
$klucz     = 'klucz'; // w praktyce: getenv('HMAC_SECRET')

$podpis = hash_hmac('sha256', $wiadomosc, $klucz);
echo $podpis;
// wynik: 9a1e277e36d174b9cd515b714b8de37a700081fc5cd0a64c1a4613bd22a3753c

// Weryfikacja webhooka — porównanie stałoczasowe:
$otrzymanyPodpis = $_SERVER['HTTP_X_HUB_SIGNATURE_256'] ?? '';
$oczekiwany      = 'sha256=' . hash_hmac('sha256', file_get_contents('php://input'), getenv('SECRET'));

if (!hash_equals($oczekiwany, $otrzymanyPodpis)) {
    http_response_code(403);
    exit('Nieautoryzowany webhook');
}

// Podpisany token w URL (np. link aktywacyjny):
$userId = 42;
$token  = hash_hmac('sha256', (string) $userId, getenv('HMAC_SECRET'));
$link   = "https://example.com/aktywuj?id={$userId}&token={$token}";
📘 Naucz się w lekcji →