Cum să adăugați semnături de securitate PDF în Python
Aspose.PDF FOSS pentru Python include un detector de compromitere a semnăturii care inspectează un PDF deja semnat pentru un tipar specific de manipulare: octeți semnificativi adăugați după intervalul de octeți semnat al semnăturii, un risc unic pentru fișierele PDF actualizate incremental. Acest ghid adaugă această verificare într-un flux de lucru Python utilizând clasele SignaturesCompromiseDetector și CompromiseCheckResult. Crearea sau aplicarea de noi semnături digitale este o parte separată a bibliotecii și nu este acoperită aici. Biblioteca este instalată cu comanda de mai jos.
Ghid pas cu pas
Pasul 1: Instalați pachetul
Instalați pachetul 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 .Verificați instalarea importând SignaturesCompromiseDetector și afișând un mesaj de confirmare:
from aspose_pdf import SignaturesCompromiseDetector
print("aspose-pdf-foss-for-python is ready.")Pasul 2: Importă clasele necesare
from aspose_pdf import CompromiseCheckResult, SignaturesCompromiseDetectorPasul 3: Pregătește un obiect care expune o listă de semnături
SignaturesCompromiseDetector nu analizează un PDF în sine — constructorul său acceptă orice obiect care expune un atribut signatures: o listă de intrări de semnătură, fiecare conținând valid, byte_range și reference_data. PdfSignature — o clasă simplă, direct constructibilă — se potrivește acelei forme, astfel că este utilă pentru a vedea cum se comportă verificarea înainte de a o conecta la propriul tău obiect document:
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])Înlocuiește signed_document cu propriul tău obiect document odată ce acesta expune o listă signatures în aceeași formă — orice obiect cu acel atribut funcționează.
Pasul 4: Rulează verificarea de compromitere
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() parcurge fiecare semnătură din signed_document.signatures, căutând conținut nesemnat adăugat după intervalul de octeți semnat al fiecărei semnături. Un CompromiseCheckResult rezumă rezultatul: compromised și has_compromised_signatures raportează același boolean sub două denumiri, signatures_coverage raportează câte semnături au fost examinate, iar reasons enumeră o explicație lizibilă pentru fiecare problemă găsită.
Pasul 5: Gestionează un document fără semnături
O listă signatures goală sau absentă nu este o condiție de eroare — este raportată în același mod ca un document fără nimic de verificat:
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"]Transmiterea lui SignaturesCompromiseDetector(None) — valoarea implicită a constructorului — se comportă în același mod.
Probleme comune și remedii
compromised is False pentru un PDF pe care știi că a fost editat după semnare
SignaturesCompromiseDetector caută în mod specific octeți nesemnati adăugați după intervalul de octeți semnați al unei semnături — un tipar tipic al manipulării naive prin actualizare incrementală. Nu efectuează verificarea completă a semnăturii criptografice. Pentru asta, apelează validate() pe obiectul individual PdfSignature.
compromised and has_compromised_signatures par redundante
Au aceeași valoare: compromised este o proprietate calculată care returnează has_compromised_signatures. Folosește oricare dintre nume care se potrivește mai bine în codul tău.
Nu se ridică nicio excepție când documentul nu are signatures niciun atribut
SignaturesCompromiseDetector tratează un document fără atributul signatures, sau document=None, la fel ca un document nesemnat — check() returnează un rezultat cu has_compromised_signatures=False și reasons=["unsigned document"] în loc să ridice o eroare.
Un malformat PdfSignature nu este semnalat
check() omite orice semnătură al cărei byte_range nu este o listă de 4 elemente, sau al cărei reference_data nu este bytes/bytearray, în loc să ridice o eroare sau să o raporteze ca compromisă. O semnătură construită cu forma greșită este exclusă silențios din verificare, fără a fi semnalată.
Confunderea acestui detector cu crearea semnăturii
SignaturesCompromiseDetector și CompromiseCheckResult inspectează doar semnăturile care există deja pe un document — nu au nicio metodă de a crea, aplica sau încorpora o semnătură nouă.
Întrebări frecvente
Ce contează exact ca „compromis” aici?
Octeți semnificativi, non-spațiu, adăugați la PDF după intervalul de octeți semnat al unei semnături — cu două excepții pe care detectorul le ia deja în considerare: o semnătură sau marcă temporală ulterioară care acoperă acei octeți, și o actualizare incrementală care adaugă doar material de validare (cum ar fi un /DSS) fără a suprapune conținut nou, cum ar fi adnotări.
Acest lucru verifică valabilitatea criptografică a semnăturii în sine?
Nu. SignaturesCompromiseDetector verifică tiparele de manipulare în jurul intervalului de octeți semnat. Validitatea criptografică este o verificare separată, disponibilă prin PdfSignature.validate().
Ce îmi spune signatures_coverage?
Numărul de semnături pe care verificarea le-a examinat efectiv în documentul furnizat — util pentru a confirma că detectorul a văzut semnăturile pe care le așteptați înainte de a avea încredere într-un rezultat curat.
Pot verifica un document cu mai multe semnături simultan?
Da. check() parcurge fiecare intrare din signed_document.signatures și returnează un CompromiseCheckResult agregat care le acoperă pe toate.
Trebuie să construiesc eu obiecte PdfSignature în utilizarea normală?
Nu — construcția PdfSignature din Pasul 3 este pentru a explora comportamentul detectorului direct. Într-un flux de lucru real, transmiteți orice obiect produce deja codul dvs. de încărcare a documentului, atâta timp cât expune o listă signatures de intrări cu formă PdfSignature.