כיצד להוסיף חתימות אבטחה של PDF ב-Python
Aspose.PDF FOSS עבור Python כולל גלאי פגיעה בחתימה שבודק קובץ PDF שכבר נחתם עבור תבנית זיוף ספציפית: בתים משמעותיים המתווספים אחרי תחום הבתים החתומים של החתימה, סיכון ייחודי לקבצי PDF שמתעדכנים בתוספת הדרגתית. מדריך זה מוסיף את הבדיקה לתהליך עבודה של Python באמצעות המחלקות SignaturesCompromiseDetector ו-CompromiseCheckResult. יצירת או יישום של חתימות דיגיטליות חדשות הוא חלק נפרד של הספרייה ואינו מכוסה כאן. הספרייה מותקנת באמצעות הפקודה שלמטה.
מדריך שלב אחר שלב
שלב 1: התקנת החבילה
התקן את חבילת 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 .אמת את ההתקנה על ידי ייבוא SignaturesCompromiseDetector והדפסת הודעת אישור:
from aspose_pdf import SignaturesCompromiseDetector
print("aspose-pdf-foss-for-python is ready.")שלב 2: ייבא מחלקות נדרשות
from aspose_pdf import CompromiseCheckResult, SignaturesCompromiseDetectorשלב 3: הכנת אובייקט שחושף רשימת חתימות
SignaturesCompromiseDetector אינו מפענח PDF בעצמו — הקונסטרקטור שלו מקבל כל אובייקט שמחשוף תכונה signatures: רשימת ערכי חתימה, שכל אחד נושא valid, byte_range, ו-reference_data. PdfSignature — מחלקה פשוטה שניתן לבנות ישירות — תואמת למבנה זה, ולכן היא שימושית כדי לראות איך הבדיקה מתנהגת לפני שמחברים אותה לאובייקט המסמך שלך:
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])החלף את signed_document באובייקט המסמך שלך ברגע שהוא חושף רשימת signatures באותו הצורה — כל אובייקט עם תכונה זו עובד.
שלב 4: הפעל את בדיקת הפשרה
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() עובר על כל חתימה ב-signed_document.signatures, מחפש תוכן לא חתום שמצורף אחרי טווח הבייטים החתום של כל חתימה. CompromiseCheckResult מסכם את התוצאה: compromised ו-has_compromised_signatures מדווחים את אותו ערך בוליאני תחת שני שמות, signatures_coverage מדווח כמה חתימות נבדקו, ו-reasons מציג הסבר קריא לבן אדם עבור כל בעיה שנמצאה.
שלב 5: טיפול במסמך ללא חתימות
רשימת signatures ריקה או חסרה אינה תנאי שגיאה — היא מדווחת באותו אופן כמו מסמך שאין בו מה לבדוק:
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"]העברת SignaturesCompromiseDetector(None) — ברירת המחדל של הבונה — מתנהגת באותו האופן.
בעיות נפוצות ותיקונים
compromised is False ל-PDF שאתה יודע שנערך לאחר החתימה
SignaturesCompromiseDetector מחפש ספציפית בתים לא חתומים שמתווספים אחרי טווח הבתים החתומים של החתימה — תבנית טיפוסית של זיוף עדכון מצטבר תמוה. הוא אינו מבצע אימות חתימה קריפטוגרפי מלא. עבור זאת, קרא ל-validate() על האובייקט PdfSignature הפרטי.
compromised and has_compromised_signatures נראה מיותר
הם בעלי אותו ערך: compromised הוא נכס מחושב שמחזיר את has_compromised_signatures. השתמש בשם שהכי מתאים בקוד שלך.
לא נזרקת שום חריגה כאשר למסמך אין signatures תכונה בכלל
SignaturesCompromiseDetector מתייחס למסמך ללא תכונת signatures, או document=None, באותו אופן כמסמך ללא חתימה — check() מחזיר תוצאה עם has_compromised_signatures=False ו-reasons=["unsigned document"] במקום ליזום שגיאה.
מבנה פגום PdfSignature אינו מסומן
check() מדלג על כל חתימה שה־byte_range שלה איננה רשימה של 4 אלמנטים, או שה־reference_data שלה אינו bytes/bytearray, במקום ליזום שגיאה או לדווח על כך כמתפשר. חתימה שנבנתה בצורה שגויה מושמטת שקט מהבדיקה, ולא מסומנת.
בלבול בין מגלה זה ליצירת חתימה
SignaturesCompromiseDetector ו-CompromiseCheckResult בודקים רק חתימות שכבר קיימות במסמך — אין להם שיטה ליצור, ליישם או לשבץ חתימה חדשה.
שאלות נפוצות
מה בדיוק נחשב ל"מתפשר" כאן?
בתים משמעותיים, שאינם רווחים, שמתווספים ל-PDF אחרי תחום הבתים החתומים של חתימה — עם שני חריגים שהמגלה כבר מתחשב בהם: חתימה או חותמת זמן מאוחרת שמכסים את הבתים הללו, ועדכון אינקרמנטלי שמוסיף רק חומר אימות (כגון /DSS) מבלי לשכוב תוכן חדש כמו annotations.
האם זה מאמת את תקפות הקריפטוגרפית של החתימה עצמה?
לא. SignaturesCompromiseDetector בודק דפוסי זיוף סביב טווח הבייטים החתומים. תקפות קריפטוגרפית היא בדיקה נפרדת, זמינה דרך PdfSignature.validate().
מה signatures_coverage אומר לי?
מספר החתימות שהבדיקה בחנה בפועל במסמך שהועבר — שימושי לאישור שהגלאי ראה את החתימות שציפית לפני שמאמינים בתוצאה נקייה.
האם אני יכול לבדוק מסמך עם חתימות מרובות בבת אחת?
כן. check() עובר על כל ערך ב-signed_document.signatures ומחזיר CompromiseCheckResult מצטבר הכולל את כולם.
האם אני צריך לבנות עצמים של PdfSignature בעצמי בשימוש רגיל?
לא — בניית PdfSignature של שלב 3 נועדה לחקור את התנהגות הגלאי ישירות. בתהליך עבודה אמיתי, העבר כל אובייקט שהקוד שלך לטעינת המסמך כבר מייצר, כל עוד הוא מציג רשימת signatures של ערכים בעלי צורת PdfSignature.