Wie man PDF-Sicherheits-Signaturen in Python hinzufügt
Aspose.PDF FOSS für Python enthält einen Erkennungsmechanismus für Signaturkompromittierungen, der ein bereits signiertes PDF auf ein bestimmtes Manipulationsmuster untersucht: sinnvolle Bytes, die nach dem signierten Byte-Bereich einer Signatur angehängt werden – ein Risiko, das nur bei inkrementell aktualisierten PDF-Dateien auftritt. Dieser Leitfaden fügt diese Prüfung in einen Python-Workflow mithilfe der Klassen SignaturesCompromiseDetector und CompromiseCheckResult ein. Das Erstellen oder Anwenden neuer digitaler Signaturen ist ein separater Teil der Bibliothek und wird hier nicht behandelt. Die Bibliothek wird mit dem untenstehenden Befehl installiert.
Schritt-für-Schritt-Anleitung
Schritt 1: Paket installieren
Installiere das Aspose.PDF FOSS-Paket:
git clone https://github.com/aspose-pdf-foss/Aspose-PDF-FOSS-for-Python.git
cd Aspose-PDF-FOSS-for-Python
pip install -e .Überprüfe die Installation, indem du SignaturesCompromiseDetector importierst und eine Bestätigungsnachricht ausgibst:
from aspose_pdf import SignaturesCompromiseDetector
print("aspose-pdf-foss-for-python is ready.")Schritt 2: Erforderliche Klassen importieren
from aspose_pdf import CompromiseCheckResult, SignaturesCompromiseDetectorSchritt 3: Ein Objekt vorbereiten, das eine Signaturliste bereitstellt
SignaturesCompromiseDetector analysiert kein PDF selbst — sein Konstruktor akzeptiert jedes Objekt, das ein signatures-Attribut bereitstellt: eine Liste von Signatur-Einträgen, von denen jeder valid, byte_range und reference_data enthält. PdfSignature — eine einfache, direkt instanziierbare Klasse — entspricht dieser Struktur, sodass sie nützlich ist, um zu sehen, wie die Prüfung funktioniert, bevor sie an Ihr eigenes Dokumentobjekt angebunden wird:
from types import SimpleNamespace
from aspose_pdf import PdfSignature
with open("signed.pdf", "rb") as handle:
pdf_bytes = handle.read()
signature = PdfSignature(
name="Signature1",
contents=b"...", # PKCS#7 signed-data blob from the signature dictionary
byte_range=[0, 1024, 1040, len(pdf_bytes) - 1040],
reference_data=pdf_bytes,
)
signed_document = SimpleNamespace(signatures=[signature])Ersetzen Sie signed_document durch Ihr eigenes Dokumentobjekt, sobald es eine signatures-Liste in derselben Form bereitstellt — jedes Objekt mit diesem Attribut funktioniert.
Schritt 4: Kompromissprüfung ausführen
from aspose_pdf import SignaturesCompromiseDetector
detector = SignaturesCompromiseDetector(signed_document)
result = detector.check()
print(result.compromised) # bool
print(result.has_compromised_signatures) # bool -- same value as compromised
print(result.signatures_coverage) # int -- number of signatures inspected
print(result.reasons) # list[str] -- human-readable findingscheck() durchläuft jede Signatur in signed_document.signatures und sucht nach nicht signiertem Inhalt, der nach dem signierten Byte-Bereich jeder Signatur angehängt ist. Ein CompromiseCheckResult fasst das Ergebnis zusammen: compromised und has_compromised_signatures geben denselben booleschen Wert unter zwei Namen zurück, signatures_coverage gibt an, wie viele Signaturen geprüft wurden, und reasons listet eine menschenlesbare Erklärung für jedes gefundene Problem auf.
Schritt 5: Umgang mit einem Dokument ohne Signaturen
Eine leere oder fehlende signatures-Liste ist kein Fehlerzustand — sie wird auf die gleiche Weise gemeldet wie ein Dokument, das nichts zu prüfen hat:
from types import SimpleNamespace
from aspose_pdf import SignaturesCompromiseDetector
unsigned_document = SimpleNamespace(signatures=[])
detector = SignaturesCompromiseDetector(unsigned_document)
result = detector.check()
print(result.compromised) # False
print(result.reasons) # ["unsigned document"]Das Übergeben von SignaturesCompromiseDetector(None) — der Standardwert des Konstruktors — verhält sich auf dieselbe Weise.
Häufige Probleme und Lösungen
compromised is False für ein PDF, von dem Sie wissen, dass es nach der Signatur bearbeitet wurde
SignaturesCompromiseDetector sucht speziell nach unsignierten Bytes, die nach dem signierten Byte-Bereich einer Signatur angehängt wurden — ein Muster, das für naive inkrementelle Update-Manipulation typisch ist. Es führt keine vollständige kryptografische Signaturverifizierung durch. Dafür rufen Sie validate() für das einzelne PdfSignature-Objekt auf.
compromised and has_compromised_signatures scheinen redundant zu sein
Sie haben denselben Wert: compromised ist eine berechnete Eigenschaft, die has_compromised_signatures zurückgibt. Verwenden Sie den Namen, der in Ihrem Code besser lesbar ist.
Es wird keine Ausnahme ausgelöst, wenn das Dokument kein signatures Attribut überhaupt
SignaturesCompromiseDetector behandelt ein Dokument ohne signatures-Attribut oder document=None genauso wie ein nicht unterschriebenes Dokument — check() liefert ein Ergebnis mit has_compromised_signatures=False und reasons=["unsigned document"] anstatt einen Fehler zu werfen.
Ein fehlerhaftes PdfSignature wird nicht markiert
check() überspringt jede Signatur, deren byte_range keine 4-Elemente-Liste ist, oder deren reference_data nicht bytes/bytearray ist, anstatt einen Fehler zu werfen oder sie als kompromittiert zu melden. Eine mit falscher Form erstellte Signatur wird stillschweigend von der Prüfung ausgeschlossen, nicht gekennzeichnet.
Verwechseln dieses Detektors mit der Signaturerstellung
SignaturesCompromiseDetector und CompromiseCheckResult prüfen nur Signaturen, die bereits auf einem Dokument vorhanden sind — sie besitzen keine Möglichkeit, eine neue Signatur zu erstellen, anzuwenden oder einzubetten.
Häufig gestellte Fragen
Was genau gilt hier als „kompromittiert“?
Bedeutungsvolle, nicht-whitespace-Bytes, die nach dem signierten Byte-Bereich einer Signatur an das PDF angehängt werden — mit zwei Ausnahmen, die der Detektor bereits berücksichtigt: eine spätere Signatur oder ein Zeitstempel, der diese Bytes selbst abdeckt, und ein inkrementelles Update, das nur Validierungsmaterial (wie ein /DSS) hinzufügt, ohne neue Inhalte wie Anmerkungen zu schichten.
Überprüft dies die kryptografische Gültigkeit der Signatur selbst?
Nein. SignaturesCompromiseDetector prüft auf Manipulationsmuster um den signierten Byte-Bereich. Die kryptografische Gültigkeit ist eine separate Prüfung, die über PdfSignature.validate() verfügbar ist.
Was sagt mir signatures_coverage?
Die Anzahl der Signaturen, die die Prüfung tatsächlich im übergebenen Dokument untersucht hat — nützlich, um zu bestätigen, dass der Detektor die erwarteten Signaturen gesehen hat, bevor man einem sauberen Ergebnis vertraut.
Kann ich ein Dokument mit mehreren Signaturen gleichzeitig prüfen?
Ja. check() iteriert über jeden Eintrag in signed_document.signatures und gibt ein aggregiertes CompromiseCheckResult zurück, das alle abdeckt.
Muss ich in der normalen Nutzung selbst PdfSignature-Objekte erstellen?
Nein — Die PdfSignature-Konstruktion in Schritt3 dient dazu, das Verhalten des Detektors direkt zu erforschen. In einem realen Workflow übergeben Sie einfach das Objekt, das Ihr Dokument-Ladecode bereits erzeugt, solange es eine signatures-Liste von PdfSignature-geformten Einträgen bereitstellt.