Tekninen artikkeli

PDF 2.0 AES-GCM-salaus Delphissä: ISO/TS 32003

PDFiumPas kirjoittaa ISO/TS 32003 -salauksen SaveAsEncrypted-metodin kautta: aseta Revision-arvoksi erR7, ja jokainen merkkijono ja virta suojataan AES-256:lla GCM-tilassa, todennetulla salausalgoritmilla, jonka PDF 2.0 sai vuonna 2023. Aseta myös EnableIntegrityProtection, niin asiakirja kantaa myös itsenäisen PDF MAC -tunnuksen, jonka ValidatePdfMac tarkistaa lukupuolella

Nämä ovat kaksi eri suojausta, jotka sekoitetaan rutiininomaisesti toisiinsa. GCM todentaa jokaisen salatun arvon. MAC todentaa asiakirjan kokonaisuutena. Haluat molemmat, eri syistä

Mitä GCM tuo, mitä CBC ei koskaan tarjonnut?

Salatekstin todennuksen. AES-256 CBC-tilassa, ISO 32000-2:n AESV3-järjestelmä, pitää sisällön luottamuksellisena eikä kerro mitään siitä, saapuiko se muokkaamattomana. CBC on taipuisa tietyillä hyvin tutkituilla tavoilla: hyökkääjä, joka voi kääntää bittejä salatekstissä, tuottaa ennustettavia muutoksia seuraavan lohkon selkotekstiin, eikä mikään formaatissa huomaa sitä

GCM sulkee tämän aukon. Jokainen salattu arvo kantaa 16 tavun todennustunnisteen, joka on serialisoitu kokonaisuudessaan ISO/TS 32003:n vaatimalla tavalla, ja purku epäonnistuu sen sijaan, että se palauttaisi muutetun selkotekstin, kun tunniste ei täsmää. PDF-termein peukaloitu merkkijono tai virta AESV4-asiakirjassa on kova virhe käyttöhetkellä, ei outo arvo, joka leviää sovellukseesi. Encrypt-sanakirja merkitsee tämän arvoilla /CFM /AESV4 ja V 6 / R 7, yhdessä laajennusmerkinnän kanssa, joka ilmoittaa /ExtensionLevel 32003 ja /ExtensionRevision (:2023)

Kolme revisiota, kolme ekosysteemiä

TPdfEncryptionRevision tarjoaa arvot erR5, erR6 ja erR7, ja valinta on enemmän yhteensopivuuspäätös kuin kryptografinen päätös. R5 on alkuperäinen AES-256-järjestelmä, joka julkaistiin PDF 1.7 -laajennuksena, yhdellä SHA-256-salasanatiivisteellä, ja se avautuu käytännössä missä tahansa viimeisen viidentoista vuoden aikaisessa sovelluksessa. R6 on ISO 32000-2:ssa standardoitu vahvistettu avaimenjohto, joka käyttää algoritmin 2.B iteroivaa SHA-256/384/512-rakennetta, ja se on se, mitä nykyinen PDF 2.0- tai PDF/A-4-työnkulku odottaa. R7 on ISO/TS 32003, joka käyttää samaa 2.B-johtoa AES-GCM:llä salausalgoritmina

Lukijatuki noudattaa täsmälleen tätä järjestystä, ja R7-tuki on yhä ohutta nykyisten valtavirran katseluohjelmien ulkopuolella. Tämä on sama kompromissi, joka hallitsee mitä tahansa PDF 2.0 -ominaisuutta: uusin vaihtoehto on paras tekninen toteutus ja kapein yleisö. Päätä sen mukaan, kenen on avattava tiedosto, ja jos vastaus on "arkistojärjestelmä, jota kukaan ei ole päivittänyt vuoden 2019 jälkeen", vastaus on R5 riippumatta siitä, mitä tietoturvakäytäntö suosii

uses
  PDFium, FPdfEncrypt;

var
  Pdf: TPdf;
  Opts: TPdfEncryptOptions;
begin
  Pdf := TPdf.Create(nil);
  try
    Pdf.FileName := 'quarterly-report.pdf';
    Pdf.LoadDocument;

    Opts := TPdfEncryptOptions.Default;
    Opts.UserPassword := 'open-secret';
    Opts.OwnerPassword := 'admin-secret';
    Opts.EncryptMetadata := True;
    Opts.Revision := erR7;                    // ISO/TS 32003 AESV4-GCM
    Opts.EnableIntegrityProtection := True;   // itsenäinen PDF MAC -tunnus

    if not Pdf.SaveAsEncrypted('quarterly-report.enc.pdf', Opts) then
      raise Exception.Create('Encrypted save failed');
  finally
    Pdf.Free;
  end;
end;

Miksi asiakirjan MAC todennetun salausalgoritmin päälle?

Koska GCM-tunnisteet suojaavat arvot, eivät arvojen järjestystä. Jokainen merkkijono ja virta AESV4-asiakirjassa todennetaan erikseen, mutta ristiviitetaulukko, objektinumerointi ja trailer ovat rakennetta, ei salattua sisältöä. Hyökkääjä ei voi väärentää virtaa, mutta mikään pelkässä salausalgoritmissa ei estä häntä järjestämästä uudelleen, mihin objekteihin asiakirja osoittaa, tai liittämästä objekteja saman tiedoston aiemmasta versiosta

Itsenäinen PDF MAC -tunnus vastaa tähän kerrokseen. PDFiumPas johtaa sen tiedoston salausavaimesta omistetulla 32 tavun /KDFSalt-arvolla, joka on tallennettu Encrypt-sanakirjaan, joten salasanan hallussapito on se, mikä antaa lukijan vahvistaa tunnuksen. Tulos on yksi vastaus yhteen kysymykseen: onko tämä asiakirja kokonaisuudessaan se asiakirja, joka kirjoitettiin

var
  Pdf: TPdf;
  Mac: TPdfMacValidationResult;
begin
  Pdf := TPdf.Create(nil);
  try
    Pdf.Password := 'open-secret';
    Pdf.FileName := 'quarterly-report.enc.pdf';
    Pdf.LoadDocument;

    Mac := Pdf.ValidatePdfMac('open-secret');
    case Mac.Status of
      pmvsValid:       ProcessDocument(Pdf);
      pmvsNotPresent:  ProcessWithWarning(Pdf);       // ei tunnusta tässä tiedostossa
      pmvsInvalid:     Quarantine(Mac.MessageText);   // peukaloitu tai katkaistu
      pmvsUnsupported: RouteForManualReview(Mac.MessageText);
    end;
  finally
    Pdf.Free;
  end;
end;

Neljä tilaarvoa vaativat neljä erilaista vastausta, ja niiden supistaminen totuusarvoksi hävittää eron, jolla on merkitystä. pmvsNotPresent tarkoittaa, että tiedostossa ei yksinkertaisesti ole tunnusta, mikä kuvaa lähes jokaista ennen vuotta 2024 kirjoitettua salattua PDF-tiedostoa eikä ole todiste mistään. pmvsInvalid tarkoittaa, että tunnus on läsnä eikä varmennu, mikä on aito havainto ja pitäisi pysäyttää käsittely. pmvsUnsupported tarkoittaa, että tunnus on olemassa muodossa, jota tämä versio ei toteuta, mikä on yhteensopivuusaukko, ei hyökkäys. Sen käsitteleminen, että "ei läsnä" tarkoittaisi "virheellistä", laittaisi koko takakatalogisi karanteeniin ensimmäisenä päivänä

Mitä salaus ei vieläkään tee

Käyttöoikeusliput pysyvät sinä, mitä ne aina ovat olleet: pyyntö sääntöjä noudattavalle ohjelmistolle, ei hallintakeino. ISO 32000-1:n taulukon 22 /P-bitit, jotka kieltävät tulostuksen tai poiminnan, huomioidaan hyvin käyttäytyvissä katseluohjelmissa ja jätetään huomiotta kaikkialla muualla, ja kuka tahansa, jolla on user password, hallitsee jo puretun sisällön. Salaus on raja; käyttöoikeudet kuvaavat aikomusta sen sisällä

Kaksi operatiivista yksityiskohtaa kannattaa suunnitella etukäteen. Ensiksi, salaus ja myöhempi muokkaus vaikuttavat toisiinsa: inkrementaalisen päivityksen liittäminen salattuun asiakirjaan noudattaa omia sääntöjään, jotka käsitellään artikkelissa inkrementaaliset päivitykset salatuissa PDF-tiedostoissa, ja MAC-tunnus on asiakirjatason lausunto, jonka huolimaton liittäminen mitätöi. Toiseksi, GCM-rakenne käyttää deterministista IV-laskuria, ja PDFiumPas nostaa poikkeuksen sen sijaan, että se käyttäisi laskuriarvoa uudelleen, jos tuo tila joskus loppuisi, koska nonce-arvon uudelleenkäyttö GCM:ssä on katastrofaalista tavalla, jonka hiljainen ylivuoto peittäisi

Kolmen revision välillä valitseminen käytännössä

Kirjaa ylös, kuka avaa tiedoston, ja valitse sen mukaan. Sisäiseen jakeluun, jossa jokainen lukija on hallitsemasi nykyinen katseluohjelma, R7 eheyssuojauksella on vahvin saatavilla oleva vaihtoehto, eikä ole syytä olla käyttämättä sitä. Organisaatiosta lähteville asiakirjoille R6 on puolustettava oletus: se on standardoitu ISO 32000-2:ssa eikä sen päälle rakennetussa teknisessä spesifikaatiossa, ja tuki on laaja. Arkistoille ja vanhoille vastaanottajille R5 on ainoa vaihtoehto, joka luotettavasti avautuu, ja syy kannattaa kirjata samaan paikkaan kuin loput säilytyskäytännöstäsi

Kumman tahansa valitsetkin, varmenna tuloste sen sijaan, että luottaisit kutsun onnistuneen. Avaa salattu tiedosto uudelleen, tarkista ValidatePdfMac, ja vahvista, että ilmoitettu versio on se, mitä odotat, käyttäen versioyhteensopivuustarkistuksia artikkelissa tarkka PDF-version yhteensopivuus. Laajempi vastaanottotarkistuslista epäluotettaville asiakirjoille löytyy artikkelista PDF-tietoturvariskien auditointi

PDFiumPas on Delphi- ja Lazarus-komponentti PDFium-moottorin ympärillä, jossa PDF 2.0 -salauspino on toteutettu natiivisti Pascalissa, joten AES-256, GCM ja MAC-tunnus eivät tarvitse ulkoista salaus-DLL:ää. Salaus-API on dokumentoitu sivulla PDFium Delphi component page