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