Tehnični članak

Razvrščanje sprememb v PDF po podpisu

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

Diagram lestvice ravni sprememb PDFlibPas od mlNone do mlUnclassified, ki prikazuje izvršitev politike DocMDP kot eno primerjavo v Delphiju
Lestvica TPLModificationLevel teče od mlNone do mlUnclassified, izvršitev DocMDP pa se reducira na primerjavo izračunane ravni s politiko

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

Odločitveno drevo, ki ga PDFlibPas uporabi na vsakem spremenjenem objektu PDF in razvršča posodobitve na ravni arhiva, izpolnjevanja obrazcev, pripomb ali nerazvrščene
Vsak spremenjeni objekt je razvrščen po tem, kaj je — varnostna shramba, tok xref, polje, pripomba — nikoli po klicu, ki ga je proizvedel

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

Dvoobhodni diff revizij PDF v PDFlibPas: najprej pregled števila strani, 64-bitni prstni odtisi, poravnava prstnih odtisov in nato parjenje po številkah objektov
Primerjalni motor odtisne normalizirana telesa objektov, najprej poroča razlike števila strani, nato ujema po prstnem odtisu in številki objekta

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