Tanda tangan atas sebuah PDF tidak melarang perubahan selanjutnya. Ia mengunci satu rentang byte, dan incremental update menambahkan byte baru setelahnya, sehingga tanda tangan tetap valid secara matematis sementara dokumen memperoleh konten baru. Apakah konten itu dapat diterima adalah soal kebijakan, dan DocMDP adalah tempat penulis menyatakan kebijakan itu: tanpa perubahan sama sekali, hanya pengisian form dan penandatanganan, atau itu ditambah anotasi. Menegakkannya berarti mengklasifikasi apa yang benar-benar berubah, dan itulah yang dilakukan AnalyzeModifications. Arahkan ke revisi yang lebih awal, lalu baca GetModificationLevel untuk vonis keseluruhan dan accessor per temuan untuk level, nomor objek, dan deskripsi setiap perbedaan
Dengan itu di tempat, penegakan DocMDP mengerut menjadi satu perbandingan: apakah level hasil perhitungan berada pada atau di bawah level yang diizinkan kebijakan
Mengapa PDF yang ditandatangani memang diharapkan berubah
Tiga kasus yang sah, dan ketiganya mencakup sebagian besar dari yang akan Anda temui. Penandatang kedua menambahkan tanda tangannya. Penerima mengisi field form yang dibiarkan terbuka oleh penulis. Dan materi validasi jangka panjang ditambahkan: respons OCSP dan CRL ditulis ke document security store agar tanda tangan tetap dapat diverifikasi setelah responder-responder itu tiada. Yang terakhir bukan sekadar diizinkan, itu yang sengaja dilakukan arsip yang dikelola baik terhadap dokumen bertanda tangan
Jadi "berkasnya bertambah setelah penandatanganan" tidak membawa informasi apa pun. Pertanyaannya selalu adalah apa yang ditambahkan, dan jawabannya harus datang dari membandingkan status dokumen, bukan dari mengamati byte. Mekanika append-nya sendiri dibahas dalam artikel incremental update
Klasifikasi berdasarkan bentuk objek, bukan jalur yang memproduksinya
Klasifikator melihat apa sesungguhnya objek itu setelah perubahan, bukan panggilan pustaka mana yang menciptakannya. Itu disengaja, karena analisis berjalan terhadap berkas yang diproduksi perangkat lunak lain, di mana tidak ada jalur panggilan yang bisa diperiksa
Empat bentuk dikenali. Document security store dan dictionary informasi terkait validasi, objek cross-reference stream, entri metadata katalog, dan dictionary tanda tangan yang membawa byte range adalah materi arsip jangka panjang. Objek yang membawa field type sekaligus field value adalah pengisian form. Objek yang tipenya annotation, atau yang subtypenya termasuk yang tercantum di ISO 32000-2 Table 168, adalah perubahan anotasi. Segala yang lain tidak terklasifikasi
Penghapusan diperlakukan lebih ketat daripada penambahan. Objek yang dihapus hanya masuk whitelist ketika objek di sisi lama sendiri adalah materi arsip, yang mencakup kasus normal security store digantikan yang lebih baru. Setiap penghapusan lain tidak terklasifikasi, karena menghapus konten dari dokumen bertanda tangan bukan sesuatu yang diotorisasi oleh level izin. Perbedaan level dokumen lebih ketat lagi: perubahan jumlah halaman langsung jatuh ke tidak terklasifikasi tanpa memeriksa objek individual, karena tidak ada level DocMDP yang mengizinkan menambah atau menghapus halaman
Whitelist condong menolak
Inilah aturan desain yang mengatur setiap keputusan di garis batas. Perubahan yang keliru diklasifikasi sebagai diizinkan adalah tanda tangan yang tervalidasi di atas konten yang tidak pernah diotorisasi penulis. Perubahan yang keliru diklasifikasi sebagai tidak terklasifikasi adalah dokumen yang ditandai dan ditinjau oleh manusia. Kedua kesalahan itu tidak simetris, sehingga whitelist tetap sempit dan bentuk yang tidak dikenali jatuh ke tidak terklasifikasi alih-alih ditebak
Itu punya konsekuensi praktis yang layak diantisipasi: berkas dari produsen yang tidak biasa kadang melaporkan perubahan tidak terklasifikasi yang, setelah diperiksa, jinak. Respons yang benar adalah melihat detail temuan dan nomor objek, bukan melebarkan whitelist, karena whitelist yang tumbuh untuk membungkam laporan individual berhenti menjadi kontrol keamanan
uses
PDFlibrary, PDFlibCompare;
var
Pdf: TPDFlib;
I, Level: Integer;
begin
Pdf := TPDFlib.Create(nil);
try
Pdf.LoadFromFile('contract-countersigned.pdf', '');
if Pdf.AnalyzeModifications('contract-as-signed.pdf', '') < 0 then
raise Exception.Create('the earlier revision could not be loaded');
// TPLModificationLevel terurut mlNone, mlLTAUpdates, mlFormFilling,
// mlAnnotations, mlUnclassified; getter mengembalikan ordinalnya
Level := Pdf.GetModificationLevel;
// Penegakan DocMDP kini menjadi satu perbandingan terhadap kebijakan
if Level > Ord(mlFormFilling) then
for I := 0 to Pdf.GetModificationFindingCount - 1 do
Report.Add(Format('object %d, level %d: %s',
[Pdf.GetModificationFindingObjNum(I),
Pdf.GetModificationFindingLevel(I),
Pdf.GetModificationFindingDetail(I)]));
finally
Pdf.Free;
end;
end;
Level keseluruhan adalah maksimum atas semua temuan, agregasi satu-satunya yang dapat dipertahankan: dokumen yang berisi sembilan puluh sembilan penambahan arsip dan satu perubahan tidak terklasifikasi adalah dokumen dengan satu perubahan tidak terklasifikasi
Di baliknya: fingerprint, bukan hash kriptografis
Mesin perbandingan yang diekspos oleh CompareWith, dan yang menjadi fondasi analisis modifikasi, mengidentifikasi objek lewat fingerprint dari body yang dinormalisasi menggunakan hash 64-bit non-kriptografis alih-alih SHA-256. Itu pilihan yang dipertimbangkan. Yang dibutuhkan perbandingan struktural adalah determinisme: body objek yang sama harus selalu menghasilkan fingerprint yang sama dalam satu eksekusi. Ia tidak membutuhkan ketahanan terhadap tabrakan, karena penyerang yang mengendalikan kedua sisi perbandingan sudah menang lewat cara lain, dan membayar hash kriptografis penuh atas setiap objek dalam dokumen berjuta objek adalah biaya nyata tanpa manfaat
Dua aturan normalisasi lebih penting daripada pilihan hash. Referensi tidak langsung dilipat menjadi token placeholder alih-alih diekspansi ke konten yang dirujuk: ekspansi akan menyalin body objek bersama ke setiap perujuk, sehingga satu suntingan kecil pada font descriptor bersama akan membatalkan fingerprint setiap objek yang menjangkaunya, dan laporannya jadi tidak terbaca. Dan nomor objek sendiri dikecualikan dari fingerprint, karena penulisan ulang bisa menomori ulang objek tanpa mengubah apa pun secara semantik
Pencocokan kemudian berjalan dalam dua lintasan, menyelaraskan berdasarkan fingerprint lebih dulu dan memasangkan sisanya berdasarkan nomor objek untuk mengidentifikasi perubahan, bukan penambahan plus penghapusan. Pemeriksaan murah selalu didahulukan: perbedaan jumlah halaman dilaporkan sebelum traversal objek apa pun dimulai
Jebakan: perbandingan diri dengan diri tidak dijamin identik
Uji pertama yang alami bagi mesin diff adalah membandingkan berkas dengan dirinya sendiri dan menegaskan hasilnya identik. Asersi itu tidak berlaku di sini, dan alasannya informatif. Jalur muat publik dan jalur muat dokumen level lebih rendah tidak mengonfigurasi decoding secara identik, sehingga berkas yang sama yang dimuat lewat dua rute itu bisa menghasilkan fingerprint yang berbeda untuk sebagian objek. Mesinnya tidak keliru; dua pemuatan itu benar-benar menghasilkan status in-memory yang berbeda
Alih-alih memaksa kedua jalur disatukan, semantik perbandingan dinyatakan secara sempit: analisis membandingkan status dokumen saat ini terhadap revisi lebih awal, dan melaporkan identik hanya ketika kedua set fingerprint bertepatan persis. Itulah pertanyaan yang benar-benar diajukan pengguna, dan itu tidak mensyaratkan kedua loader dapat dipertukarkan. Ketika Anda merancang fitur perbandingan, mendefinisikan apa arti "sama" adalah bagian pekerjaan yang lebih besar daripada menghitungnya
Di mana memakainya
Dua tempat. Dalam laporan validasi, berdampingan dengan pemeriksaan tanda tangan, sehingga peninjau melihat bukan hanya apakah tanda tangan utuh secara kriptografis tetapi juga apa yang terjadi pada dokumen sesudahnya; sisi tanda tangan dibahas dalam penandatanganan dan validasi PAdES. Dan di gerbang intake, di mana dokumen yang datang dari luar diperiksa terhadap salinan yang Anda kirim, sehingga kontrak yang dikembalikan dengan anotasi tambahan diperlakukan berbeda dari yang halamannya disunting
Satu catatan tentang cakupan. Analisis ini memberi tahu Anda apa yang berubah antara dua revisi dari garis keturunan dokumen yang sama. Ia tidak memberi tahu apakah konten yang terlihat menyesatkan, apakah appearance stream field form cocok dengan nilainya, atau apakah teks yang tersembunyi di balik overlay masih ada di content stream. Itu butuh perlakuan terpisah, dan sisi penghapusan kontennya dibahas dalam artikel redaksi sesungguhnya. Entry point analisis dan perbandingan didokumentasikan di halaman produk losLab PDF Developer Library