Signatur
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
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);
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);
// 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.
SHA1gilt als veraltet und unsicher — verwende mindestensSHA256oder besserSHA512. - Stelle sicher, dass der private Schlüssel vor der Verwendung mit
rnp_ffi_set_pass_providerkorrekt entsperrt wird; ein gesperrter Schlüssel führt zufalseals Rückgabewert. - Der FFI-Kontext sollte nach Verwendung stets mit
rnp_ffi_destroyfreigegeben 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_detachedzur Verfügung.