Signatur
Beschreibung
rnp_op_sign_detached ist Teil der RNP-Erweiterung (OpenPGP-Implementierung) für PHP und erzeugt ein RnpOpSign-Operationsobjekt, das für die Erstellung sogenannter abgetrennter Signaturen (detached signatures) verwendet wird. Im Gegensatz zu eingebetteten Signaturen verbleiben die Originaldaten unverändert – die Signatur wird separat gespeichert, typischerweise in einer .sig- oder .asc-Datei.
Dieser Ansatz ist besonders nützlich, wenn die zu signierende Datei unverändert weitergegeben werden soll, der Empfänger aber dennoch die Authentizität und Integrität prüfen kann. Typische Anwendungsfälle sind Software-Downloads, E-Mail-Anhänge oder Dokumentenverteilung, bei denen Inhalt und Signatur getrennt übertragen werden.
Nach dem Erzeugen der Operation können über das zurückgegebene RnpOpSign-Objekt weitere Einstellungen vorgenommen werden, z. B. das Hinzufügen von Signaturschlüsseln via rnp_op_sign_add_signature, das Setzen des Hash-Algorithmus oder von Zeitstempeln. Erst durch den Aufruf von rnp_op_sign_execute wird die eigentliche Signatur erzeugt.
Die Funktion setzt voraus, dass sowohl $input als auch $output gültige RNP-Handle-Objekte sind, die zuvor mit den entsprechenden rnp_input_*- bzw. rnp_output_*-Funktionen erstellt wurden.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $ffi Pflicht | RnpFFI | Das RNP-FFI-Handle, das die kryptografische Umgebung (Schlüsselbunde etc.) repräsentiert. Wird mit rnp_ffi_create erstellt. |
|
| $input Pflicht | RnpInput | Ein RNP-Eingabe-Handle, das auf die zu signierende Datei oder den Datenstrom zeigt. Erstellt z. B. mit rnp_input_from_path oder rnp_input_from_memory. |
|
| $output Pflicht | RnpOutput | Ein RNP-Ausgabe-Handle, in das die abgetrennte Signatur geschrieben wird. Erstellt z. B. mit rnp_output_to_path oder rnp_output_to_memory. |
Rückgabewert
RnpOpSign-Operationsobjekt zurück, über das weitere Signatureinstellungen vorgenommen und die Operation schließlich mit rnp_op_sign_execute ausgeführt werden kann. Im Fehlerfall wird eine Ausnahme ausgelöst oder false zurückgegeben.Beispiele
Abgetrennte Signatur einer Datei erstellen
<?php
// FFI-Kontext erstellen (Public+Secret Keyrings)
$ffi = rnp_ffi_create('GPG', 'GPG');
// Schlüsselbund aus Datei laden
$keyInput = rnp_input_from_path('/pfad/zum/secring.gpg');
rnp_load_keys($ffi, 'GPG', $keyInput, RNP_LOAD_SAVE_SECRET_KEYS);
rnp_input_destroy($keyInput);
// Passphrase-Callback setzen, um den privaten Schlüssel zu entsperren
rnp_ffi_set_pass_provider($ffi, function($ffi, $ctx, $key, $pgpCtx, &$passphrase) {
$passphrase = 'mein-geheimes-passwort';
return true;
});
// Eingabe (zu signierende Datei) und Ausgabe (Signaturdatei) vorbereiten
$input = rnp_input_from_path('/pfad/zur/datei.txt');
$output = rnp_output_to_path('/pfad/zur/datei.txt.sig');
// Signierungsoperation (detached) erstellen
$signOp = rnp_op_sign_detached($ffi, $input, $output);
// Signierschlüssel suchen und hinzufügen
$key = rnp_locate_key($ffi, 'userid', 'meinnutzer@example.com');
rnp_op_sign_add_signature($signOp, $key);
// Hash-Algorithmus setzen (optional)
rnp_op_sign_set_hash($signOp, 'SHA256');
// Signatur erzeugen
rnp_op_sign_execute($signOp);
// Ressourcen freigeben
rnp_op_sign_destroy($signOp);
rnp_input_destroy($input);
rnp_output_destroy($output);
rnp_ffi_destroy($ffi);
echo "Abgetrennte Signatur erfolgreich erstellt.\n";
Abgetrennte Signatur im Speicher erzeugen und als Base64 ausgeben
<?php
$ffi = rnp_ffi_create('GPG', 'GPG');
$keyInput = rnp_input_from_path('/pfad/zum/secring.gpg');
rnp_load_keys($ffi, 'GPG', $keyInput, RNP_LOAD_SAVE_SECRET_KEYS);
rnp_input_destroy($keyInput);
rnp_ffi_set_pass_provider($ffi, function($ffi, $ctx, $key, $pgpCtx, &$passphrase) {
$passphrase = 'mein-geheimes-passwort';
return true;
});
$daten = 'Dies ist der zu signierende Text.';
$input = rnp_input_from_memory($daten);
$output = rnp_output_to_memory();
$signOp = rnp_op_sign_detached($ffi, $input, $output);
$key = rnp_locate_key($ffi, 'userid', 'meinnutzer@example.com');
rnp_op_sign_add_signature($signOp, $key);
rnp_op_sign_set_armor($signOp, true); // ASCII-Armor aktivieren
rnp_op_sign_execute($signOp);
$sigBytes = rnp_output_memory_get_buf($output, false);
echo "Signatur (Base64):\n" . base64_encode($sigBytes) . "\n";
rnp_op_sign_destroy($signOp);
rnp_input_destroy($input);
rnp_output_destroy($output);
rnp_ffi_destroy($ffi);
// Wichtig · Fallstricke
Sicherheitshinweise:
- Der private Schlüssel muss durch einen sicheren Passphrase-Callback entsperrt werden. Vermeiden Sie es, Passphrasen direkt im Quellcode zu hinterlegen – verwenden Sie stattdessen Umgebungsvariablen oder einen sicheren Secrets-Manager.
- Abgetrennte Signaturen schützen nur die Integrität und Authentizität der Daten – nicht deren Vertraulichkeit. Für Verschlüsselung ist
rnp_op_encryptoder eine kombinierte Sign-&-Encrypt-Operation zu verwenden. - Stellen Sie sicher, dass der verwendete Hash-Algorithmus (z. B.
SHA256oderSHA512) aktuellen Sicherheitsanforderungen entspricht. Veraltete Algorithmen wieMD5oderSHA1sollten vermieden werden. - Die RNP-PHP-Erweiterung muss explizit installiert und aktiviert sein (PECL-Paket
rnp). Prüfen Sie die Verfügbarkeit mitextension_loaded('rnp').