Jak přidat PDF bezpečnostní podpisy v Python

Jak přidat PDF bezpečnostní podpisy v Python

Aspose.PDF FOSS pro Python zahrnuje detektor kompromitace podpisu, který kontroluje již podepsaný PDF soubor na specifický vzor manipulace: smysluplné bajty připojené po rozsahu podepsaných bajtů podpisu, což je riziko unikátní pro inkrementálně aktualizované PDF soubory. Tento průvodce přidává tuto kontrolu do pracovního postupu Python pomocí tříd SignaturesCompromiseDetector a CompromiseCheckResult. Vytváření nebo aplikace nových digitálních podpisů je samostatná část knihovny a není zde pokryta. Knihovna se instaluje pomocí níže uvedeného příkazu.

Průvodce krok za krokem

Krok 1: Nainstalujte balíček

Nainstalujte FOSS balíček Aspose.PDF:

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

Ověřte instalaci importováním SignaturesCompromiseDetector a vytištěním potvrzovací zprávy:

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

Krok 2: Naimportujte požadované třídy

from aspose_pdf import CompromiseCheckResult, SignaturesCompromiseDetector

Krok 3: Připravte objekt, který vystavuje seznam podpisů

SignaturesCompromiseDetector neparsuje PDF sám — jeho konstruktor přijímá libovolný objekt, který vystavuje atribut signatures: seznam položek podpisů, z nichž každá obsahuje valid, byte_range a reference_data. PdfSignature — jednoduchá, přímo konstruovatelná třída — odpovídá této struktuře, takže je užitečná pro zjištění, jak kontrola funguje, než ji připojíte k vlastnímu objektu dokumentu:

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

Vyměňte signed_document za svůj vlastní objekt dokumentu, jakmile vystavuje seznam signatures ve stejném tvaru — funguje jakýkoli objekt s tímto atributem.


Krok 4: Spusťte kontrolu kompromitace

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() prochází každý podpis v signed_document.signatures a hledá nepodepsaný obsah připojený po rozsahu podepsaných bajtů každého podpisu. CompromiseCheckResult shrnuje výsledek: compromised a has_compromised_signatures uvádějí stejnou pravdivostní hodnotu pod dvěma názvy, signatures_coverage uvádí, kolik podpisů bylo zkontrolováno, a reasons vypisuje čitelné vysvětlení pro každý nalezený problém.


Krok 5: Zpracujte dokument bez podpisů

Prázdný nebo chybějící seznam signatures není chybovým stavem — je hlášen stejným způsobem jako dokument, ve kterém není co kontrolovat:

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

Předání SignaturesCompromiseDetector(None) — výchozí hodnoty konstruktoru — se chová stejným způsobem.

Běžné problémy a opravy

compromised is False pro PDF, o kterém víte, že byl po podepsání upraven

SignaturesCompromiseDetector konkrétně hledá nepodepsané bajty připojené za rozsahem podepsaných bajtů podpisu — vzor typický pro naivní manipulaci s inkrementálními aktualizacemi. Neprovádí úplné kryptografické ověření podpisu. K tomu zavolejte validate() na jednotlivý objekt PdfSignature.

compromised and has_compromised_signatures se zdá nadbytečné

Jedná se o stejnou hodnotu: compromised je vypočítaná vlastnost, která vrací has_compromised_signatures. Použijte ten název, který ve vašem kódu zní lépe.

Nevývolá se žádná výjimka, když dokument nemá signatures atribut vůbec

SignaturesCompromiseDetector zachází s dokumentem, který nemá atribut signatures nebo document=None, stejně jako s nepodepsaným dokumentem — check() vrací výsledek s has_compromised_signatures=False a reasons=["unsigned document"] místo vyvolání výjimky.

Poškozený PdfSignature nebyl označen

check() přeskočí jakýkoli podpis, jehož byte_range není čtyřprvkový seznam, nebo jehož reference_data není bytes/bytearray, místo aby vyvolal výjimku nebo jej nahlásil jako kompromitovaný. Podpis vytvořený se špatnou strukturou je tiše vyloučen z kontroly, není označen.

Zaměňování tohoto detektoru s vytvářením podpisu

SignaturesCompromiseDetector a CompromiseCheckResult pouze kontrolují podpisy, které již v dokumentu existují — nemají žádný způsob, jak vytvořit, aplikovat nebo vložit nový podpis.

Často kladené otázky

Co přesně se zde považuje za „kompromitovaný“?

Významné, ne-bílé bajty připojené k PDF za rozsahem bajtů podepsaných podpisem — s dvěma výjimkami, které detektor již zohledňuje: pozdější podpis nebo časové razítko, které tyto bajty také pokrývá, a inkrementální aktualizace, která pouze přidává validační materiál (například /DSS) aniž by vrstvením přidávala nový obsah, jako jsou anotace.

Ověřuje to kryptografickou platnost samotného podpisu?

Ne. SignaturesCompromiseDetector kontroluje vzory manipulace kolem podepsaného rozsahu bajtů. Kryptografická platnost je samostatná kontrola, dostupná přes PdfSignature.validate().

Co mi říká signatures_coverage?

Počet podpisů, které kontrola ve skutečnosti prozkoumala v předaném dokumentu — užitečné pro potvrzení, že detektor viděl očekávané podpisy, předtím než budete důvěřovat čistému výsledku.

Mohu zkontrolovat dokument s více podpisy najednou?

Ano. check() iteruje každou položku v signed_document.signatures a vrací jeden agregovaný CompromiseCheckResult, který zahrnuje všechny.

Musím v běžném použití sám vytvářet objekty PdfSignature?

Ne — konstrukce PdfSignature v kroku 3 slouží k přímému zkoumání chování detektoru. Ve skutečném pracovním postupu předávejte jakýkoli objekt, který váš kód pro načítání dokumentů již vytváří, pokud poskytuje seznam signatures položek ve tvaru PdfSignature.

Viz také:

 Čeština