Signatur
Beschreibung
rnp_save_keys ist Teil der RNP-Erweiterung für PHP, die eine Schnittstelle zur librnp-Bibliothek bereitstellt. Die Funktion serialisiert alle Schlüssel (oder einen bestimmten Schlüsseltyp) aus dem übergebenen FFI-Kontext und schreibt das Ergebnis in einen PHP-String – ohne dabei eine Datei zu erzeugen.
Als $format werden typischerweise die Werte 'GPG' (binäres OpenPGP-Format nach RFC 4880) oder 'JSON' (JSON-basiertes Format) akzeptiert. Der $key_type-Parameter bestimmt, welche Schlüssel exportiert werden sollen: öffentliche Schlüssel (RNP_KEY_TYPE_PUBLIC), private Schlüssel (RNP_KEY_TYPE_SECRET) oder beide (RNP_KEY_TYPE_ANY).
Die Funktion eignet sich besonders, wenn Schlüsselmaterial in einer Datenbank, einem Key-Value-Store oder in einer API-Antwort gespeichert bzw. übertragen werden soll, ohne temporäre Dateien auf dem Dateisystem zu erzeugen. Das Ergebnis wird als Referenz in $output geschrieben.
Zum erneuten Laden des gespeicherten Schlüsselmaterials kann rnp_load_keys verwendet werden.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $ffi Pflicht | RnpFFI | Ein gültiger RnpFFI-Kontext, der zuvor mit rnp_ffi_create() erzeugt und mit Schlüsseln befüllt wurde. |
|
| $format Pflicht | string | Das Ausgabeformat der Schlüssel, z. B. 'GPG' für binäres OpenPGP oder 'JSON' für das JSON-basierte Format. |
|
| $output Pflicht | string | Referenz auf einen PHP-String, in den die serialisierten Schlüsseldaten geschrieben werden. Wird bei Erfolg befüllt. | |
| $key_type Pflicht | int | Bestimmt, welche Schlüssel exportiert werden: RNP_KEY_TYPE_PUBLIC (nur öffentliche), RNP_KEY_TYPE_SECRET (nur private) oder RNP_KEY_TYPE_ANY (beide). |
Rückgabewert
true zurück, wenn die Schlüssel erfolgreich in den Ausgabe-String geschrieben wurden. Im Fehlerfall (ungültiger Kontext, nicht unterstütztes Format o. Ä.) wird false zurückgegeben.Beispiele
Öffentliche Schlüssel in einen String exportieren
<?php
// FFI-Kontext erzeugen
$ffi = rnp_ffi_create('GPG', 'GPG');
// Schlüsselpaar generieren
rnp_generate_key_json($ffi, json_encode([
'primary' => [
'type' => 'RSA',
'length' => 2048,
'userid' => 'Test User <test@example.com>',
],
'sub' => [
'type' => 'RSA',
'length' => 2048,
],
]), $keyId);
// Öffentliche Schlüssel in einen PHP-String speichern
$output = '';
if (rnp_save_keys($ffi, 'GPG', $output, RNP_KEY_TYPE_PUBLIC)) {
echo 'Exportierte Bytes: ' . strlen($output) . PHP_EOL;
// $output könnte jetzt in einer Datenbank gespeichert werden
} else {
echo 'Fehler beim Speichern der Schlüssel.' . PHP_EOL;
}
rnp_ffi_destroy($ffi);
Schlüssel im JSON-Format exportieren und wieder laden
<?php
$ffi = rnp_ffi_create('GPG', 'GPG');
// Vorhandene Schlüssel aus Datei laden
rnp_load_keys($ffi, 'GPG', file_get_contents('/path/to/pubring.gpg'), RNP_KEY_TYPE_PUBLIC);
// Schlüssel in JSON-String exportieren
$jsonOutput = '';
if (rnp_save_keys($ffi, 'JSON', $jsonOutput, RNP_KEY_TYPE_PUBLIC)) {
// JSON in Datenbank speichern
$pdo->prepare('INSERT INTO keystore (data) VALUES (?)')->execute([$jsonOutput]);
echo 'Schlüssel als JSON gespeichert.' . PHP_EOL;
}
// Später: Schlüssel aus dem gespeicherten JSON wieder laden
$ffi2 = rnp_ffi_create('GPG', 'GPG');
rnp_load_keys($ffi2, 'JSON', $jsonOutput, RNP_KEY_TYPE_PUBLIC);
echo 'Schlüssel erfolgreich wiederhergestellt.' . PHP_EOL;
rnp_ffi_destroy($ffi);
rnp_ffi_destroy($ffi2);
// Wichtig · Fallstricke
Sicherheitshinweis: Beim Export privater Schlüssel (RNP_KEY_TYPE_SECRET oder RNP_KEY_TYPE_ANY) enthält der Ausgabe-String sensitives Schlüsselmaterial. Der String sollte niemals unverschlüsselt in Logs, APIs oder unsicheren Speicherorten abgelegt werden. Achte darauf, dass der Speicher nach der Verwendung bereinigt wird ($output = '';).
Die Funktion ist Teil der PECL-Erweiterung rnp und erfordert, dass librnp auf dem System installiert ist. Da die Erweiterung noch nicht weit verbreitet ist, kann die genaue Verfügbarkeit der Konstanten (RNP_KEY_TYPE_PUBLIC etc.) je nach installierter Version variieren.