Start · Sprachen · PHP · Referenz · rnp_op_sign

rnp_op_sign

Funktion

Signiert Binärdaten kryptografisch und liefert das Ergebnis mit eingebetteter Signatur als String zurück.

seit PHP 8.1.0 Kategorie: crypto

Signatur

rnp_op_sign(RnpFFI $ffi, string $input, array $keys, array $options = []): string|false

Beschreibung

rnp_op_sign ist Teil der PHP-RNP-Erweiterung (OpenPGP via librnp) und ermöglicht es, beliebige Binärdaten mit einem oder mehreren privaten OpenPGP-Schlüsseln zu signieren. Die Signatur wird direkt in die Ausgabedaten eingebettet (inline signed message), sodass Empfänger Integrität und Authentizität der Nachricht verifizieren können.

Typische Einsatzgebiete sind das Signieren von Software-Paketen, Dokumenten oder Nachrichten, bei denen der Empfänger mithilfe des zugehörigen öffentlichen Schlüssels die Echtheit prüfen kann. Im Gegensatz zu einer reinen Detach-Signatur enthält die Ausgabe sowohl die ursprünglichen Daten als auch die Signatur in einem zusammenhängenden Datenblock.

Über das $options-Array lassen sich Parameter wie Kompression, Ausgabeformat (binär oder ASCII-Armor) und Hash-Algorithmus steuern. Werden mehrere Schlüssel übergeben, enthält das Ergebnis entsprechend mehrere Signaturen.

Wichtig: Die verwendeten privaten Schlüssel müssen im übergebenen RnpFFI-Kontext geladen und ggf. entsperrt sein; andernfalls schlägt die Funktion fehl und gibt false zurück.

Parameter

Name Typ Default Beschreibung
$ffi Pflicht RnpFFI Eine gültige RNP-FFI-Instanz, die den Schlüsselspeicher mit den zu verwendenden privaten Schlüsseln enthält.
$input Pflicht string Die zu signierenden Rohdaten (Binär-String). Es wird keine automatische Kodierung oder Umwandlung vorgenommen.
$keys Pflicht array Array mit einem oder mehreren Schlüssel-Identifikatoren (z. B. Fingerabdrücke oder Key-IDs als Strings), die im FFI-Kontext als Signier-Schlüssel genutzt werden sollen.
$options array [] Optionales assoziatives Array zur Steuerung des Signiervorgangs. Mögliche Schlüssel: armor (bool, ASCII-Armor-Ausgabe), hash (string, z. B. 'SHA256'), compression_alg (string), compression_level (int 0–9).

Rückgabewert

Typ
string|false
Beschreibung
Gibt den signierten Datenblock als String zurück. Bei einem Fehler (z. B. ungültiger Schlüssel, gesperrter Schlüssel, leerer Input) wird false zurückgegeben.

Beispiele

Einfaches Signieren einer Nachricht mit ASCII-Armor

<?php
// RNP-FFI-Kontext erstellen
$ffi = rnp_ffi_create('GPG', 'GPG');

// Privaten Schlüssel aus Datei laden
$keyData = file_get_contents('/pfad/zum/privaten_schluessel.asc');
rnp_load_keys($ffi, 'GPG', $keyData, RNP_LOAD_SAVE_SECRET_KEYS);

// Schlüssel entsperren (Passwort-Callback setzen)
rnp_ffi_set_pass_provider($ffi, function($ffi, $ctx, $key, $pgpCtx, &$password) {
    $password = 'mein_geheimes_passwort';
    return true;
});

// Fingerabdruck des Signierschlüssels ermitteln
$key = rnp_locate_key($ffi, 'userid', 'alice@example.com');
$fingerprint = rnp_key_get_fprint($key);

// Daten signieren
$message = 'Wichtige Nachricht, deren Echtheit geprüft werden soll.';
$signed = rnp_op_sign($ffi, $message, [$fingerprint], [
    'armor' => true,
    'hash'  => 'SHA256',
]);

if ($signed === false) {
    echo 'Signierung fehlgeschlagen.';
} else {
    echo $signed;
}

rnp_ffi_destroy($ffi);
-----BEGIN PGP MESSAGE----- ...(ASCII-Armor-Ausgabe mit eingebetteter Signatur)... -----END PGP MESSAGE-----

Binäre Signatur (kein Armor) mit zwei Schlüsseln

<?php
$ffi = rnp_ffi_create('GPG', 'GPG');

// Schlüsselbund laden
rnp_load_keys($ffi, 'GPG', file_get_contents('/pfad/keyring.pgp'),
    RNP_LOAD_SAVE_SECRET_KEYS);

rnp_ffi_set_pass_provider($ffi, function($ffi, $ctx, $key, $pgpCtx, &$password) {
    $password = 'passwort123';
    return true;
});

$key1 = rnp_locate_key($ffi, 'fingerprint', 'AABBCCDDEEFF00112233445566778899AABBCCDD');
$key2 = rnp_locate_key($ffi, 'fingerprint', '112233445566778899AABBCCDDEEFF0011223344');

$data = file_get_contents('/pfad/zur/datei.bin');

$signed = rnp_op_sign($ffi, $data, [
    rnp_key_get_fprint($key1),
    rnp_key_get_fprint($key2),
], [
    'armor'             => false,
    'hash'              => 'SHA512',
    'compression_alg'   => 'ZIP',
    'compression_level' => 6,
]);

if ($signed !== false) {
    file_put_contents('/pfad/zur/datei.pgp', $signed);
    echo 'Datei erfolgreich mit zwei Schlüsseln signiert.';
}

rnp_ffi_destroy($ffi);
Datei erfolgreich mit zwei Schlüsseln signiert.

// Wichtig · Fallstricke

Sicherheitshinweise:

  • Passwörter zum Entsperren privater Schlüssel sollten niemals hartcodiert im Quellcode stehen. Nutze sichere Konfigurationsmechanismen oder Umgebungsvariablen.
  • Die Stärke der Signatur hängt maßgeblich vom gewählten Hash-Algorithmus ab. SHA1 gilt als veraltet und unsicher — verwende mindestens SHA256 oder besser SHA512.
  • Stelle sicher, dass der private Schlüssel vor der Verwendung mit rnp_ffi_set_pass_provider korrekt entsperrt wird; ein gesperrter Schlüssel führt zu false als Rückgabewert.
  • Der FFI-Kontext sollte nach Verwendung stets mit rnp_ffi_destroy freigegeben werden, um Speicherlecks zu vermeiden.
  • Diese Funktion erzeugt eine signed message (Inline-Signatur), nicht eine separate Detach-Signatur. Für Detach-Signaturen steht rnp_op_sign_detached zur Verfügung.