Πώς να προσθέσετε υπογραφές ασφαλείας PDF στο Python

Πώς να προσθέσετε υπογραφές ασφαλείας PDF στο Python

Aspose.PDF FOSS για Python περιλαμβάνει έναν ανιχνευτή παραβίασης υπογραφής που εξετάζει ένα ήδη υπογεγραμμένο PDF για ένα συγκεκριμένο μοτίβο παραποίησης: σημαντικά bytes που προσαρτώνται μετά το εύρος byte που έχει υπογραφεί, κίνδυνο μοναδικός για αρχεία PDF που ενημερώνονται σταδιακά. Αυτός ο οδηγός προσθέτει αυτόν τον έλεγχο σε μια ροή εργασίας Python χρησιμοποιώντας τις κλάσεις SignaturesCompromiseDetector και CompromiseCheckResult. Η δημιουργία ή η εφαρμογή νέων ψηφιακών υπογραφών είναι ξεχωριστό μέρος της βιβλιοθήκης και δεν καλύπτεται εδώ. Η βιβλιοθήκη εγκαθίσταται με την παρακάτω εντολή.

Οδηγός βήμα προς βήμα

Βήμα 1: Εγκατάσταση του πακέτου

Εγκαταστήστε το πακέτο Aspose.PDF FOSS:

git clone https://github.com/aspose-pdf-foss/Aspose-PDF-FOSS-for-Python.git
cd Aspose-PDF-FOSS-for-Python
pip install -e .

Επαληθεύστε την εγκατάσταση εισάγοντας το SignaturesCompromiseDetector και εκτυπώνοντας ένα μήνυμα επιβεβαίωσης:

from aspose_pdf import SignaturesCompromiseDetector
print("aspose-pdf-foss-for-python is ready.")

Βήμα 2: Εισαγωγή Απαιτούμενων Κλάσεων

from aspose_pdf import CompromiseCheckResult, SignaturesCompromiseDetector

Βήμα 3: Προετοιμασία ενός Αντικειμένου που Εκθέτει μια Λίστα Υπογραφών

SignaturesCompromiseDetector δεν αναλύει το PDF από μόνο του — ο κατασκευαστής του δέχεται οποιοδήποτε αντικείμενο που εκθέτει ένα χαρακτηριστικό signatures: μια λίστα εγγραφών υπογραφής, η καθεμία από τις οποίες περιέχει valid, byte_range και reference_data. PdfSignature — μια απλή, άμεσα κατασκευάσιμη κλάση — ταιριάζει σε αυτή τη δομή, έτσι είναι χρήσιμη για να δείτε πώς συμπεριφέρεται ο έλεγχος πριν το συνδέσετε με το δικό σας αντικείμενο εγγράφου:

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])

Αντικαταστήστε το signed_document με το δικό σας αντικείμενο εγγράφου μόλις εκθέτει μια λίστα signatures στην ίδια μορφή — οποιοδήποτε αντικείμενο με αυτό το χαρακτηριστικό λειτουργεί.


Βήμα 4: Εκτέλεση του Ελέγχου Συμβιβασμού

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 findings

check() εξετάζει κάθε υπογραφή στο signed_document.signatures, αναζητώντας μη υπογεγραμμένο περιεχόμενο που προστέθηκε μετά το υπογεγραμμένο εύρος byte της κάθε υπογραφής. Ένα CompromiseCheckResult συνοψίζει το αποτέλεσμα: compromised και has_compromised_signatures αναφέρουν το ίδιο boolean υπό δύο ονόματα, signatures_coverage αναφέρει πόσες υπογραφές εξετάστηκαν, και reasons παραθέτει μια ανθρώπινα ευανάγνωστη εξήγηση για κάθε εντοπισμένο πρόβλημα.


Βήμα 5: Διαχείριση Εγγράφου Χωρίς Υπογραφές

Μια κενή ή ελλιπής λίστα signatures δεν αποτελεί κατάσταση σφάλματος — αναφέρεται με τον ίδιο τρόπο όπως ένα έγγραφο χωρίς τίποτα προς έλεγχο:

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"]

Η μεταβίβαση του SignaturesCompromiseDetector(None) — η προεπιλογή του κατασκευαστή — συμπεριφέρεται με τον ίδιο τρόπο.

Συνηθισμένα Προβλήματα και Διορθώσεις

compromised is False για ένα PDF που ξέρετε ότι επεξεργάστηκε μετά την υπογραφή

SignaturesCompromiseDetector ψάχνει συγκεκριμένα για μη υπογεγραμμένα byte που προσαρτώνται μετά το εύρος υπογεγραμμένων byte μιας υπογραφής — ένα μοτίβο τυπικό για αφελή παραποίηση με σταδιακές ενημερώσεις. Δεν εκτελεί πλήρη κρυπτογραφική επαλήθευση υπογραφής. Για αυτό, καλέστε το validate() στο μεμονωμένο αντικείμενο PdfSignature.

compromised and has_compromised_signatures φαίνονται περιττά

Αποτελούν την ίδια τιμή: το compromised είναι μια υπολογιζόμενη ιδιότητα που επιστρέφει το has_compromised_signatures. Χρησιμοποιήστε όποιο όνομα φαίνεται πιο σαφές στον κώδικά σας.

Δεν εγείρεται εξαίρεση όταν το έγγραφο δεν έχει signatures καθόλου χαρακτηριστικό

SignaturesCompromiseDetector αντιμετωπίζει ένα έγγραφο χωρίς το χαρακτηριστικό signatures, ή document=None, το ίδιο όπως ένα μη υπογεγραμμένο έγγραφο — το check() επιστρέφει ένα αποτέλεσμα με has_compromised_signatures=False και reasons=["unsigned document"] αντί να προκαλεί σφάλμα.

Ένα κακοδιαμορφωμένο PdfSignature δεν επισημαίνεται

check() παραλείπει οποιαδήποτε υπογραφή της οποίας το byte_range δεν είναι λίστα τεσσάρων στοιχείων, ή του οποίου το reference_data δεν είναι bytes/bytearray, αντί να προκαλεί σφάλμα ή να την αναφέρει ως παραβιασμένη. Μια υπογραφή που δημιουργείται με λάθος μορφή εξαιρείται σιωπηλά από τον έλεγχο, χωρίς να επισημαίνεται.

Συγχυση αυτού του ανιχνευτή με τη δημιουργία υπογραφής

SignaturesCompromiseDetector και CompromiseCheckResult ελέγχουν μόνο υπογραφές που ήδη υπάρχουν σε ένα έγγραφο — δεν διαθέτουν μέθοδο για δημιουργία, εφαρμογή ή ενσωμάτωση νέας υπογραφής.

Συχνές Ερωτήσεις

Τι ακριβώς θεωρείται “παραβιασμένο” εδώ;

Σημαντικά, μη κενά bytes που προσαρτώνται στο PDF μετά την περιοχή bytes που υπογράφηκε από μια υπογραφή — με δύο εξαιρέσεις που ήδη λαμβάνει υπόψη ο ανιχνευτής: μια μεταγενέστερη υπογραφή ή χρονική σήμανση που καλύπτει αυτά τα bytes, και μια σταδιακή ενημέρωση που προσθέτει μόνο υλικό επαλήθευσης (όπως ένα /DSS) χωρίς να προσθέτει νέο περιεχόμενο όπως σημειώσεις.

Επιβεβαιώνει αυτό την κρυπτογραφική εγκυρότητα της υπογραφής καθαυτής;

Όχι. Το SignaturesCompromiseDetector ελέγχει για πρότυπα παραποίησης γύρω από την υπογεγραμμένη περιοχή byte. Η κρυπτογραφική εγκυρότητα είναι ένας ξεχωριστός έλεγχος, διαθέσιμος μέσω του PdfSignature.validate().

Τι μου λέει το signatures_coverage;

Ο αριθμός των υπογραφών που ο έλεγχος πραγματικά εξέτασε στο παρεχόμενο έγγραφο — χρήσιμο για την επιβεβαίωση ότι ο ανιχνευτής είδε τις υπογραφές που περιμένατε πριν εμπιστευτείτε ένα καθαρό αποτέλεσμα.

Μπορώ να ελέγξω ένα έγγραφο με πολλαπλές υπογραφές ταυτόχρονα;

Ναι. Το check() επαναλαμβάνει κάθε καταχώρηση στο signed_document.signatures και επιστρέφει ένα ενιαίο CompromiseCheckResult που καλύπτει όλες τις υπογραφές.

Πρέπει να δημιουργήσω εγώ τα αντικείμενα PdfSignature στην κανονική χρήση;

Όχι — Η δημιουργία του PdfSignature στο Βήμα 3 προορίζεται για άμεση διερεύνηση της συμπεριφοράς του ανιχνευτή. Σε μια πραγματική ροή εργασίας, περάστε όποιο αντικείμενο παράγει ήδη ο κώδικας φόρτωσης εγγράφων, αρκεί να εκθέτει μια λίστα signatures από καταχωρήσεις σχήματος PdfSignature.

Δείτε επίσης

 Ελληνικά