Start · Sprachen · PHP · Referenz · rnp_op_sign_detached

rnp_op_sign_detached

Funktion

Erstellt eine kryptografische Operation zur Erzeugung einer oder mehrerer abgetrennter Signaturen (<em>detached signatures</em>) über einen Eingabedatenstrom.

seit PHP 8.0.0 Kategorie: crypto

Signatur

rnp_op_sign_detached(RnpFFI $ffi, RnpInput $input, RnpOutput $output): RnpOpSign

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

Typ
RnpOpSign
Beschreibung
Gibt ein 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 erfolgreich erstellt.

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);
Signatur (Base64): iHQEABECADQWIQT.../[Base64-kodierte Signatur]

// 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_encrypt oder eine kombinierte Sign-&-Encrypt-Operation zu verwenden.
  • Stellen Sie sicher, dass der verwendete Hash-Algorithmus (z. B. SHA256 oder SHA512) aktuellen Sicherheitsanforderungen entspricht. Veraltete Algorithmen wie MD5 oder SHA1 sollten vermieden werden.
  • Die RNP-PHP-Erweiterung muss explizit installiert und aktiviert sein (PECL-Paket rnp). Prüfen Sie die Verfügbarkeit mit extension_loaded('rnp').