Memeriksa keberadaan tanda tangan dan memahami batas kepercayaan
Sekilas pandang
Bagian berjudul “Sekilas pandang”Gunakan inspector Core untuk mendeteksi apakah PDF memiliki tanda tangan, dan pastikan batas kepercayaannya tetap jelas. Deteksi bukanlah verifikasi. Verifikasi kriptografis, validasi jalur kepercayaan, dan pemeriksaan pencabutan ditangani oleh edisi Premium atau verifier eksternal.
Prasyarat
Bagian berjudul “Prasyarat”- Core sudah terpasang:
composer require nextpdf/core:^3. - Berkas PDF yang akan diperiksa.
- Baca byte dari PDF.
- Buat
Inspectordan panggilinspect(). - Baca
InspectResult::$hasSigned. Nilaitrueberarti berkas tersebut berisi kamus tanda tangan. - Baca
InspectResult::$isEncrypteddan flag risiko sebagai konteks pendukung. - Arahkan berkas ke verifier untuk keputusan kriptografis. Inspector melaporkan keberadaan, bukan keabsahan.
Diagram di bawah ini menunjukkan batasnya: keberadaan bukanlah keabsahan. Diagram ini juga menampilkan pemeriksaan yang tetap harus dilakukan oleh verifier yang sebenarnya.
Contoh lengkap
Bagian berjudul “Contoh lengkap”<?php
declare(strict_types=1);
require_once __DIR__ . '/vendor/autoload.php';
use NextPDF\Inspect\Inspector;use NextPDF\Inspect\InspectConfig;
$pdfData = file_get_contents(__DIR__ . '/incoming.pdf');if ($pdfData === false || $pdfData === '') { fwrite(STDERR, "Cannot read incoming.pdf\n"); exit(1);}
$inspector = new Inspector();
// InspectConfig::quick() selects InspectDepth::Quick. This is the only// depth that runs offline: a default Inspector has no Spectrum sidecar,// and without a sidecar Quick is the sole path that returns a result.// Standard and Full require the sidecar (see the SIDECAR-001 edge case).$result = $inspector->inspect( $pdfData, InspectConfig::quick(),);
// hasSigned reports the PRESENCE of a signature dictionary.// It does NOT mean the signature verifies.if ($result->hasSigned) { echo "A signature is present in incoming.pdf\n"; echo "Encrypted: " . ($result->isEncrypted ? 'yes' : 'no') . "\n"; echo "Next step: run a cryptographic verifier before trusting it.\n";} else { echo "No signature found in incoming.pdf\n";}Keluaran yang diharapkan
Bagian berjudul “Keluaran yang diharapkan”Untuk masukan yang ditandatangani:
A signature is present in incoming.pdfEncrypted: noNext step: run a cryptographic verifier before trusting it.Untuk masukan yang tidak ditandatangani:
No signature found in incoming.pdfKasus tepi
Bagian berjudul “Kasus tepi”- Keberadaan bukanlah keabsahan — batas.
InspectResult::$hasSignedmelaporkan bahwa kamus tanda tangan ada di dalam berkas. Pemeriksaan ini tidak memeriksa struktur Cryptographic Message Syntax (CMS), digest byte-range, sertifikat penanda tangan, rantai sertifikat, ataupun status pencabutan. Berkas yang telah dirusak tetap dapat melaporkanhasSigned = true. Jangan pernah menganggap keberadaannya sebagai bukti integritas atau kepengarangan. - Apa yang dibutuhkan oleh verifikasi penuh. Keputusan lengkap menghitung ulang digest byte-range dan membandingkannya (ISO 32000-2 §12.8.1), memvalidasi CMS SignedData, membangun dan memeriksa jalur X.509 menuju anchor tepercaya, serta memeriksa pencabutan melalui Online Certificate Status Protocol (OCSP) atau daftar pencabutan sertifikat (CRL). Untuk masukan jangka panjang, data validasi tersimpan di dalam Document Security Store (DSS) (ETSI EN 319 142-2 §6.3.1). Operasi-operasi ini berjalan di balik kontrak
SignerInterfacedanLtvManagerInterface; implementasi produksinya disertakan dalam edisi Pro dan Enterprise. Validator eksternal merupakan jalur lain yang didukung. - Kedalaman inspeksi dan sidecar (SIDECAR-001).
new Inspector()standar tidak memiliki sidecar Spectrum yang dikonfigurasi. Tanpa sidecar, hanyaInspectDepth::Quickyang mengembalikan hasil.InspectDepth::Quickmenggunakan fallback PHP di dalam proses.InspectDepth::StandarddanInspectDepth::Fullkeduanya memerlukan sidecar. Jika tidak ada sidecar yang tersedia, keduanya melemparkanInspectExceptiondengan kodeINSPECT-SIDECAR-001(“Spectrum sidecar is required for Standard/Full depth inspection”,retryable = true). Kedalaman standar bawaan konstruktorInspectConfigadalahStandard. Oleh karena itu,new InspectConfig()tanpa argumen (ataunew InspectConfig(depth: InspectDepth::Standard)) tidak dapat digunakan secara offline. Konfigurasi tersebut melemparkan SIDECAR-001 sebelumhasSignedsempat dibaca. GunakanInspectConfig::quick()untuk deteksi keberadaan secara offline, seperti dalam resep ini. Tidak ada kedalaman yang melakukan verifikasi tanda tangan kriptografis di dalam Core. - Masukan kosong. String kosong melemparkan
InspectExceptiondengan kodeINSPECT-INPUT-001. Tambahkan pengaman saat membaca berkas. - Beberapa tanda tangan. Flag keberadaan ini tidak menghitung jumlah tanda tangan ataupun membedakan tanda tangan persetujuan dari stempel waktu dokumen. Gunakan verifier khusus jika jumlah atau keputusan per tanda tangan penting.
Kesesuaian
Bagian berjudul “Kesesuaian”| Pernyataan | Spesifikasi | Klausa | reference_id |
|---|---|---|---|
Nilai tanda tangan disimpan di entri Contents pada kamus tanda tangan. | ISO 32000-2 | §12.8.1 | |
Verifikasi menghitung ulang digest atas ByteRange, tanpa menyertakan nilai tanda tangan. | ISO 32000-2 | §12.8.1 | |
| Data validasi jangka panjang tersimpan di dalam DSS. | ETSI EN 319 142-2 | §6.3.1 |
Resep ini mendeteksi apakah tanda tangan ada. Resep ini tidak menyatakan bahwa tanda tangan mana pun sah, tepercaya, atau belum dicabut. Keputusan itu berada pada verifier kriptografis.