Odborný článok

Šifrovanie PDF 2.0 AES-GCM v Delphi: ISO/TS 32003

PDFiumPas zapisuje šifrovanie ISO/TS 32003 cez SaveAsEncrypted: nastavte Revision na erR7 a každý reťazec aj tok je chránený pomocou AES-256 v režime GCM, autentizovanej šifry, ktorú PDF 2.0 získalo v roku 2023. Nastavte aj EnableIntegrityProtection a dokument bude niesť aj samostatný token PDF MAC, ktorý na strane čítania kontroluje ValidatePdfMac

Ide o dve rôzne ochrany, ktoré si ľudia bežne zamieňajú. GCM autentizuje každú zašifrovanú hodnotu. MAC autentizuje dokument ako celok. Chcete oboje, z rôznych dôvodov

Čo pridáva GCM, čo CBC nikdy neposkytovalo?

Autentizáciu šifrovaného textu. AES-256 v režime CBC, schéma AESV3 v ISO 32000-2, udržiava obsah dôverný a nehovorí nič o tom, či dorazil bez zmeny. CBC je tvárny (malleable) konkrétnymi, dobre preskúmanými spôsobmi: útočník, ktorý dokáže preklopiť bity v šifrovanom texte, vyprodukuje predvídateľné zmeny v plaintexte nasledujúceho bloku, a formát si toho vôbec nevšimne

GCM toto zatvára. Každá zašifrovaná hodnota nesie 16-bajtovú autentizačnú značku, serializovanú v plnom rozsahu tak, ako to vyžaduje ISO/TS 32003, a dešifrovanie zlyhá namiesto toho, aby vrátilo pozmenený plaintext, keď sa značka nezhoduje. V terminológii PDF je upravený reťazec alebo tok v dokumente AESV4 tvrdou chybou v mieste použitia, nie zvláštnou hodnotou, ktorá sa rozšíri do vašej aplikácie. Slovník Encrypt toto označuje pomocou /CFM /AESV4 a V 6 / R 7, spolu s položkou rozšírení deklarujúcou /ExtensionLevel 32003 a /ExtensionRevision (:2023)

Tri revízie, tri ekosystémy

TPdfEncryptionRevision ponúka erR5, erR6 a erR7, a voľba je skôr rozhodnutím o kompatibilite než kryptografickým rozhodnutím. R5 je pôvodná schéma AES-256 publikovaná ako rozšírenie PDF 1.7, s jediným hashom hesla SHA-256, a otvorí sa v podstate v čomkoľvek z posledných pätnástich rokov. R6 je zosilnené odvodzovanie kľúča štandardizované v ISO 32000-2, používajúce iterujúcu konštrukciu SHA-256/384/512 z algoritmu 2.B, a je to to, čo očakáva súčasný workflow PDF 2.0 alebo PDF/A-4. R7 je ISO/TS 32003, používajúce to isté odvodzovanie 2.B s AES-GCM ako šifrou

Podpora čítačiek beží presne v tomto poradí, a podpora R7 je mimo súčasných hlavných čítačiek stále slabá. Ide o rovnaký kompromis, ktorý riadi každú funkciu PDF 2.0: najnovšia možnosť je najlepšia inžiniersky a má najužšie publikum. Rozhodujte podľa toho, kto musí súbor otvoriť, a ak je odpoveďou „systém záznamov, ktorý nikto neaktualizoval od roku 2019“, odpoveďou je R5 bez ohľadu na to, čo preferuje bezpečnostná 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;   // samostatný token PDF MAC

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

Prečo MAC dokumentu navrch autentizovanej šifry?

Pretože značky GCM chránia hodnoty, nie usporiadanie hodnôt. Každý reťazec a tok v dokumente AESV4 je individuálne autentizovaný, no tabuľka krížových odkazov, číslovanie objektov a trailer sú štruktúra, nie zašifrovaný obsah. Útočník nedokáže sfalšovať tok, no nič v samotnej šifre mu nebráni prerozdeliť, na ktoré objekty dokument ukazuje, alebo naspájať objekty zo skoršej revízie toho istého súboru

Túto vrstvu rieši samostatný token PDF MAC. PDFiumPas ho odvodzuje z kľúča šifrovania súboru pomocou vyhradenej 32-bajtovej /KDFSalt zaznamenanej v slovníku Encrypt, takže práve vlastníctvo hesla umožňuje čítačke token potvrdiť. Výsledkom je jedna odpoveď na jednu otázku: je tento dokument ako celok tým dokumentom, ktorý bol zapísaný

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 tomto súbore nie je token
      pmvsInvalid:     Quarantine(Mac.MessageText);   // upravený alebo skrátený
      pmvsUnsupported: RouteForManualReview(Mac.MessageText);
    end;
  finally
    Pdf.Free;
  end;
end;

Štyri stavové hodnoty si vyžadujú štyri rôzne odpovede, a ich zbalenie do jednej boolovskej hodnoty stratí rozlíšenie, na ktorom záleží. pmvsNotPresent znamená, že súbor jednoducho nemá žiadny token, čo opisuje takmer každý zašifrovaný PDF napísaný pred rokom 2024 a nie je to dôkaz ničoho. pmvsInvalid znamená, že token je prítomný a neoveruje sa, čo je skutočné zistenie a malo by zastaviť spracovanie. pmvsUnsupported znamená, že token existuje v tvare, ktorý táto verzia neimplementuje, čo je medzera v kompatibilite, nie útok. Zaobchádzanie s „neprítomný“ ako s „neplatný“ by v prvý deň dalo do karantény celý váš existujúci katalóg

Čo šifrovanie stále nerobí

Príznaky oprávnení zostávajú tým, čím vždy boli: žiadosťou voči vyhovujúcemu softvéru, nie kontrolou. Bity /P z tabuľky 22 v ISO 32000-1, ktoré zakazujú tlač alebo extrakciu, rešpektujú slušne sa správajúce čítačky a ignoruje ich všetko ostatné, a ktokoľvek, kto drží používateľské heslo, už drží dešifrovaný obsah. Šifrovanie je hranica; oprávnenia opisujú zámer vnútri nej

Oplatí sa naplánovať dva prevádzkové detaily. Po prvé, šifrovanie a neskoršia úprava sa vzájomne ovplyvňujú: pripojenie inkrementálnej aktualizácie k zašifrovanému dokumentu má vlastné pravidlá, opísané v článku inkrementálne aktualizácie na zašifrovaných PDF, a token MAC je tvrdenie na úrovni dokumentu, ktoré neopatrné pripojenie znehodnotí. Po druhé, konštrukcia GCM používa deterministické počítadlo IV, a PDFiumPas vyvolá výnimku namiesto opätovného použitia hodnoty počítadla, ak by sa tento priestor niekedy vyčerpal, pretože opätovné použitie nonce v GCM je katastrofické spôsobom, aký by ticho pretečenie skrylo

Voľba medzi tromi revíziami v praxi

Napíšte si, kto súbor otvára, a potom vyberte. Pri internej distribúcii, kde je každý čítateľ aktuálnou čítačkou pod vašou kontrolou, je R7 s ochranou integrity najsilnejšou dostupnou možnosťou a niet dôvodu ju nepoužiť. Pri dokumentoch opúšťajúcich organizáciu je R6 obhájiteľnou predvoľbou: je štandardizovaná v ISO 32000-2, a nie v technickej špecifikácii navrchu nej, a podpora je široká. Pri archívoch a starších čítačkách je R5 jedinou voľbou, ktorá sa spoľahlivo otvorí, a mali by ste si zaznamenať prečo na to isté miesto, kde zaznamenávate zvyšok svojej politiky uchovávania

Nech si vyberiete ktorúkoľvek, overte výstup namiesto toho, aby ste dôverovali, že volanie uspelo. Znovu otvorte zašifrovaný súbor, skontrolujte ValidatePdfMac, a potvrďte, že deklarovaná verzia je taká, akú očakávate, pomocou kontrol zhody verzie v článku presná zhoda verzie PDF. Širší kontrolný zoznam pre nedôveryhodné dokumenty je v článku audit bezpečnostných rizík PDF

PDFiumPas je komponent pre Delphi a Lazarus postavený nad enginom PDFium so zásobníkom šifrovania PDF 2.0 implementovaným natívne v Pascale, takže AES-256, GCM aj token MAC nepotrebujú žiadne externé kryptografické DLL. API pre šifrovanie je zdokumentované na stránke PDFium Delphi component