Start · Sprachen · PHP · Referenz · rnp_save_keys

rnp_save_keys

Funktion

Speichert OpenPGP-Schlüssel aus einem <code>RnpFFI</code>-Kontext in einen PHP-String im angegebenen Format.

Kategorie: crypto

Signatur

rnp_save_keys(RnpFFI $ffi, string $format, string &$output, int $key_type): bool

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

Typ
bool
Beschreibung
Gibt 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);
Exportierte Bytes: 887

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);
Schlüssel als JSON gespeichert. Schlüssel erfolgreich wiederhergestellt.

// 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.