Potpis nad PDF-om ne zabranjuje kasnije promjene. On fiksira raspon bajtova, a inkrementalno ažuriranje dodaje nove bajtove nakon njega, pa potpis ostaje matematički valjan dok dokument stječe novi sadržaj. Je li taj sadržaj prihvatljiv pitanje je politike, a DocMDP je mjesto gdje autor navodi politiku: nikakve promjene, samo ispunjavanje obrazaca i potpisivanje, ili to plus napomene. Njezina provedba znači klasificirati što se stvarno promijenilo, a to čini AnalyzeModifications. Usmerite ga na raniju reviziju, zatim pročitajte GetModificationLevel za ukupnu presudu i pristupnike nalaza po stavkama za razinu, broj objekta i opis svake razlike
S time na mjestu, provedba DocMDP svodi se na usporedbu: je li izračunata razina na ili ispod razine koju politika dopušta
Zašto se od potpisanog PDF-a očekuje da se promijeni
Tri legitimna slučaja, i pokrivaju većinu onoga što ćete vidjeti. Drugi potpisnik dodaje svoj potpis. Primatelj ispunjava polja obrasca koja je autor ostavio otvorenima. I materijal dugotrajne provjere valjanosti se dodaje: OCSP odgovori i CRL-ovi upisani u sigurnosnu pohranu dokumenta tako da potpis ostane provjeriv i nakon što odgovarača više nema. Ono posljednje nije samo dopušteno, to je ono što dobro vođena arhiva namjerno čini s potpisanim dokumentima
Tako "datoteka je narasla nakon potpisivanja" ne nosi nikakvu informaciju. Pitanje je uvijek što je dodano, a odgovor mora doći iz usporedbe stanja dokumenata, a ne iz promatranja bajtova. Mehanička strana dodavanja pokrivena je u članku o inkrementalnom ažuriranju
Klasificirajte po obliku objekta, ne po putu koji ga je proizveo
Klasifikator gleda što je objekt jest nakon promjene, a ne koji knjižični poziv ga je stvorio. To je namjerno, jer se analiza izvodi nad datotekama proizvedenim drugim softverom, gdje nema dostupnog puta poziva za pregled
Prepoznaju se četiri oblika. Rječnici sigurnosne pohrane dokumenta i rječnici informacija vezanih uz provjeru valjanosti, objekti tokova unakrsnih referenci, unos metapodataka kataloga i rječnici potpisa koji nose raspon bajtova dugotrajno su arhivski materijal. Objekt koji nosi i tip polja i vrijednost polja jest ispunjavanje obrasca. Objekt čiji je tip napomena, ili čiji je podtip jedan od navedenih u ISO 32000-2 tablici 168, promjena je napomene. Sve ostalo je neklasificirano
Uklanjanja tretiraju se strože od dodavanja. Uklonjeni objekt na popisu dopuštenog jest samo kada je objekt na staroj strani sam bio arhivski materijal, što pokriva uobičajeni slučaj da sigurnosnu pohranu zamjenjuje novija. Svako drugo uklanjanje neklasificirano je, jer brisanje sadržaja iz potpisanog dokumenta nije nešto što razina dopuštenja autorizira. Razlike na razini dokumenta strože su i dalje: promjena broja stranica ide ravno u neklasificirano bez pregleda pojedinačnih objekata, jer nijedna DocMDP razina ne dopušta dodavanje ili uklanjanje stranica
Popis dopuštenog griješi u smjeru odbijanja
To je dizajnersko pravilo koje upravlja svakom graničnom odlukom. Promjena pogrešno klasificirana kao dopuštena jest potpis koji se provjerava nad sadržajem koji autor nikad nije autorizirao. Promjena pogrešno klasificirana kao neklasificirana jest dokument koji se označi i pregleda ljudska osoba. Te dvije pogreške nisu simetrične, pa popis dopuštenog ostaje uzak i neprepoznati oblici padaju u neklasificirano umjesto da se nagađa
To ima praktičnu posljedicu koju vrijedi predvidjeti: datoteke iz neuobičajenih proizvođača ponekad će javljati neklasificirane promjene koje su, pri pregledu, bezopasne. Ispravan odgovor je pogledati pojedinosti nalaza i broj objekta umjesto širenja popisa dopuštenog, jer popis koji raste da bi utišao pojedinačna izvješća prestaje biti sigurnosna kontrola
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 poredano mlNone, mlLTAUpdates, mlFormFilling,
// mlAnnotations, mlUnclassified; getter vraća svoj redni broj
Level := Pdf.GetModificationLevel;
// Provedba DocMDP sada je jedna usporedba s politikom
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;
Ukupna razina maksimum je nad svim nalazima, što je jedina obranjiva agregacija: dokument koji sadrži devedeset i devet arhivskih dodavanja i jednu neklasificiranu promjenu jest neklasificirana promjena
Ispod površine: otisci prstiju, ne kriptografski sažeci
Motor usporedbe koji izlaže CompareWith, i na kojem je analiza promjena izgrađena, identificira objekte otiskom prsta njihovog normaliziranog tijela pomoću nekriptografskog 64-bitnog sažetka umjesto SHA-256. To je promišljen izbor. Ono što strukturna usporedba treba jest determinizam: isto tijelo objekta mora uvijek proizvesti isti otisak unutar jednog izvođenja. Ne treba mu otpornost na sudare, jer napadač koji kontrolira obje strane usporedbe već je pobijedio drugim sredstvima, a plaćanje punog kriptografskog sažetka nad svakim objektom u dokumentu od milijun objekata stvaran je trošak bez koristi
Dvije pravile normalizacije važnija su od izbora sažetka. Neizravne reference savijaju se u rezervirani token umjesto da se raščlane u referencirani sadržaj: raščlamom bi se tijelo zajedničkog objekta kopiralo u svakog referencera, pa bi jedna mala izmjena zajedničkog opisnika fonta poništila otisak svakog objekta koji do njega dopire, a izvješće bi bilo nečitko. I brojevi objekata sami isključeni su iz otiska, jer preslikavanje iznova može prenumerirati objekte bez mijenjanja bilo čega semantičkog
Podudaranje zatim radi u dva prolaza, poravnavajući najprije po otisku, a ostatak uparujući po broju objekta da se identificiraju promjene umjesto dodavanja plus uklanjanja. Jeftine provjere dolaze prve od početka do kraja: razlika broja stranica javlja se prije nego bilo kakvo obilženje objekata počne
Zamka: samousporedba nije zajamčeno identična
Prirodni prvi test za motor razlika jest usporediti datoteku sa samom sobom i tvrditi da je rezultat identičan. Ta tvrdnja ovdje ne vrijedi, a razlog je poučan. Javni put učitavanja i nižerazinski put učitavanja dokumenta ne konfiguriraju dekodiranje identično, pa ista datoteka učitana kroz dva puta može proizvesti otiske koji se razlikuju za neke objekte. Motor nije pogrešan; dva učitavanja stvarno su proizvela različita stanja u memoriji
Umjesto prisiljavanja dva puta zajedno, semantika usporedbe navodi se usko: analiza uspoređuje trenutno stanje dokumenta s ranijom revizijom, a javlja identično samo kada se dva skupa otisaka točno poklope. To je pitanje koje korisnici stvarno postavljaju, i ne zahtijeva da dva učitavača budu zamjenjivi. Kada dizajnirate značajku usporedbe, definiranje što "isto" znači veći je dio posla nego njegovo računanje
Gdje ga koristiti
Dva mjesta. U izvješću provjere valjanosti, uz provjeru potpisa, tako da preglednik vidi ne samo je li potpis kriptografski netaknut nego i što se s dokumentom dogodilo poslije; strana potpisa pokrivena je u PAdES potpisivanju i provjeri valjanosti. I na ulaznoj vratima, gdje se dokument koji stiže izvana provjerava u odnosu na kopiju koju ste poslali, pa vraćeni ugovor s dodanom napomenom tretira se drugačije od onog s uređenom stranicom
Jedna napomena o opsegu. Ova analiza vam govori što se promijenilo između dviju revizija istog rodoslova dokumenta. Ne govori vam je li vidljivi sadržaj varljiv, odgovara li tok izgleda polja obrasca njegovoj vrijednosti ili je li tekst skriven pod preklopom i dalje prisutan u toku sadržaja. Onima je potrebna odvojena obrada, a strana uklanjanja sadržaja pokrivena je u članku o pravom izostavljanju sadržaja. Ulazne točke analize i usporedbe dokumentirane su na stranici proizvoda losLab PDF Developer Library