Tekninen artikkeli

PDF:n allekirjoituksen jälkeisten muutosten luokittelu

Allekirjoitus PDF:n yllä ei kiellä myöhempiä muutoksia. Se lukitsee tavualueen, ja inkrementaalinen päivitys liittää uusia tavuja sen jälkeen, joten allekirjoitus pysyy matemaattisesti pätevänä, kun dokumentti saa uutta sisältöä. Sen, onko tuo sisältö hyväksyttävää, päättää politiikka, ja DocMDP on paikka, jossa tekijä ilmoittaa politiikan: ei muutoksia lainkaan, vain lomakkeiden täyttö ja allekirjoittaminen, tai ne plus annotaatiot. Sen täytäntöönpano tarkoittaa sen luokittelua, mitä todella muuttui, ja sen tekee AnalyzeModifications. Osoita se aiempaan revisioon, lue sitten GetModificationLevel kokonaiskannanottosta ja löydöittäiset hakufunktiot jokaisen eron tasosta, objektinumerosta ja kuvauksesta

Kun se on paikallaan, DocMDP:n täytäntöönpano kutistuu vertailuksi: onko laskettu taso tasolla, jonka politiikka sallii, tai sen alapuolella

Kaavio PDFlibPasin muutostasojen tikkaita mlNone:sta mlUnclassifiediin, jossa DocMDP-politiikan täytäntöönpano näkyy yhtenä vertailuna Delphissä
TPLModificationLevel-tikkaat kulkevat mlNone:sta mlUnclassifiediin, ja DocMDP:n täytäntöönpano kutistuu lasketun tason vertaamiseen politiikkaan

Miksi allekirjoitetun PDF:n odotetaan muuttuvan

Kolme laillista tapausta, ja ne kattavat suurimman osan siitä, mitä näet. Toinen allekirjoittaja lisää allekirjoituksensa. Vastaanottaja täyttää lomakekentät, jotka tekijä jätti avoimiksi. Ja pitkän aikavälin validointimateriaalia liitetään: OCSP-vastauksia ja CRL:ejä kirjoitetaan dokumentin suojaussäilöön, jotta allekirjoitus pysyy todennettavana, kun vastaajat ovat poistuneet. Tuo viimeinen ei ainoastaan ole sallittua, se on se, mitä hyvin hoidettu arkisto tekee allekirjoitetuille dokumenteille tahallaan

Niinpä ”tiedosto kasvoi allekirjoituksen jälkeen” ei kanna tietoa. Kysymys on aina se, mitä lisättiin, ja vastauksen on tultava dokumenttitilojen vertailusta eikä tavujen tarkkailusta. Liittämismekaniikka sinänsä käsitellään artikkelissa inkrementaalisesta päivityksestä

Luokittele objektin muodon perusteella, ei sitä tuottaneen polun perusteella

Luokittelija katsoo, mitä objekti on muutoksen jälkeen, ei sitä, mikä kirjastokutsu loi sen. Se on tahallista, koska analyysi ajetaan muiden ohjelmistojen tuottamia tiedostoja vastaan, joissa kutsupolkua ei ole saatavilla tarkasteltavaksi

Neljä muotoa tunnistetaan. Dokumentin suojaussäilö- ja validointiin liittyvät tietuesanakirjat, ristiviittausvirtaobjektit, luettelon metatietomerkintä sekä tavualueen kantavat allekirjoitussanakirjat ovat pitkän aikavälin arkistomateriaalia. Objekti, joka kantaa sekä kenttätyyppiä että kenttäarvoa, on lomakkeen täyttöä. Objekti, jonka tyyppi on annotation tai jonka alatyyppi on yksi ISO 32000-2:n taulukon 168 luetelluista, on annotaatiomuutos. Kaikki muu on luokittelematonta

Päätöspuu, jonka PDFlibPas soveltaa jokaiseen muuttuneeseen PDF-objektiin, lajittelemassa päivitykset arkisto-, lomakkeen täyttö-, annotaatio- tai luokittelemattomille tasoille
Jokainen muuttunut objekti luokitellaan sen perusteella, mitä se on – suojaussäilö, xref-virta, kenttä, annotaatio – ei koskaan sen kutsun perusteella, joka sen tuotti

Poistot käsitellään tiukemmin kuin lisäykset. Poistettu objekti on sallittujen luettelossa vain, kun vanhan puolen objekti oli itsessään arkistomateriaalia, mikä kattaa normaalitapauksen, jossa suojaussäilö korvataan uudemmalla. Jokainen muu poisto on luokittelematon, koska sisällön poistaminen allekirjoitetusta dokumentista ei ole jotain, minkä lupataso valtuuttaa. Dokumenttitason erot ovat vielä tiukempia: sivumäärän muutos menee suoraan luokittelemattomaksi ilman yksittäisten objektien tutkimista, sillä mikään DocMDP-taso ei salli sivujen lisäämistä tai poistamista

Sallittujen luettelo erehtyy kieltämisen suuntaan

Tämä on se suunnittelusääntö, joka hallitsee jokaisen rajatapausten päätöksen. Muutos, joka luokitellaan väärin sallituksi, on allekirjoitus, joka validoituu sisällön yllä, jota tekijä ei koskaan valtuuttanut. Muutos, joka luokitellaan väärin luokittelemattomaksi, on dokumentti, joka liputetaan ja jonka henkilö tarkistaa. Nuo kaksi virhettä eivät ole symmetrisiä, joten sallittujen luettelo pysyy kapeana ja tunnistamattomat muodot putoavat luokittelemattomiin sen sijaan, että niitä arvailtaisiin

Sillä on käytännön seuraus, joka kannattaa ennakoida: epätavallisten tuottajien tiedostot joskus raportoivat luokittelemattomia muutoksia, jotka tarkasteltaessa ovat harmittomia. Oikea vastaus on katsoa löydön yksityiskohtaa ja objektinumeroa sen sijaan, että laajentaisi sallittujen luetteloa, koska luettelo, joka kasvaa vaientaakseen yksittäisiä raportteja, lakkaa olemasta tietoturvaohjaus

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 järjestyksessä mlNone, mlLTAUpdates, mlFormFilling,
    // mlAnnotations, mlUnclassified; hakufunktio palauttaa järjestysluvun
    Level := Pdf.GetModificationLevel;
    // DocMDP:n täytäntöönpano on nyt yksi vertailu politiikkaan
    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;

Kokonaistaso on maksimi kaikista löydöistä, mikä on ainoa puolustettava aggregointi: dokumentti, joka sisältää yhdeksänkymmentäyhdeksän arkistolisäystä ja yhden luokittelemattoman muutoksen, on luokittelematon muutos

Alla: sormenjäljet, ei kryptografisia tiivisteitä

Vertailukone, jonka CompareWith paljastaa ja johon muutosanalyysi rakentuu, tunnistaa objektit niiden normalisoidun rungon sormenjäljestä käyttäen ei-kryptografista 64-bittistä hajautusta SHA-256:n sijaan. Se on harkittu valinta. Mitä rakenteellinen vertailu tarvitsee, on determinismi: saman objektin rungon on aina tuotettava sama sormenjälki yhden ajon sisällä. Sillä ei tarvitse olla törmäysvastusta, koska hyökkääjä, joka hallitsee vertailun molempia puolia, on jo voittanut muilla keinoilla, ja täysimittaisen kryptografisen hajautuksen maksaminen jokaisesta objektista miljoonaobjektisessa dokumentissa on todellinen kustannus ilman hyötyä

Kaksi normalisointisääntöä merkitsee enemmän kuin hajautusvalinta. Epäsuorat viittaukset taituvat paikkamerkkimerkiksi sen sijaan, että ne laajennettaisiin viitattuun sisältöön: laajentaminen kopioisi jaetun objektin rungon jokaiseen viittaajaan, joten yksi pieni muutos jaettuun fonttideskriptoriin mitätöisi jokaisen sitä kohti ulottuvan objektin sormenjäljen, ja raportti olisi lukukelvoton. Ja objektinumerot itsessään suljetaan pois sormenjäljestä, koska uudelleenkirjoitus voi numeroida objektit uudelleen muuttamatta mitään semanttista

Täsmäytys ajetaan sitten kahdessa vaiheessa, kohdistaen ensin sormenjäljen perusteella ja paritellen loput objektinumeron perusteella tunnistaakseen muutokset lisäyksen ja poiston sijaan. Halvat tarkistukset tulevat ensin läpi ajon: sivumääräero raportoidaan ennen kuin mikään objektien läpikäynti alkaa

Kaksivaiheinen PDF-revisioero PDFlibPasissa: ensin sivumäärän tarkistus, 64-bittiset sormenjäljet, sormenjäljen kohdistus ja sitten objektinumeroparitus
Vertailukone sormenjälestää normalisoidut objektien rungot, raportoi ensin sivumääräerot, täsmäyttää sitten sormenjäljen ja objektinumeron perusteella

Ansa: itsensä vertailu ei ole taattu identtiseksi

Luonnollinen ensimmäinen testi erokoneelle on verrata tiedostoa itseensä ja vaatia tuloksen olevan identtinen. Tuo vaatimus ei pidä tässä, ja syy on opettavainen. Julkinen latauspolku ja alemman tason dokumentin latauspolku eivät konfiguroi dekoodausta identtisesti, joten sama tiedosto, ladattuna kahden reitin kautta, voi tuottaa sormenjälkiä, jotka eroavat joissakin objekteissa. Kone ei ole väärässä; kaksi latausta tuotti aidosti erilaiset muistissa olevat tilat

Sen sijaan että pakottaisi kaksi polkua yhteen, vertailusemantiikka ilmaistaan kapeasti: analyysi vertaa nykyistä dokumenttitilaa aiempaan revisioon ja raportoi identtiseksi vain, kun kaksi sormenjälkijoukkoa osuvat yhteen täsmälleen. Se on se kysymys, jonka käyttäjät todella esittävät, eikä se vaadi, että kaksi lataajaa olisivat vaihdettavissa. Kun suunnittelet vertailuominaisuutta, sen määritteleminen, mitä ”sama” tarkoittaa, on suurempi osa työtä kuin sen laskeminen

Missä sitä käyttää

Kaksi paikkaa. Validointiraportissa allekirjoitustarkistuksen rinnalla, joten tarkastaja näkee paitsi, onko allekirjoitus kryptografisesti ehjä, myös sen, mitä dokumentille tapahtui sen jälkeen; allekirjoituspuoli käsitellään artikkelissa PAdES-allekirjoitus ja validointi. Ja sisääntuloportissa, jossa ulkopuolelta saapuva dokumentti tarkistetaan lähettämääsi kopiota vastaan, joten palautettu sopimus, jossa on lisätty annotaatio, käsitellään eri tavalla kuin sellainen, jossa sivua on muokattu

Yksi huomautus laajuudesta. Tämä analyysi kertoo, mitä muuttui saman dokumenttilinjan kahden revision välillä. Se ei kerro, onko näkyvä sisältö harhaanjohtavaa, vastaako lomakekentän ulkoasuvirta arvoaan vai onko peitteen alle piilotettu teksti yhä sisältövirrassa. Nuo tarvitsevat erillisen käsittelyn, ja sisällön poiston puoli käsitellään artikkelissa aidosta redaktiosta. Analyysin ja vertailun sisääntulopisteet on dokumentoitu losLab PDF Developer Library -tuotesivulla