Tehnični članak

AES-GCM šifriranje PDF 2.0 v Delphiju: ISO/TS 32003

PDFiumPas zapiše šifriranje ISO/TS 32003 prek SaveAsEncrypted: nastavite Revision na erR7 in vsak niz ter tok je zaščiten z AES-256 v načinu GCM, avtenticirano šifro, ki jo je PDF 2.0 dobil leta 2023. Nastavite še EnableIntegrityProtection in dokument dodatno nosi samostojni žeton PDF MAC, ki ga na bralni strani preveri ValidatePdfMac

To sta dve različni zaščiti, ki ju ljudje redno mešajo. GCM avtenticira vsako šifrirano vrednost. MAC avtenticira dokument kot celoto. Želite oboje, iz različnih razlogov

Kaj doda GCM, česar CBC ni nikoli zagotavljal?

Avtentikacijo šifriranega besedila. AES-256 v načinu CBC, shema AESV3 v ISO 32000-2, ohranja vsebino zaupno in ne pove ničesar o tem, ali je prispela nespremenjena. CBC je gnetljiv na specifične, dobro raziskane načine: napadalec, ki lahko preobrne bite v šifriranem besedilu, ustvari predvidljive spremembe v navadnem besedilu naslednjega bloka, format pa tega ne opazi

GCM to zapre. Vsaka šifrirana vrednost nosi 16-bajtno avtentikacijsko oznako, v celoti serializirano, kot zahteva ISO/TS 32003, dešifriranje pa odpove namesto da bi vrnilo spremenjeno navadno besedilo, kadar se oznaka ne ujema. V izrazoslovju PDF je spremenjen niz ali tok v dokumentu AESV4 trda napaka ob mestu uporabe, ne čuden podatek, ki se širi v vašo aplikacijo. Slovar Encrypt to označi z /CFM /AESV4 in V 6 / R 7, poleg vnosa razširitev, ki deklarira /ExtensionLevel 32003 in /ExtensionRevision (:2023)

Tri revizije, trije ekosistemi

TPdfEncryptionRevision ponuja erR5, erR6 in erR7, izbira pa je bolj odločitev o združljivosti kot kriptografska odločitev. R5 je izvirna shema AES-256, objavljena kot razširitev za PDF 1.7, z eno samo razpršitvijo gesla SHA-256, in se odpre v praktično vsem iz zadnjih petnajstih let. R6 je utrjena izpeljava ključa, standardizirana v ISO 32000-2, ki uporablja iterirano konstrukcijo SHA-256/384/512 algoritma 2.B, in je tisto, kar pričakuje trenuten delovni tok PDF 2.0 ali PDF/A-4. R7 je ISO/TS 32003, ki uporablja isto izpeljavo 2.B z AES-GCM kot šifro

Podpora bralnikov teče natanko v tem vrstnem redu, podpora za R7 pa je zunaj trenutnih glavnih pregledovalnikov še vedno tanka. To je isti kompromis, ki upravlja katero koli funkcijo PDF 2.0: najnovejša možnost je najboljši inženiring in najožje občinstvo. Odločite se glede na to, kdo mora odpreti datoteko, in če je ta odgovor "sistem za arhiviranje, ki ga nihče ni posodobil od leta 2019", je odgovor R5 ne glede na to, kaj si želi varnostna politika

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;   // samostojni žeton PDF MAC

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

Zakaj MAC dokumenta poleg avtenticirane šifre?

Ker oznake GCM ščitijo vrednosti, ne razporeditve vrednosti. Vsak niz in tok v dokumentu AESV4 je posamično avtenticiran, vendar tabela navzkrižnih sklicev, oštevilčenje objektov in zaključek so struktura in ne šifrirana vsebina. Napadalec ne more ponarediti toka, a nič v sami šifri ga ne ustavi pri preurejanju, na katere objekte dokument kaže, ali spajanju objektov iz prejšnje revizije iste datoteke

Samostojni žeton PDF MAC naslavlja to plast. PDFiumPas ga izpelje iz ključa šifriranja datoteke z namensko 32-bajtno /KDFSalt, zabeleženo v slovarju Encrypt, tako da posest gesla omogoči bralniku, da potrdi žeton. Rezultat je en sam odgovor na eno vprašanje: ali je ta dokument kot celota dokument, ki je bil zapisan

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);       // v tej datoteki ni žetona
      pmvsInvalid:     Quarantine(Mac.MessageText);   // spremenjen ali okrnjen
      pmvsUnsupported: RouteForManualReview(Mac.MessageText);
    end;
  finally
    Pdf.Free;
  end;
end;

Štiri statusne vrednosti zahtevajo štiri različne odzive, njihovo strnjenje v logično vrednost pa izgubi razliko, ki šteje. pmvsNotPresent pomeni, da datoteka preprosto nima žetona, kar opisuje skoraj vsak šifriran PDF, napisan pred letom 2024, in ni dokaz ničesar. pmvsInvalid pomeni, da je žeton prisoten in se ne preveri, kar je pristna ugotovitev in bi moralo ustaviti obdelavo. pmvsUnsupported pomeni, da žeton obstaja v obliki, ki je ta gradnja ne izvaja, kar je vrzel v združljivosti in ne napad. Obravnava "ni prisoten" kot "neveljaven" bi karantenirala vaš celoten obstoječi arhiv že prvi dan

Kaj šifriranje še vedno ne naredi

Zastavice dovoljenj ostajajo to, kar so vedno bile: zahteva do skladne programske opreme in ne nadzor. Biti /P iz Tabele 22 standarda ISO 32000-1, ki prepovedujejo tiskanje ali pridobivanje, spoštujejo dobro obnašani pregledovalniki, vse drugo pa jih ignorira, kdor koli pa že poseduje uporabniško geslo, že poseduje dešifrirano vsebino. Šifriranje je meja; dovoljenja opisujejo namen znotraj nje

Vredno je načrtovati za dve operativni podrobnosti. Prvič, šifriranje in poznejše spreminjanje se prepletata: dodajanje prirastne posodobitve k šifriranemu dokumentu ima svoja pravila, obravnavana v prirastnih posodobitvah na šifriranih PDF datotekah, žeton MAC pa je izjava na ravni dokumenta, ki jo malomaren dodatek razveljavi. Drugič, konstrukcija GCM uporablja deterministični števec IV, PDFiumPas pa sproži izjemo namesto da bi ponovno uporabil vrednost števca, če bi bil ta prostor kadar koli izčrpan, ker je ponovna uporaba nonce v GCM katastrofalna na način, ki bi ga tiho prekoračenje skrilo

Izbira med tremi revizijami v praksi

Zapišite, kdo odpira datoteko, nato izberite. Za interno distribucijo, kjer je vsak bralnik trenuten pregledovalnik pod vašim nadzorom, je R7 z zaščito celovitosti najmočnejša razpoložljiva možnost in ni razloga, da je ne bi uporabili. Za dokumente, ki zapuščajo organizacijo, je R6 razumljiva privzeta izbira: standardizirana je v ISO 32000-2 in ne v tehnični specifikaciji nad njo, podpora pa je široka. Za arhive in podedovane odjemalce je R5 edina izbira, ki se zanesljivo odpre, razlog pa velja zabeležiti na istem mestu, kjer beležite preostanek svoje politike hrambe

Katero koli izberete, preverite izhod namesto da bi zaupali, da je klic uspel. Znova odprite šifrirano datoteko, preverite ValidatePdfMac in potrdite, da je deklarirana različica tista, ki jo pričakujete, z uporabo preverjanj skladnosti različic v natančni skladnosti različice PDF. Širši kontrolni seznam za nezaupljive dokumente je v reviziji varnostnih tveganj PDF

PDFiumPas je komponenta za Delphi in Lazarus okoli pogona PDFium, s skladom šifriranja PDF 2.0, izvedenim izvorno v Pascalu, tako da AES-256, GCM in žeton MAC ne potrebujejo zunanjega DLL za kriptografijo. API za šifriranje je dokumentiran na strani izdelka PDFium