Signatur
Beschreibung
RnpFFI ist der zentrale Einstiegspunkt der PHP-rnp-Erweiterung und repräsentiert eine Instanz des RNP-Kontexts (Foreign Function Interface). Über dieses Objekt werden alle Operationen der RNP-Bibliothek gesteuert, einer OpenPGP-konformen C-Bibliothek gemäß RFC 4880.
Mit RnpFFI können OpenPGP-Schlüssel generiert, importiert, exportiert und verwaltet werden. Darüber hinaus unterstützt die Klasse das Verschlüsseln und Entschlüsseln von Daten sowie das Erstellen und Verifizieren kryptografischer Signaturen. Die Schlüsselverwaltung erfolgt über einen integrierten Schlüsselspeicher (Keyring), der im Arbeitsspeicher gehalten wird.
Typischerweise wird eine Instanz mit rnp_ffi_create() erzeugt und nach der Verwendung mit rnp_ffi_destroy() wieder freigegeben. Alternativ übernimmt PHP bei der Verwendung als Objekt die Lebenszyklusverwaltung automatisch. Die Klasse eignet sich besonders für Anwendungen, die sichere E-Mail-Kommunikation, Datei-Verschlüsselung oder Signaturprüfung benötigen.
Hinweis: Die Klasse ist nur verfügbar, wenn PHP mit der rnp-Erweiterung kompiliert wurde und die native librnp auf dem System installiert ist.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $pub_format Pflicht | string | Format des öffentlichen Schlüsselspeichers, z. B. "GPG", "KBX" oder "G10". |
|
| $sec_format Pflicht | string | Format des privaten Schlüsselspeichers, z. B. "GPG", "KBX" oder "G10". |
Beispiele
RnpFFI-Instanz erstellen und ein RSA-Schlüsselpaar generieren
<?php
// RNP-FFI-Kontext erzeugen (GPG-Format für öffentliche und private Schlüssel)
$ffi = new RnpFFI('GPG', 'GPG');
// JSON-Parameter für die Schlüsselgenerierung
$params = json_encode([
'primary' => [
'type' => 'RSA',
'length' => 4096,
'userid' => 'Max Mustermann <max@example.com>',
'expiration' => 0,
'usage' => ['sign'],
'protection' => [
'cipher' => 'AES256',
'hash' => 'SHA256',
],
],
'sub' => [
'type' => 'RSA',
'length' => 4096,
'expiration' => 0,
'usage' => ['encrypt'],
'protection' => [
'cipher' => 'AES256',
'hash' => 'SHA256',
],
],
]);
// Schlüsselpaar generieren
if ($ffi->generate_key($params)) {
echo "Schlüsselpaar erfolgreich generiert.\n";
} else {
echo "Fehler bei der Schlüsselgenerierung.\n";
}
Daten verschlüsseln und anschließend entschlüsseln
<?php
$ffi = new RnpFFI('GPG', 'GPG');
// Öffentlichen Schlüssel aus Datei importieren
$pubKeyData = file_get_contents('/pfad/zum/oeffentlichen_schluessel.asc');
$ffi->import_keys($pubKeyData, true, false);
// Klardaten verschlüsseln
$plaintext = 'Geheime Nachricht';
$recipients = ['max@example.com'];
$encrypted = $ffi->encrypt($plaintext, $recipients);
if ($encrypted !== false) {
echo "Verschlüsselt (Länge): " . strlen($encrypted) . " Bytes\n";
} else {
echo "Verschlüsselung fehlgeschlagen.\n";
}
// Privaten Schlüssel importieren und Passwort-Callback setzen
$secKeyData = file_get_contents('/pfad/zum/privaten_schluessel.asc');
$ffi->import_keys($secKeyData, false, true);
$ffi->set_pass_provider(function(RnpKey $key, string $pgp_context, string &$password): bool {
$password = 'geheimes_passwort';
return true;
});
// Entschlüsseln
$decrypted = $ffi->decrypt($encrypted);
echo "Entschlüsselt: " . $decrypted . "\n";
// Wichtig · Fallstricke
Sicherheitshinweise:
- Private Schlüssel und Passphrasen niemals im Klartext im Quellcode speichern. Nutze Umgebungsvariablen oder sichere Secrets-Manager.
- Der Passwort-Callback (
set_pass_provider) wird bei jeder Schlüsselentschlüsselung aufgerufen — stelle sicher, dass die Passphrase nicht geloggt wird. - Verwende stets aktuelle Schlüssellängen (RSA ≥ 3072 Bit, ECC-Kurven wie
Ed25519oderNIST P-256). - Nach der Verwendung sollte der FFI-Kontext freigegeben werden, um sensible Schlüsselmaterialien aus dem Speicher zu entfernen.
- Die Klasse ist nicht threadsicher — teile eine
RnpFFI-Instanz nicht zwischen mehreren Threads oder Worker-Prozessen.