Signatur
Beschreibung
sodium_crypto_box_seal implementiert das Konzept der Sealed Box aus der libsodium-Bibliothek. Eine Nachricht wird mit dem öffentlichen Schlüssel des Empfängers verschlüsselt, ohne dass der Absender dabei eine Identität oder einen eigenen Schlüssel preisgibt. Das Ergebnis ist eine anonyme, verschlüsselte Nachricht, die nur der Empfänger mit seinem privaten Schlüssel entschlüsseln kann.
Intern erzeugt die Funktion ein ephemeres (einmaliges) Schlüsselpaar. Der öffentliche Teil dieses Paares wird zusammen mit dem Chiffretext übermittelt, damit der Empfänger den gemeinsamen Schlüssel (ECDH) rekonstruieren kann. Der private Teil des ephemeren Schlüsselpaars wird nach der Verschlüsselung sicher vernichtet, sodass der Absender nachträglich nicht mehr in der Lage ist, die eigene Nachricht zu entschlüsseln – echte Forward Anonymity des Senders.
Die Funktion eignet sich besonders für Szenarien, in denen ein Absender anonym bleiben soll, beispielsweise bei Formularen, Feedback-Systemen oder Whistleblower-Plattformen. Für bidirektionale, authentifizierte Kommunikation empfiehlt sich stattdessen sodium_crypto_box, das die Identität beider Seiten einbezieht.
Der erzeugte Chiffretext enthält einen Overhead von 48 Bytes (32 Bytes ephemeraler öffentlicher Schlüssel + 16 Bytes MAC-Tag) gegenüber der Klartextlänge.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $message Pflicht | string | Die zu verschlüsselnde Klartextnachricht als Byte-String beliebiger Länge. | |
| $recipient_public_key Pflicht | string | Der öffentliche Schlüssel des Empfängers als Byte-String der Länge SODIUM_CRYPTO_BOX_PUBLICKEYBYTES (32 Bytes). Kann mit sodium_crypto_box_keypair oder sodium_crypto_box_publickey erzeugt werden. |
Rückgabewert
strlen($message) + SODIUM_CRYPTO_BOX_SEALBYTES (48 Bytes Overhead). Bei einem Fehler wird eine SodiumException geworfen.Beispiele
Grundlegende anonyme Verschlüsselung und Entschlüsselung
<?php
// Schlüsselpaar des Empfängers erzeugen
$keypair = sodium_crypto_box_keypair();
$publicKey = sodium_crypto_box_publickey($keypair);
$privateKey = sodium_crypto_box_secretkey($keypair);
// Absender verschlüsselt anonym
$message = 'Geheime Nachricht vom anonymen Absender';
$ciphertext = sodium_crypto_box_seal($message, $publicKey);
echo 'Verschlüsselt (' . strlen($ciphertext) . ' Bytes): ' . base64_encode($ciphertext) . PHP_EOL;
// Empfänger entschlüsselt mit seinem Schlüsselpaar
$decrypted = sodium_crypto_box_seal_open($ciphertext, $keypair);
if ($decrypted === false) {
echo 'Entschlüsselung fehlgeschlagen!' . PHP_EOL;
} else {
echo 'Entschlüsselt: ' . $decrypted . PHP_EOL;
}
// Schlüsselmaterial sicher löschen
sodium_memzero($privateKey);
sodium_memzero($keypair);
Anonymes Kontaktformular – öffentlichen Schlüssel aus Datei laden
<?php
// Empfänger-Schlüssel aus Konfiguration/Datei laden (nur public key wird verteilt)
$publicKeyBase64 = file_get_contents('/etc/myapp/recipient_public.key');
$publicKey = sodium_base642bin(trim($publicKeyBase64), SODIUM_BASE64_VARIANT_ORIGINAL);
// Benutzernachricht aus Formular
$userMessage = $_POST['message'] ?? '';
if ($userMessage === '') {
exit('Keine Nachricht übermittelt.');
}
// Anonyme Verschlüsselung – kein Absender-Schlüssel nötig
$encrypted = sodium_crypto_box_seal($userMessage, $publicKey);
// Verschlüsselte Nachricht in Datenbank oder Datei speichern
$storable = sodium_bin2base64($encrypted, SODIUM_BASE64_VARIANT_ORIGINAL);
file_put_contents('/var/myapp/messages/' . uniqid('msg_', true) . '.enc', $storable);
echo 'Ihre Nachricht wurde sicher übermittelt.';
// Öffentlichen Schlüssel aus dem Speicher löschen (Best Practice)
sodium_memzero($publicKey);
// Wichtig · Fallstricke
Sicherheitshinweise:
- Der private Schlüssel des Empfängers muss zu keinem Zeitpunkt dem Absender bekannt sein oder übertragen werden – nur der öffentliche Schlüssel wird benötigt.
- Verwende stets
sodium_memzero, um private Schlüssel nach Verwendung sicher aus dem Speicher zu entfernen. - Der Chiffretext authentifiziert den Empfänger, aber nicht den Absender. Ist eine Absenderauthentifizierung erforderlich, nutze
sodium_crypto_boxmit einem Schlüsselpaar des Absenders. - Die Funktion ist nicht für die Verschlüsselung sehr großer Datenmengen (z. B. Dateien mehrerer Megabytes) ausgelegt; für solche Fälle empfiehlt sich eine hybride Verschlüsselung (z. B. symmetrischer Schlüssel mit
sodium_crypto_secretstreamverschlüsseln, diesen Schlüssel dann mitsodium_crypto_box_sealversiegeln). - Seit PHP 7.2 ist die Sodium-Erweiterung im Core enthalten und muss nicht mehr separat installiert werden.