Hogyan adjon hozzá PDF biztonsági aláírásokat a Python-ban
Aspose.PDF FOSS for Python tartalmaz egy aláírás-kompromisszió-detektort, amely egy már aláírt PDF-et vizsgál egy adott manipulációs minta után: jelentős bájtok hozzáfűzése az aláírás aláírt bájt-tartománya után, ami a fokozatosan frissített PDF-fájlokra jellemző kockázat. Ez az útmutató hozzáadja ezt az ellenőrzést egy Python munkafolyamathoz a SignaturesCompromiseDetector és CompromiseCheckResult osztályok használatával. Új digitális aláírások létrehozása vagy alkalmazása a könyvtár külön részét képezi, és itt nem kerül bemutatásra. A könyvtár a lenti parancs segítségével telepíthető.
Lépésről-lépésre útmutató
1. lépés: A csomag telepítése
Telepítsd a Aspose.PDF FOSS csomagot:
git clone https://github.com/aspose-pdf-foss/Aspose-PDF-FOSS-for-Python.git
cd Aspose-PDF-FOSS-for-Python
pip install -e .Ellenőrizd a telepítést a SignaturesCompromiseDetector importálásával és egy megerősítő üzenet kiíratásával:
from aspose_pdf import SignaturesCompromiseDetector
print("aspose-pdf-foss-for-python is ready.")2.lépés: A szükséges osztályok importálása
from aspose_pdf import CompromiseCheckResult, SignaturesCompromiseDetector3.lépés: Készíts egy olyan objektumot, amely aláírások listáját teszi elérhetővé
SignaturesCompromiseDetector nem elemzi a PDF-et közvetlenül — konstruktorja bármilyen olyan objektumot elfogad, amely rendelkezik egy signatures attribútummal: egy listával az aláírási bejegyzésekről, amelyek mindegyike valid, byte_range és reference_data adatot tartalmaz. PdfSignature — egy egyszerű, közvetlenül példányosítható osztály — megfelel ennek a szerkezetnek, ezért hasznos annak megtekintésére, hogyan viselkedik az ellenőrzés, mielőtt a saját dokumentumobjektumodhoz csatolnád:
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])Cseréld le a signed_document-t a saját dokumentumobjektumodra, amint az rendelkezik egy signatures listával azonos szerkezetben — bármely objektum, amelynek van ez az attribútuma, működik.
4.lépés: Futtasd a kompromisszum-ellenőrzést
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() végigjár minden aláírást a signed_document.signatures-ben, és olyan aláíratlan tartalmat keres, amely az egyes aláírások aláírt bájt-tartománya után lett hozzáfűzve. A CompromiseCheckResult összegzi az eredményt: a compromised és a has_compromised_signatures ugyanazt a logikai értéket két néven jelenti, a signatures_coverage jelzi, hány aláírást vizsgáltak meg, a reasons pedig ember számára olvasható magyarázatot ad minden talált hibához.
5.lépés: Kezeld a dokumentumot, amelynek nincsenek aláírásai
Egy üres vagy hiányzó signatures lista nem hibakörülmény — ugyanúgy jelentésre kerül, mint egy olyan dokumentum, amelyben nincs semmi ellenőrizni:
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"]A SignaturesCompromiseDetector(None) átadása – a konstruktor alapértelmezése – ugyanúgy viselkedik.
Általános problémák és megoldások
compromised is False egy PDF-hez, amelyről tudod, hogy az aláírás után szerkesztették
SignaturesCompromiseDetector kifejezetten az aláírás aláírt bájt tartománya után hozzáadott aláíratlan bájtokat keres — egy minta, amely a naiv inkrementális frissítéses manipulációra jellemző. Nem végez teljes kriptográfiai aláírás-ellenőrzést. Ehhez hívd meg a validate() az egyes PdfSignature objektumon.
compromised and has_compromised_signatures úgy tűnik redundáns
Ugyanaz az érték: compromised egy számított tulajdonság, amely visszaadja a has_compromised_signatures értékét. Használd azt a nevet, amelyik jobban olvasható a kódban.
Nem dobódik kivétel, ha a dokumentumnak nincs signatures attribútuma egyáltalán
SignaturesCompromiseDetector egy dokumentumot, amelynek nincs signatures attribútuma, vagy document=None, ugyanúgy kezeli, mint egy aláíratlan dokumentumot — check() eredményt ad has_compromised_signatures=False és reasons=["unsigned document"] értékekkel ahelyett, hogy hibát dobna.
Egy hibás PdfSignature nem kerül megjelölésre
check() kihagy minden aláírást, amelynek byte_range nem 4 elemből álló lista, vagy amelynek reference_data nem bytes/bytearray, ahelyett, hogy hibát dobna vagy kompromittáltnak jelentené. A hibás szerkezetű aláírás csendben kizárásra kerül az ellenőrzésből, nem jelzi.
Ennek a detektornak és az aláíráskészítésnek a összekeverése
SignaturesCompromiseDetector és CompromiseCheckResult csak a dokumentumon már meglévő aláírásokat vizsgálják — nincs módszerük új aláírás létrehozására, alkalmazására vagy beágyazására.
Gyakran Ismételt Kérdések
Mi számít pontosan “kompromittáltnak” itt?
Jelentős, nem üres karakterekből álló bájtok, amelyeket a PDF-hez adnak a aláírás aláírt bájt tartománya után — a detektor már két kivételt figyelembe vesz: egy későbbi aláírás vagy időbélyeg, amely maga is lefedi ezeket a bájtokat, és egy inkrementális frissítés, amely csak ellenőrző anyagot (például egy /DSS) ad hozzá anélkül, hogy új tartalmat, például megjegyzéseket helyezne el.
Ellenőrzi ez a digitális aláírás kriptográfiai érvényességét?
Nem. SignaturesCompromiseDetector a módosítási mintákat ellenőrzi az aláírt bájt tartomány körül. A kriptográfiai érvényesség egy külön ellenőrzés, amely PdfSignature.validate() keresztül érhető el.
Mit mond nekem a signatures_coverage?
A bemeneti dokumentumban a ellenőrzés által ténylegesen vizsgált aláírások száma – hasznos annak megerősítésére, hogy a detektor látta-e a várt aláírásokat, mielőtt egy tiszta eredményben megbízna.
Ellenőrizhetek egy dokumentumot egyszerre több aláírással?
Igen. check() végig iterál a signed_document.signatures minden bejegyzésén, és egy összesített CompromiseCheckResult-t ad vissza, amely mindet lefedi.
Szükséges-e normál használatban saját magamnak létrehozni a PdfSignature objektumokat?
Nem — a 3. lépés PdfSignature konstrukciója a detektor viselkedésének közvetlen feltárására szolgál. Egy valódi munkafolyamatban add át azt az objektumot, amelyet a dokumentumbetöltő kódod már előállít, amennyiben az tartalmaz egy signatures listát PdfSignature-alakú bejegyzésekkel.