Start · Sprachen · PHP · Referenz · hash_update

hash_update

Funktion

Fügt Daten an einen aktiven Hash-Kontext an und aktualisiert den internen Zustand des Hashing-Vorgangs.

seit PHP 5.1.2 Kategorie: crypto

Signatur

hash_update(HashContext $context, string $data): true

Beschreibung

hash_update() ermöglicht es, Daten schrittweise an einen zuvor mit hash_init() erstellten Hash-Kontext anzuhängen. Dies ist besonders nützlich, wenn große Datenmengen nicht auf einmal im Speicher gehalten werden können oder wenn Daten in mehreren Schritten (z. B. aus einem Stream) verarbeitet werden sollen.

Die Funktion arbeitet inkrementell: Jeder Aufruf aktualisiert den internen Zustand des Kontexts, ohne die bisherigen Daten zu verwerfen. Nach allen hash_update()-Aufrufen wird der finale Hash-Wert mit hash_final() abgerufen.

Für das Lesen von Daten direkt aus einer Datei oder einem Stream-Ressource bietet sich alternativ hash_update_file() oder hash_update_stream() an, die intern ebenfalls hash_update() nutzen, jedoch den Dateileseprozess kapseln.

Der verwendete Algorithmus sowie optionale Optionen (z. B. HMAC-Schlüssel) werden beim Erstellen des Kontexts mit hash_init() festgelegt und können nachträglich nicht mehr geändert werden.

Parameter

Name Typ Default Beschreibung
$context Pflicht HashContext Ein aktiver Hash-Kontext, der zuvor mit hash_init() erstellt wurde.
$data Pflicht string Die Daten, die an den Hash-Kontext angehängt werden sollen. Kann beliebige Binär- oder Textdaten enthalten.

Rückgabewert

Typ
true
Beschreibung
Gibt seit PHP 8.0 immer true zurück. In früheren Versionen wurde ebenfalls true zurückgegeben, der Rückgabetyp war jedoch noch nicht als true deklariert.

Beispiele

Schrittweises Hashing eines langen Textes

<?php
$context = hash_init('sha256');

$parts = [
    'Erster Teil der Nachricht. ',
    'Zweiter Teil der Nachricht. ',
    'Dritter Teil der Nachricht.',
];

foreach ($parts as $part) {
    hash_update($context, $part);
}

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

// Zum Vergleich: direktes Hashing des zusammengesetzten Strings
$combined = implode('', $parts);
echo hash('sha256', $combined) . PHP_EOL;
// Beide Ausgaben sind identisch
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

HMAC-Berechnung mit hash_update über mehrere Datenblöcke

<?php
$secretKey = 'mein-geheimer-schluessel';

$context = hash_init('sha512', HASH_HMAC, $secretKey);

// Daten werden in mehreren Schritten hinzugefügt
hash_update($context, 'Benutzername: admin');
hash_update($context, '|Zeitstempel: ' . time());
hash_update($context, '|Aktion: login');

$hmac = hash_final($context);
echo 'HMAC: ' . $hmac . PHP_EOL;

// Wichtig · Fallstricke

Sicherheitshinweis: Beim Einsatz von HMAC zur Authentifizierung von Nachrichten sollte der Vergleich des berechneten HMAC mit einem empfangenen Wert stets über hash_equals() erfolgen, um Timing-Angriffe zu vermeiden. Ein direkter Vergleich mit == oder === ist unsicher.

Nach dem Aufruf von hash_final() ist der Kontext verbraucht und kann nicht mehr für weitere hash_update()-Aufrufe verwendet werden. Soll ein Kontext an mehreren Stellen weiterverwendet werden, kann er zuvor mit hash_copy() dupliziert werden.

Ab PHP 8.0 ist der Rückgabewert der Funktion als true typisiert; in älteren Versionen war er bool, wurde aber praktisch immer als true zurückgegeben.