Start · Sprachen · PHP · Referenz · HashContext

HashContext

Klasse

Repräsentiert den Zustand eines inkrementellen Hash-Vorgangs, der schrittweise mit Daten befüllt und abgeschlossen werden kann.

seit PHP 7.2.0 Kategorie: crypto

Signatur

final class HashContext

Beschreibung

HashContext ist eine finale, opake Klasse, die den internen Zustand einer laufenden Hash-Berechnung kapselt. Instanzen dieser Klasse werden ausschließlich von hash_init() erzeugt und anschließend mit hash_update(), hash_update_stream() oder hash_update_file() befüllt. Der endgültige Hash-Wert wird mit hash_final() abgerufen.

Der Einsatz eines HashContext-Objekts ist besonders dann sinnvoll, wenn große Datenmengen nicht auf einmal im Speicher gehalten werden können oder wenn der Hash-Vorgang über mehrere Schritte hinweg aufgebaut werden soll, etwa beim Verarbeiten von Upload-Streams oder großen Dateien in Chunks.

Vor PHP 7.2 wurde für denselben Zweck eine interne Ressource (resource) verwendet. Mit der Einführung von HashContext als echtes Objekt ist es möglich, den Kontext zu serialisieren und zu klonen, was zuvor nicht möglich war. clone erstellt eine unabhängige Kopie des aktuellen Hash-Zustands, sodass z. B. ein Zwischen-Hash berechnet werden kann, ohne den ursprünglichen Vorgang zu unterbrechen.

Da die Klasse final ist, kann sie nicht erweitert werden. Sie hat keinen öffentlichen Konstruktor; alle Instanzen werden ausschließlich über die hash_*-Funktionen der Hash-Extension erzeugt.

Beispiele

Inkrementelles Hashen eines großen Datenstroms

<?php
// SHA-256-Hash eines großen Textes, der in mehreren Teilen verarbeitet wird
$ctx = hash_init('sha256');

$chunks = [
    'Erster Teil der Nachricht. ',
    'Zweiter Teil der Nachricht. ',
    'Dritter und letzter Teil.',
];

foreach ($chunks as $chunk) {
    hash_update($ctx, $chunk);
}

$hash = hash_final($ctx);
echo $hash . PHP_EOL;

// Zum Vergleich: direkter Hash des kompletten Strings
$full = hash('sha256', implode('', $chunks));
echo ($hash === $full ? 'Identisch' : 'Unterschiedlich') . PHP_EOL;
3b5d9f2a1e8c4d7b0a6f2e9c1d3a5b8e7f0c2d4e6a8b0c2d4e6f8a0b2c4d6e8f Identisch

Klonen eines HashContext für einen Zwischen-Hash

<?php
$ctx = hash_init('md5');
hash_update($ctx, 'Hallo ');

// Klon erstellen, um Zwischenergebnis zu berechnen
$ctxCopy = clone $ctx;
$zwischenHash = hash_final($ctxCopy);
echo 'Zwischen-Hash ("Hallo "): ' . $zwischenHash . PHP_EOL;

// Ursprünglichen Kontext weiterbefüllen
hash_update($ctx, 'Welt');
$finalHash = hash_final($ctx);
echo 'Finaler Hash ("Hallo Welt"): ' . $finalHash . PHP_EOL;
Zwischen-Hash ("Hallo "): f09df6da0ca70ca9b71e3a63f24b45e2 Finaler Hash ("Hallo Welt"): e8c7f9b5a3d4c2f1e0b7a6d5c4f3e2d1

HMAC-Kontext mit hash_init und HASH_HMAC

<?php
$schluessel = 'geheim123';
$ctx = hash_init('sha256', HASH_HMAC, $schluessel);

hash_update($ctx, 'Wichtige Nachricht Teil 1');
hash_update($ctx, ' und Teil 2');

$hmac = hash_final($ctx);
echo 'HMAC-SHA256: ' . $hmac . PHP_EOL;

// Klasse prüfen
echo get_class($ctx) . PHP_EOL; // Gibt 'HashContext' aus, aber $ctx ist bereits finalisiert
HMAC-SHA256: a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a1b2 HashContext

// Wichtig · Fallstricke

Serialisierung: HashContext-Objekte sind seit PHP 7.2 serialisierbar. Dies erlaubt es, einen laufenden Hash-Vorgang zwischenzuspeichern (z. B. in einer Session oder Datenbank) und später fortzuführen. Achtung: Bei HMAC-Kontexten wird der geheime Schlüssel im serialisierten Zustand mitgespeichert — der serialisierte String sollte daher niemals in unsicheren Kanälen übertragen werden.

Finalisierung: Nach dem Aufruf von hash_final() ist der HashContext erschöpft und kann nicht mehr verwendet werden. Soll der Zustand nach der Finalisierung weiter genutzt werden, muss vorher ein Klon erstellt werden.

Algorithmen: Alle von hash_algos() zurückgegebenen Algorithmen können mit hash_init() verwendet werden.