Hogyan adjon hozzá PDF biztonsági aláírásokat a Python-ban

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, SignaturesCompromiseDetector

3.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 findings

check() 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.

Lásd még:

 Magyar