PDFiumPas skriver ISO/TS 32003-kryptering genom SaveAsEncrypted: sätt Revision till erR7 och varje sträng och ström skyddas med AES-256 i GCM-läge, det autentiserade chiffer PDF 2.0 fick 2023. Sätt även EnableIntegrityProtection och dokumentet bär också ett fristående PDF MAC-token, som ValidatePdfMac kontrollerar på läsningssidan
Det är två olika skydd som folk rutinmässigt blandar ihop. GCM autentiserar varje krypterat värde. MAC:en autentiserar dokumentet som helhet. Du vill ha båda, av olika skäl
Vad tillför GCM som CBC aldrig gav?
Autentisering av chiffertexten. AES-256 i CBC-läge, AESV3-schemat i ISO 32000-2, håller innehållet konfidentiellt och säger ingenting om huruvida det anlände omodifierat. CBC är formbart på specifika, väl studerade sätt: en angripare som kan vända bitar i chiffertexten producerar förutsägbara förändringar i klartexten för det följande blocket, och ingenting i formatet märker det
GCM stänger den luckan. Varje krypterat värde bär en 16-byte-lång autentiseringstagg, fullständigt serialiserad enligt ISO/TS 32003:s krav, och dekryptering misslyckas i stället för att returnera ändrad klartext när taggen inte matchar. I PDF-termer är en manipulerad sträng eller ström i ett AESV4-dokument ett hårt fel vid användningstillfället, inte ett märkligt värde som sprider sig in i din applikation. Encrypt-ordboken markerar detta med /CFM /AESV4 och V 6 / R 7, tillsammans med en extensions-post som deklarerar /ExtensionLevel 32003 och /ExtensionRevision (:2023)
Tre revisioner, tre ekosystem
TPdfEncryptionRevision erbjuder erR5, erR6 och erR7, och valet är mer ett kompatibilitetsbeslut än ett kryptografiskt sådant. R5 är det ursprungliga AES-256-schemat publicerat som en PDF 1.7-utökning, med en enda SHA-256-lösenordshash, och det öppnas i i princip allt från de senaste femton åren. R6 är den härdade nyckelhärledningen standardiserad i ISO 32000-2, som använder den itererande SHA-256/384/512-konstruktionen i algoritm 2.B, och det är vad ett aktuellt PDF 2.0- eller PDF/A-4-arbetsflöde förväntar sig. R7 är ISO/TS 32003, som använder samma 2.B-härledning med AES-GCM som chiffer
Läsarstödet löper i exakt den ordningen, och R7-stödet är fortfarande tunt utanför aktuella mainstream-visare. Det här är samma avvägning som styr varje PDF 2.0-funktion: det nyaste alternativet är den bästa tekniken och den smalaste publiken. Bestäm utifrån vem som måste öppna filen, och om det svaret är ”ett arkivsystem ingen har uppdaterat sedan 2019” är svaret R5 oavsett vad säkerhetspolicyn föredrar
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; // fristående PDF MAC-token
if not Pdf.SaveAsEncrypted('quarterly-report.enc.pdf', Opts) then
raise Exception.Create('Encrypted save failed');
finally
Pdf.Free;
end;
end;
Varför en dokument-MAC ovanpå ett autentiserat chiffer?
Därför att GCM-taggar skyddar värdena, inte arrangemanget av värdena. Varje sträng och ström i ett AESV4-dokument autentiseras individuellt, men korsreferenstabellen, objektnumreringen och trailern är struktur, inte krypterat innehåll. En angripare kan inte förfalska en ström, men ingenting i chifferet ensamt hindrar dem från att arrangera om vilka objekt dokumentet pekar på, eller klistra in objekt från en tidigare revision av samma fil
Det fristående PDF MAC-tokenet adresserar det lagret. PDFiumPas härleder det från filkrypteringsnyckeln med en dedikerad 32-byte /KDFSalt registrerad i Encrypt-ordboken, så innehav av lösenordet är det som låter en läsare bekräfta tokenet. Resultatet är ett enda svar på en enda fråga: är det här dokumentet, som helhet, det dokument som skrevs
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); // inget token i den här filen
pmvsInvalid: Quarantine(Mac.MessageText); // manipulerad eller trunkerad
pmvsUnsupported: RouteForManualReview(Mac.MessageText);
end;
finally
Pdf.Free;
end;
end;
De fyra statusvärdena kräver fyra olika svar, och att slå ihop dem till en boolean tappar bort den skillnad som spelar roll. pmvsNotPresent betyder att filen helt enkelt inte har något token, vilket beskriver nästan varje krypterad PDF skriven före 2024 och inte är bevis på någonting. pmvsInvalid betyder att ett token finns men inte verifierar, vilket är ett äkta fynd och bör stoppa bearbetningen. pmvsUnsupported betyder att tokenet finns i en form det här bygget inte implementerar, vilket är en kompatibilitetslucka, inte en attack. Att behandla ”inte närvarande” som ”ogiltigt” skulle sätta hela din bakkatalog i karantän första dagen
Vad kryptering fortfarande inte gör
Behörighetsflaggor förblir vad de alltid har varit: en begäran till konform mjukvara, inte en kontroll. /P-bitarna från ISO 32000-1 tabell 22 som förbjuder utskrift eller extraktion respekteras av väluppfostrade visare och ignoreras av allt annat, och den som håller användarlösenordet håller redan det dekrypterade innehållet. Kryptering är gränsen; behörigheter beskriver avsikt innanför den
Två operativa detaljer är värda att planera för. För det första samspelar kryptering och senare modifiering: att lägga till en inkrementell uppdatering till ett krypterat dokument har egna regler, som täcks i inkrementella uppdateringar på krypterade PDF:er, och ett MAC-token är ett utlåtande på dokumentnivå som en vårdslös tillägg kommer att ogiltigförklara. För det andra använder GCM-konstruktionen en deterministisk IV-räknare, och PDFiumPas höjer ett undantag i stället för att återanvända ett räknarvärde om det utrymmet någonsin skulle ta slut, eftersom nonce-återanvändning i GCM är katastrofalt på ett sätt tyst wraparound skulle dölja
Att välja mellan de tre revisionerna i praktiken
Skriv ner vem som öppnar filen, och välj sedan. För intern distribution där varje läsare är en aktuell visare under din kontroll är R7 med integritetsskydd det starkaste tillgängliga alternativet och det finns ingen anledning att inte använda det. För dokument som lämnar organisationen är R6 det försvarbara standardvalet: det är standardiserat i ISO 32000-2 snarare än i en teknisk specifikation ovanpå det, och stödet är brett. För arkiv och äldre konsumenter är R5 det enda valet som pålitligt öppnas, och du bör dokumentera varför på samma ställe du dokumenterar resten av din bevarandepolicy
Vilket du än väljer, verifiera utdatan i stället för att lita på att anropet lyckades. Öppna den krypterade filen igen, kontrollera ValidatePdfMac, och bekräfta att den deklarerade versionen är vad du förväntar dig, med hjälp av versionskonformitetskontrollerna i exakt PDF-versionskonformitet. En bredare intagschecklista för opålitliga dokument finns i granskning av PDF-säkerhetsrisker
PDFiumPas är en Delphi- och Lazarus-komponent runt PDFium-motorn med PDF 2.0-krypteringsstacken implementerad nativt i Pascal, så AES-256, GCM och MAC-tokenet behöver ingen extern kryptografi-DLL. Krypterings-API:et dokumenteras på sidan för PDFium Delphi-komponent