Technický článek

Šifrování PDF 2.0 AES-GCM v Delphi: ISO/TS 32003

PDFiumPas zapisuje šifrování ISO/TS 32003 přes SaveAsEncrypted: nastavte Revision na erR7 a každý řetězec i proud se chrání pomocí AES-256 v režimu GCM, autentizované šifry, kterou PDF 2.0 získalo v roce 2023. Nastavte navíc EnableIntegrityProtection a dokument ponese i samostatný token PDF MAC, který na straně čtení kontroluje ValidatePdfMac

Jde o dvě různé ochrany, které lidé běžně zaměňují. GCM autentizuje každou zašifrovanou hodnotu. MAC autentizuje dokument jako celek. Chcete obojí, z různých důvodů

Co GCM přidává, co CBC nikdy neposkytovalo?

Autentizaci šifrovaného textu. AES-256 v režimu CBC, schéma AESV3 v ISO 32000-2, drží obsah důvěrný a neříká vůbec nic o tom, jestli dorazil nepozměněný. CBC je tvárné konkrétními, dobře prostudovanými způsoby: útočník, který dokáže otočit bity v šifrovaném textu, vyprodukuje předvídatelné změny v otevřeném textu následujícího bloku, a ve formátu si toho nic nevšimne

GCM tuto mezeru uzavírá. Každá zašifrovaná hodnota nese 16bajtový autentizační tag, serializovaný v plné podobě, jak vyžaduje ISO/TS 32003, a dekódování při neshodě tagu selže, místo aby vrátilo pozměněný otevřený text. V pojmech PDF je pozměněný řetězec nebo proud v dokumentu AESV4 tvrdou chybou v místě použití, ne podivnou hodnotou, která se prošíří do vaší aplikace. Slovník Encrypt to označuje pomocí /CFM /AESV4 a V 6 / R 7, spolu s položkou rozšíření deklarující /ExtensionLevel 32003 a /ExtensionRevision (:2023)

Tři revize, tři ekosystémy

TPdfEncryptionRevision nabízí erR5, erR6 a erR7, a tato volba je spíš rozhodnutím o kompatibilitě než kryptografickým rozhodnutím. R5 je původní schéma AES-256 publikované jako rozšíření PDF 1.7, s jediným hashem hesla SHA-256, a otevře se prakticky ve všem za posledních patnáct let. R6 je zesílené odvození klíče standardizované v ISO 32000-2, používající iterující konstrukci SHA-256/384/512 podle algoritmu 2.B, a je to to, co očekává aktuální workflow PDF 2.0 nebo PDF/A-4. R7 je ISO/TS 32003, používající stejné odvození 2.B, ale s AES-GCM jako šifrou

Podpora ve čtečkách jde přesně v tomto pořadí a podpora R7 je mimo aktuální hlavní prohlížečky pořád slabá. Jde o stejný kompromis, který řídí každou funkci PDF 2.0: nejnovější volba je nejlepší inženýrství a nejužší publikum. Rozhodujte podle toho, kdo bude muset soubor otevřít, a pokud je odpovědí „systém záznamů, který nikdo neaktualizoval od roku 2019", odpovědí je R5 bez ohledu na to, co 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;

Proč dokumentový MAC navrch autentizované šifry?

Protože tagy GCM chrání hodnoty, ne uspořádání těchto hodnot. Každý řetězec a proud v dokumentu AESV4 je autentizovaný samostatně, ale tabulka křížových odkazů, číslování objektů a trailer jsou struktura, ne šifrovaný obsah. Útočník nemůže padělat proud, ale nic v samotné šifře mu nebrání přeuspořádat, na které objekty dokument ukazuje, nebo vsunout objekty ze starší revize téhož souboru

Samostatný token PDF MAC řeší právě tuto vrstvu. PDFiumPas ho odvozuje z klíče šifrování souboru pomocí dedikované 32bajtové /KDFSalt zaznamenané ve slovníku Encrypt, takže právě držení hesla umožňuje čtečce token potvrdit. Výsledkem je jediná odpověď na jedinou otázku: je tento dokument jako celek tím dokumentem, který byl napsán

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 souboru není token
      pmvsInvalid:     Quarantine(Mac.MessageText);   // pozměněný nebo zkrácený
      pmvsUnsupported: RouteForManualReview(Mac.MessageText);
    end;
  finally
    Pdf.Free;
  end;
end;

Čtyři stavové hodnoty vyžadují čtyři různé reakce, a jejich sloučení do jedné booleovské hodnoty ztrácí rozlišení, na kterém záleží. pmvsNotPresent znamená, že soubor prostě nemá token, což popisuje téměř každé šifrované PDF napsané před rokem 2024 a není to důkaz ničeho. pmvsInvalid znamená, že token je přítomen a neověří se, což je skutečné zjištění a mělo by zastavit zpracování. pmvsUnsupported znamená, že token existuje v podobě, kterou tato verze neimplementuje, což je mezera v kompatibilitě, ne útok. Zacházet s „nepřítomný" jako s „neplatný" by hned první den poslalo do karantény celý váš archiv

Co šifrování pořád nedělá

Příznaky oprávnění zůstávají tím, čím vždycky byly: žádostí vůči vyhovujícímu softwaru, ne kontrolou. Bity /P z tabulky 22 v ISO 32000-1, které zakazují tisk nebo extrakci, respektují slušně se chovající prohlížečky a všechno ostatní je ignoruje, a kdokoli drží uživatelské heslo, už drží dekódovaný obsah. Šifrování je hranice; oprávnění popisují záměr uvnitř ní

Stojí za to naplánovat dva provozní detaily. Zaprvé, šifrování a pozdější úprava spolu interagují: připojení přírůstkové aktualizace k šifrovanému dokumentu má vlastní pravidla, popsaná v článku o přírůstkových aktualizacích na šifrovaných PDF, a token MAC je tvrzení na úrovni dokumentu, které neopatrné připojení zneplatní. Zadruhé, konstrukce GCM používá deterministický čítač IV, a PDFiumPas vyvolá výjimku, místo aby hodnotu čítače znovu použil, kdyby tento prostor byl někdy vyčerpán, protože opakované použití nonce v GCM je katastrofické způsobem, jaký by tiché přetečení skrylo

Volba mezi třemi revizemi v praxi

Nejdřív si zapište, kdo bude soubor otevírat, pak vybírejte. Pro interní distribuci, kde je každý čtenář aktuální prohlížečka pod vaší kontrolou, je R7 s ochranou integrity nejsilnější dostupnou volbou a není důvod ji nepoužít. U dokumentů opouštějících organizaci je R6 obhajitelnou výchozí volbou: je standardizovaná v ISO 32000-2, ne v technické specifikaci navrch, a podpora je široká. Pro archivy a starší spotřebitele je R5 jediná volba, která se spolehlivě otevře, a měli byste zapsat proč na stejné místo, kde zaznamenáváte zbytek své retenční politiky

Ať zvolíte cokoli, výstup ověřte, místo abyste jen důvěřovali, že volání uspělo. Znovu otevřete šifrovaný soubor, zkontrolujte ValidatePdfMac a potvrďte, že deklarovaná verze je taková, jakou očekáváte, pomocí kontrol shody verze z článku o přesné shodě verze PDF. Širší kontrolní seznam pro nedůvěryhodné dokumenty na vstupu je v článku o auditu bezpečnostních rizik PDF

PDFiumPas je komponenta pro Delphi a Lazarus postavená kolem enginu PDFium se šifrovacím zásobníkem PDF 2.0 implementovaným nativně v Pascalu, takže AES-256, GCM a token MAC nepotřebují žádnou externí kryptografickou DLL. API pro šifrování je zdokumentované na stránce PDFium Delphi component