Signatur
Beschreibung
sodium_crypto_box_secretkey() nimmt ein kombiniertes Schlüsselpaar-Binary (wie es von den sodium_crypto_box_keypair*()-Funktionen erzeugt wird) und gibt daraus den privaten/geheimen Schlüssel zurück. Das Schlüsselpaar ist intern eine Verkettung von Secret Key und Public Key; diese Funktion extrahiert nur den Secret-Key-Teil.
Der zurückgegebene Secret Key hat eine Länge von SODIUM_CRYPTO_BOX_SECRETKEYBYTES (32 Byte) und wird für die Ver- und Entschlüsselung mit sodium_crypto_box() bzw. sodium_crypto_box_open() benötigt. Er sollte niemals übertragen oder öffentlich gespeichert werden.
Typischer Einsatz: Ein Schlüsselpaar wird einmalig erzeugt und sicher gespeichert. Wenn nur der geheime Schlüssel – z. B. für die Entschlüsselung einer Nachricht – benötigt wird, kann er mit dieser Funktion aus dem gespeicherten Keypair extrahiert werden, ohne das Paar manuell zu zerlegen.
Verwenden Sie sodium_memzero(), um den Secret Key nach Benutzung sicher aus dem Speicher zu löschen, und sorgen Sie dafür, dass er ausschließlich in sicheren, verschlüsselten Speicherorten abgelegt wird.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $key_pair Pflicht | string | Ein kombiniertes Keypair-Binary, wie es sodium_crypto_box_keypair() oder sodium_crypto_box_keypair_from_secretkey_and_publickey() zurückgibt. Die Länge muss exakt SODIUM_CRYPTO_BOX_KEYPAIRBYTES (64 Byte) betragen. |
Rückgabewert
SODIUM_CRYPTO_BOX_SECRETKEYBYTES) zurück. Im Fehlerfall (ungültige Schlüsselpaar-Länge) wird eine SodiumException geworfen.Beispiele
Secret Key aus frisch generiertem Keypair extrahieren
<?php
// Neues Schlüsselpaar erzeugen
$keypair = sodium_crypto_box_keypair();
// Public Key und Secret Key extrahieren
$publicKey = sodium_crypto_box_publickey($keypair);
$secretKey = sodium_crypto_box_secretkey($keypair);
echo 'Public Key (hex): ' . sodium_bin2hex($publicKey) . PHP_EOL;
echo 'Secret Key (hex): ' . sodium_bin2hex($secretKey) . PHP_EOL;
echo 'Public Key Länge: ' . strlen($publicKey) . ' Byte' . PHP_EOL;
echo 'Secret Key Länge: ' . strlen($secretKey) . ' Byte' . PHP_EOL;
// Secret Key sicher aus dem Speicher löschen
sodium_memzero($secretKey);
sodium_memzero($keypair);
Gespeichertes Keypair laden und zum Entschlüsseln verwenden
<?php
// Annahme: Keypair wurde bei der Erstellung base64-kodiert in einer Datei gespeichert
// $storedKeypairBase64 = file_get_contents('/secure/path/keypair.key');
// Simuliertes Beispiel
$aliceKeypair = sodium_crypto_box_keypair();
$bobKeypair = sodium_crypto_box_keypair();
$bobPublicKey = sodium_crypto_box_publickey($bobKeypair);
// Alice verschlüsselt eine Nachricht für Bob
$nonce = random_bytes(SODIUM_CRYPTO_BOX_NONCEBYTES);
$aliceSecretKey = sodium_crypto_box_secretkey($aliceKeypair);
$encryptBox = sodium_crypto_box_keypair_from_secretkey_and_publickey(
$aliceSecretKey,
$bobPublicKey
);
$ciphertext = sodium_crypto_box('Geheime Nachricht', $nonce, $encryptBox);
// Bob entschlüsselt — extrahiert seinen Secret Key aus dem Keypair
$bobSecretKey = sodium_crypto_box_secretkey($bobKeypair);
$alicePublicKey = sodium_crypto_box_publickey($aliceKeypair);
$decryptBox = sodium_crypto_box_keypair_from_secretkey_and_publickey(
$bobSecretKey,
$alicePublicKey
);
$plaintext = sodium_crypto_box_open($ciphertext, $nonce, $decryptBox);
echo $plaintext . PHP_EOL;
// Schlüssel sicher löschen
sodium_memzero($aliceSecretKey);
sodium_memzero($bobSecretKey);
// Wichtig · Fallstricke
Sicherheitshinweise:
- Der Secret Key darf niemals übertragen, geloggt oder in unsicheren Speicherorten abgelegt werden. Verwenden Sie verschlüsselte Datenbanken oder Secrets-Manager.
- Nach der Verwendung sollte der Secret Key mit
sodium_memzero()aus dem PHP-Speicher entfernt werden, um ihn vor Memory-Dump-Angriffen zu schützen. - Wenn das übergebene
$key_pairnicht die exakte Länge vonSODIUM_CRYPTO_BOX_KEYPAIRBYTES(64 Byte) hat, wird eineSodiumExceptiongeworfen. Fangen Sie diese in produktivem Code ab. - Die Libsodium-Extension ist seit PHP 7.2 fest eingebaut; für ältere PHP-Versionen war das PECL-Paket
libsodiumerforderlich.