Podpis nad PDF ne prepove poznejših sprememb. Fiksira bajtni obseg, inkrementalna posodobitev pa pripne nove bajte za njim, tako da podpis ostane matematično veljaven, medtem ko dokument pridobi novo vsebino. Ali je ta vsebina sprejemljiva, je vprašanje politike, DocMDP pa je mesto, kjer avtor izjavi politiko: sploh brez sprememb, samo izpolnjevanje obrazcev in podpisovanje, ali to plus pripombe. Izvrševanje pomeni razvrščanje tega, kaj se je dejansko spremenilo, kar počne AnalyzeModifications. Usmerite jo na starejšo revizijo, nato preberite GetModificationLevel za celotno sodbo in dostopnike po najdbi za raven, številko objekta in opis vsake razlike
S tem na mestu se izvršitev DocMDP skrči v primerjavo: je izračunana raven na ali pod raven, ki jo politika dovoljuje
Zakaj je od podpisanega PDF pričakovati spremembo
Trije legitimni primeri in pokrivajo večino tistega, kar boste videli. Drugi podpisnik doda svoj podpis. Prejemnik izpolni polja obrazcev, ki jih je avtor pustil odprta. In gradivo dolgoročne validacije je pripeto: odgovori OCSP in CRL zapisani v varnostno shrambo dokumenta, tako da podpis ostane preverljiv, ko so odgovorni že odšli. To zadnje ni le dovoljeno, to je tisto, kar dobro vodeni arhiv namenoma počne s podpisanimi dokumenti
Torej »datoteka je zrasla po podpisu« ne nosi nobene informacije. Vprašanje je vedno, kaj je bilo dodano, odgovor pa mora priti iz primerjanja stanj dokumenta in ne iz opazovanja bajtov. Mehanika pripenjanja sama je pokrita v članku o inkrementalni posodobitvi
Razvrstite po obliki objekta, ne po poti, ki jo je proizvedla
Razvrščevalnik gleda, kaj objekt je po spremembi, in ne na to, kateri klic knjižnice ga je ustvaril. To je namerno, ker analiza teče proti datotekam, proizvedenim s strani druge programske opreme, kjer ni nobene klicne poti za pregled
Prepoznane so štiri oblike. Varnostna shramba dokumenta in slovarji informacij, povezanih z validacijo, objekti tokov navzkrižnih referenc, vnos metapodatkov kataloga in slovarji podpisov, ki nosijo bajtni obseg, so gradivo dolgoročnega arhiva. Objekt, ki nosi tako tip polja kot vrednost polja, je izpolnjevanje obrazcev. Objekt, katerega tip je pripomba (annotation) ali katerega podtip je eden od tistih, navedenih v Tabeli 168 ISO 32000-2, je sprememba pripombe. Vse ostalo je nerazvrščeno
Odstranitve so obravnavane strože od dodajanj. Odstranjeni objekt je na belem seznamu samo, ko je bil objekt na stari strani sam arhivsko gradivo, kar pokriva običajni primer varnostne shrambe, zamenjane z novejšo. Vsaka druga odstranitev je nerazvrščena, ker brisanje vsebine iz podpisanega dokumenta ni tisto, kar pooblasti katera koli raven dovoljenj. Razlike na ravni dokumenta so še strožje: sprememba števila strani gre naravnost na nerazvrščeno brez pregledovanja posameznih objektov, saj nobena raven DocMDP ne dovoljuje dodajanja ali odstranjevanja strani
Beli seznam se zmoti v smeri odklanjanja
To je pravilo zasnove, ki upravlja vsako odločitev na meji. Sprememba, napačno razvrščena kot dovoljena, je podpis, ki validira nad vsebino, ki je avtor ni nikoli pooblastil. Sprememba, napačno razvrščena kot nerazvrščena, je dokument, ki je označen in pregledan s strani osebe. Ti dve napaki nista simetrični, zato beli seznam ostane ozek in neprepoznane oblike padejo na nerazvrščeno namesto da bi bile ugane
To ima praktično posledico, vredno predvidevanja: datoteke od nenavadnih proizvajalcev bodo včasih poročale o nerazvrščenih spremembah, ki so ob pregledu nedolžne. Pravi odziv je pogledati podrobnost najdbe in številko objekta namesto širitve belega seznama, ker beli seznam, ki raste, da utiša posamezna poročila, preneha biti varnostni nadzor
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 urejen mlNone, mlLTAUpdates, mlFormFilling,
// mlAnnotations, mlUnclassified; vrnalnik vrne njegov ordinale
Level := Pdf.GetModificationLevel;
// Izvršitev DocMDP je zdaj ena primerjava proti politiki
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;
Celotna raven je maksimum čez vse najdbe, kar je edina utemeljiva agregacija: dokument, ki vsebuje devetindevetdeset arhivskih dodajanj in eno nerazvrščeno spremembo, je nerazvrščena sprememba
Spodaj: prstni odtisi, ne kriptografske zgostitve
Primerjalni motor, ki ga izpostavlja CompareWith in na katerem je zgrajena analiza sprememb, identificira objekte s prstnim odtisom njihovih normaliziranih teles z uporabo nekriptografske 64-bitne zgostitve (hash) namesto SHA-256. To je premišljena izbira. Tisto, kar strukturna primerjava potrebuje, je determinizem: isto telo objekta mora vedno proizvesti isti prstni odtis znotraj enega zagona. Ne potrebuje odpornosti na trke, ker je napadalec, ki nadzoruje obe strani primerjave, že zmagal po drugih sredstvih, plačevanje polne kriptografske zgostitve nad vsakim objektom v dokumentu milijona objektov pa je pravi strošek brez koristi
Dve pravili normalizacije sta pomembnejši od izbire zgostitve. Posredne reference se zvijejo v žeton nadomestnega znaka namesto da bi bile razširjene v referencirano vsebino: razširjanje bi skopiralo telo deljenega objekta v vsakega sklicujočega, zato bi en majhen popravek deljenega opisnika pisave razveljavil prstni odtis vsakega objekta, ki do njega pride, in poročilo bi bilo neberljivo. Številke objektov same so izključene iz prstnega odtisa, ker lahko prepis preštevilči objekte brez spremembe česar koli semantičnega
Ujemanje nato teče v dveh prehodih, najprej poravnava po prstnem odtisu in nato parjenje preostanka po številki objekta, da se identificirajo spremembe namesto dodajanja plus odstranitve. Poceni pregledi pridejo prvi povsod: razlika števila strani je poročana, preden se katero koli prečkanje objektov začne
Past: samo-primerjava ni zagotovljeno identična
Naravni prvi test za motor diff je primerjati datoteko s samo sabo in trditi, da je rezultat identičen. Ta trditev tukaj ne velja in razlog je poučna. Javna pot nalaganja in nižjeravenska pot nalaganja dokumenta ne konfigurirata dekodiranja identično, zato lahko ista datoteka, naložena skozi dve poti, proizvede prstne odtise, ki se razlikujejo za nekatere objekte. Motor ni napačen; dve nalaganji sta resnično proizvedli različni stanji v pomnilniku
Namesto sile obeh poti skupaj je semantika primerjave izjavljena ozko: analiza primerja trenutno stanje dokumenta s starejšo revizijo in poroča identično samo, ko se dva nabora prstnih odtisov natanko ujemata. To je vprašanje, ki ga uporabniki dejansko zastavijo, in ne zahteva, da sta dva nalagalnika zamenljiva. Ko zasnujete funkcijo primerjave, je definiranje, kaj pomeni »isto«, več dela kot njegovo izračunavanje
Kje ga uporabiti
Dve mesti. V validacijskem poročilu, poleg preverjanja podpisov, tako da recenzent vidi ne samo, ali je podpis kriptografsko nedotaknjen, ampak kaj se je zgodilo z dokumentom potem; stran podpisov je pokrita v PAdES podpisovanju in validaciji. In na vstopnih vratih, kjer je dokument, ki prispe od zunaj, preverjen proti kopiji, ki ste jo poslali, tako da je vračilo pogodbe z dodano pripombo obravnavano drugače kot tisto z urejano stranjo
En pridržek o obsegu. Ta analiza vam pove, kaj se je spremenilo med dvema revizijama istega rodu dokumenta. Ne pove vam, ali je vidna vsebina zavajajoča, ali tok videza polja obrazca ustreza svoji vrednosti ali pa je besedilo, skrito pod prekrivko, še vedno prisotno v toku vsebine. To potrebuje ločeno obravnavo, stran odstranjevanja vsebine pa je pokrita v članku o pravem utrinjanju (true redaction). Vstopne točke analize in primerjave so dokumentirane na strani produkta losLab PDF Developer Library