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, SignaturesCompromiseDetectorKrok 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 findingscheck() 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.