Tehnički članak

Klasifikacija promjena u PDF-u nakon potpisivanja

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

Dijagram ljestvice razine promjena PDFlibPas od mlNone do mlUnclassified koji prikazuje provedbu DocMDP politike kao jednu usporedbu u Delphiju
Ljestvica TPLModificationLevel ide od mlNone do mlUnclassified, a provedba DocMDP svodi se na usporedbu izračunate razine s politikom

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

Stablo odlučivanja koje PDFlibPas primjenjuje na svaki promijenjeni PDF objekt, razvrstavajući ažuriranja u razine arhive, ispunjavanja obrazaca, napomena ili neklasificirano
Svaki promijenjeni objekt klasificira se po tome što jest — sigurnosna pohrana, xref tok, polje, napomena — nikad po pozivu koji ga je proizveo

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

Dvoprolazni PDF diff revizija u PDFlibPas: najprije provjera broja stranica, 64-bitni otisci, poravnanje po otiscima zatim uparivanje po broju objekta
Motor usporedbe otiskuje normalizirana tijela objekata, prvo javlja razlike broja stranica, zatim uparuje po otisku i broju objekta

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