چگونه امضاهای امنیتی PDF را در Python اضافه کنیم
Aspose.PDF FOSS برای Python شامل یک آشکارساز نفوذ امضا است که یک PDF امضاشده را برای الگوی خاصی از دستکاری بررسی میکند: بایتهای معنادار که پس از بازه بایتهای امضاشده یک امضا اضافه میشوند، ریسکی که بهطور منحصر بهفردی در فایلهای PDF بهصورت افزایشی بهروزرسانیشده وجود دارد. این راهنما این بررسی را به یک جریان کاری Python با استفاده از کلاسهای SignaturesCompromiseDetector و CompromiseCheckResult اضافه میکند. ایجاد یا اعمال امضای دیجیتال جدید بخش جداگانهای از کتابخانه است و در اینجا پوشش داده نمیشود. کتابخانه با دستور زیر نصب میشود.
راهنمای گامبهگام
گام ۱: نصب بسته
نصب بسته 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.")مرحله ۲: وارد کردن کلاسهای مورد نیاز
from aspose_pdf import CompromiseCheckResult, SignaturesCompromiseDetectorمرحله ۳: آمادهسازی یک شیء که فهرست امضاها را افشا میکند
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])پس از آنکه شیء سند شما ویژگی signatures را بهصورت فهرست با همان قالب افشا کرد، signed_document را با شیء سند خود جایگزین کنید — هر شیئی که این ویژگی را داشته باشد کار میکند.
مرحله ۴: اجرای بررسی سازش
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 توضیحی قابلخواندن برای هر مشکل یافتشده را فهرست میکند.
مرحله ۵: پردازش سندی بدون امضا
یک فهرست خالی یا عدم وجود 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 بهطور خاص به دنبال بایتهای بدون امضا که پس از بازه بایتهای امضا شده یک امضا اضافه میشوند میگردد — الگویی که معمولاً در دستکاری ساده بهروزرسانی تدریجی مشاهده میشود. این کار بررسی کامل امضای cryptographic را انجام نمیدهد. برای این منظور، 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 آن لیست ۴ عنصره نیست، یا reference_data آن bytes/bytearray نیست، رد میکند، بهجای ایجاد خطا یا گزارش بهعنوان خراب. امضایی که شکل نادرست دارد بهصورت ساکت از بررسی حذف میشود و پرچم نمیشود.
اشتباه گرفتن این آشکارساز با ایجاد امضا
SignaturesCompromiseDetector و CompromiseCheckResult فقط امضاهایی را که پیش از این روی سند وجود دارند بررسی میکنند — آنها هیچ روشی برای ایجاد، اعمال یا درج امضای جدید ندارند.
سوالات متداول
دقیقاً چه چیزی در اینجا بهعنوان «خراب» محسوب میشود؟
بایتهای معنادار و غیر فضای سفید که پس از بازه بایت امضاشده یک امضا به PDF اضافه میشوند — با دو استثنای که آشکارساز پیشاپیش برای آنها در نظر گرفته است: امضای بعدی یا مهر زمانی که خود آن بایتها را پوشش میدهد، و بهروزرسانی افزایشی که فقط مواد اعتبارسنجی (مانند یک /DSS) را اضافه میکند بدون اینکه محتوای جدیدی مانند حاشیهنویسیها را لایهگذاری کند.
آیا این صحتسنجی رمزنگاری امضای خود را تأیید میکند؟
خیر. SignaturesCompromiseDetector الگوهای دستکاری را در اطراف بازه بایت امضا بررسی میکند. صحتسنجی رمزنگاری یک بررسی جداگانه است که از طریق PdfSignature.validate() در دسترس است.
signatures_coverage به من چه میگوید؟
تعداد امضاهایی که بررسی در واقع روی سند ورودی بررسی کرده است — برای تأیید اینکه آشکارساز امضاهای مورد انتظار شما را دیده است پیش از trusting به نتیجهٔ تمیز مفید است.
آیا میتوانم یک سند با چندین امضا را همزمان بررسی کنم؟
بله. check() هر ورودی در signed_document.signatures را تکرار میکند و یک CompromiseCheckResult تجمیعی که همهٔ آنها را پوشش میدهد برمیگرداند.
آیا در استفادهٔ معمول نیاز دارم اشیاء PdfSignature را خودم بسازم؟
خیر — ساخت PdfSignature در گام ۳ برای بررسی مستقیم رفتار آشکارساز است. در یک جریان کاری واقعی، هر شیای را که کد بارگذاری سند شما تولید میکند، پاس دهید، به شرط آنکه یک فهرست signatures از ورودیهای شکلدار PdfSignature را ارائه دهد.