Start · Sprachen · PHP · Referenz · sodium_memzero

sodium_memzero

Funktion

Überschreibt den Inhalt einer Zeichenkette sicher mit Nullzeichen und gibt den Speicher frei.

seit PHP 7.2.0 Kategorie: crypto

Signatur

sodium_memzero(string &$buf): void

Beschreibung

sodium_memzero() löscht den Inhalt der übergebenen Variable, indem jedes Byte mit \0 überschrieben wird. Danach wird die Variable auf null gesetzt. Diese Funktion ist ein zentrales Werkzeug der sicheren Speicherverwaltung und verhindert, dass sensible Daten wie Passwörter, private Schlüssel oder geheime Tokens länger als nötig im Arbeitsspeicher verbleiben.

Der Hintergrund: Normale PHP-Zeichenketten werden durch den Garbage Collector irgendwann freigegeben, aber der Speicher wird dabei nicht zwingend überschrieben. Bis zur tatsächlichen Wiederverwendung kann ein Angreifer mit Speicherzugriff (z. B. durch Core-Dumps, Swap-Partitionen oder Seitenkanal-Angriffe) noch lesbare Klartextdaten vorfinden. sodium_memzero() schließt dieses Sicherheitsleck.

Besonders wichtig ist diese Funktion nach der Verwendung von kryptografischen Schlüsseln, Passwort-Hashes, Entschlüsselungs-Ergebnissen oder anderen geheimen Werten, die nach ihrer Nutzung sofort aus dem Speicher entfernt werden sollen. Sie ist Teil der Sodium-Erweiterung, die auf der bewährten libsodium-Bibliothek basiert.

Hinweis: Die Funktion nimmt das Argument per Referenz entgegen und setzt die Variable nach dem Nullen auf null. Sie hat keinen Rückgabewert.

Parameter

Name Typ Default Beschreibung
$buf Pflicht string Die zu löschende Zeichenkette, übergeben per Referenz (&$buf). Nach dem Aufruf ist die Variable null.

Rückgabewert

Typ
void
Beschreibung
Die Funktion gibt keinen Wert zurück.

Beispiele

Passwort nach Verwendung sicher aus dem Speicher löschen

<?php
// Passwort vom Benutzer entgegennehmen
$password = $_POST['password'] ?? '';

// Passwort-Hash erzeugen
$hash = password_hash($password, PASSWORD_ARGON2ID);

// Passwort sofort nach der Nutzung aus dem Speicher entfernen
sodium_memzero($password);

// $password ist jetzt null — sicher aus dem Speicher gelöscht
var_dump($password); // NULL

// Hash kann nun sicher in der Datenbank gespeichert werden
echo 'Hash: ' . $hash;
NULL Hash: $argon2id$...

Kryptografischen Schlüssel nach der Entschlüsselung löschen

<?php
// Schlüssel und Nonce erzeugen (normalerweise zuvor gespeichert/geladen)
$key   = sodium_crypto_secretbox_keygen();
$nonce = random_bytes(SODIUM_CRYPTO_SECRETBOX_NONCEBYTES);

$geheimtext = 'Streng geheime Botschaft';

// Nachricht verschlüsseln
$verschluesselt = sodium_crypto_secretbox($geheimtext, $nonce, $key);

// Nachricht entschlüsseln
$entschluesselt = sodium_crypto_secretbox_open($verschluesselt, $nonce, $key);

// Schlüssel und Klartext sofort aus dem Speicher entfernen
sodium_memzero($key);
sodium_memzero($geheimtext);

echo $entschluesselt; // Streng geheime Botschaft

// $key und $geheimtext sind jetzt null
var_dump($key, $geheimtext);
Streng geheime Botschaft NULL NULL

// Wichtig · Fallstricke

Sicherheitshinweis: PHP-interne Optimierungen wie Copy-on-Write können dazu führen, dass mehrere Variablen denselben Speicherbereich teilen. sodium_memzero() wirkt nur auf den übergebenen Variablen-Puffer; Kopien der Zeichenkette in anderen Variablen werden nicht automatisch gelöscht. Stellen Sie daher sicher, dass keine weiteren Referenzen oder Kopien sensibler Daten existieren.

Verfügbarkeit: Die Funktion setzt voraus, dass die sodium-Erweiterung installiert und aktiviert ist. Seit PHP 7.2.0 ist sie standardmäßig gebündelt. Auf älteren Systemen kann die paragonie/sodium_compat-Bibliothek als Fallback dienen, wobei diese aus technischen Gründen keinen garantierten Speicher-Nullungseffekt bieten kann.

Swap-Partitionen: Auch nach dem Nullen kann sensitiver Inhalt auf Swap-Partitionen oder in Core-Dumps vorhanden sein. Für höchste Sicherheit sollte Swap-Verschlüsselung aktiviert und Core-Dumps deaktiviert werden.