PDFiumPas записва ISO/TS 32003 криптиране чрез SaveAsEncrypted: задайте Revision на erR7 и всеки низ и stream се защитават с AES-256 в GCM режим, authenticated шифърът, който PDF 2.0 придоби през 2023. Задайте и EnableIntegrityProtection и документът носи и самостоятелен PDF MAC токен, който ValidatePdfMac проверява от страната на четенето
Това са две различни защити, които хората рутинно бъркат. GCM authentication-ира всяка криптирана стойност. MAC-ът authentication-ира документа като цяло. Искате и двете, по различни причини
Какво добавя GCM, което CBC никога не е предоставял?
Authentication на ciphertext-а. AES-256 в CBC режим, схемата AESV3 в ISO 32000-2, пази съдържанието конфиденциално и не казва нищо за това дали е пристигнало непроменено. CBC е malleable по конкретни, добре изучени начини: атакуващ, който може да обръща битове в ciphertext-а, произвежда предвидими промени в plaintext-а на следващия блок, и нищо във формата не забелязва
GCM затваря това. Всяка криптирана стойност носи 16-байтов authentication tag, сериализиран изцяло, както изисква ISO/TS 32003, а декриптирането се проваля, вместо да върне променен plaintext, когато tag-ът не съвпада. В PDF термини, подправен низ или stream в AESV4 документ е твърда грешка в момента на употреба, не странна стойност, разпространяваща се във вашето приложение. Encrypt речникът маркира това с /CFM /AESV4 и V 6 / R 7, заедно с extensions запис, деклариращ /ExtensionLevel 32003 и /ExtensionRevision (:2023)
Три ревизии, три екосистеми
TPdfEncryptionRevision предлага erR5, erR6 и erR7, а изборът е по-скоро решение за съвместимост, отколкото за криптография. R5 е оригиналната AES-256 схема, публикувана като разширение на PDF 1.7, с единичен SHA-256 хеш на паролата, и се отваря в практически всичко от последните петнайсет години. R6 е укрепеното извеждане на ключ, стандартизирано в ISO 32000-2, използващо итеративната конструкция SHA-256/384/512 на алгоритъм 2.B, и е онова, което текущ работен процес за PDF 2.0 или PDF/A-4 очаква. R7 е ISO/TS 32003, използваща същото извеждане 2.B с AES-GCM като шифър
Поддръжката в четците следва точно този ред, а поддръжката на R7 все още е тънка извън текущите основни зрители. Това е същият компромис, който управлява всяка функция на PDF 2.0: най-новата опция е най-доброто инженерство и най-тясната аудитория. Решавайте според това кой трябва да отвори файла, а ако отговорът е „система за архивни записи, която никой не е обновявал от 2019“, отговорът е R5 независимо какво предпочита политиката за сигурност
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; // самостоятелен PDF MAC токен
if not Pdf.SaveAsEncrypted('quarterly-report.enc.pdf', Opts) then
raise Exception.Create('Encrypted save failed');
finally
Pdf.Free;
end;
end;
Защо документен MAC върху authenticated шифър?
Защото GCM tag-овете защитават стойностите, не подредбата на стойностите. Всеки низ и stream в AESV4 документ е индивидуално authentication-иран, но cross-reference таблицата, номерацията на обектите и trailer-ът са структура, не криптирано съдържание. Атакуващ не може да фалшифицира stream, но нищо в самия шифър не му пречи да пренареди към кои обекти сочи документът или да сглоби обекти от по-ранна ревизия на същия файл
Самостоятелният PDF MAC токен адресира точно този слой. PDFiumPas го извежда от ключа за криптиране на файла с посветен 32-байтов /KDFSalt, записан в Encrypt речника, така че притежанието на паролата е онова, което позволява на четец да потвърди токена. Резултатът е единствен отговор на единствен въпрос: дали този документ, като цяло, е документът, който е бил записан
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); // няма токен в този файл
pmvsInvalid: Quarantine(Mac.MessageText); // подправен или отрязан
pmvsUnsupported: RouteForManualReview(Mac.MessageText);
end;
finally
Pdf.Free;
end;
end;
Четирите статусни стойности изискват четири различни отговора, а свеждането им до булева стойност губи разграничението, което има значение. pmvsNotPresent означава, че файлът просто няма токен, което описва почти всеки криптиран PDF, записан преди 2024, и не е доказателство за нищо. pmvsInvalid означава, че токен присъства и не се проверява успешно, което е истинска находка и трябва да спре обработката. pmvsUnsupported означава, че токенът съществува във форма, която тази компилация не имплементира, което е пропуск в съвместимостта, не атака. Третирането на „не присъства“ като „невалиден“ би поставило под карантина целия ви архив в първия ден
Какво все още не прави криптирането
Флаговете за разрешения остават онова, което винаги са били: искане към съответстващ софтуер, не контрол. Битовете /P от Таблица 22 на ISO 32000-1, забраняващи печат или извличане, се спазват от добре възпитани зрители и се игнорират от всичко останало, а всеки, притежаващ потребителската парола, вече държи декриптираното съдържание. Криптирането е границата; разрешенията описват намерение вътре в нея
Два оперативни детайла си струва да се планират. Първо, криптирането и по-късна модификация си взаимодействат: добавянето на incremental update към криптиран документ има собствени правила, разгледани в incremental update-ите върху криптирани PDF, а MAC токен е декларация на ниво документ, която небрежно добавяне ще обезсили. Второ, GCM конструкцията използва детерминистичен IV брояч, а PDFiumPas хвърля изключение, вместо да повтори стойност на брояча, ако това пространство някога се изчерпи, защото повторение на nonce в GCM е катастрофално по начин, който тихо преливане би скрило
Избор между трите ревизии на практика
Запишете кой отваря файла, после изберете. За вътрешно разпространение, където всеки четец е текущ зрител под ваш контрол, R7 с integrity protection е най-силната налична опция и няма причина да не я използвате. За документи, напускащи организацията, R6 е защитимата стойност по подразбиране: тя е стандартизирана в ISO 32000-2, а не в техническа спецификация върху нея, а поддръжката е широка. За архиви и наследени потребители, R5 е единственият избор, който надеждно се отваря, и трябва да запишете защо на същото място, където записвате останалата част от политиката си за задържане
Каквото и да изберете, проверете изхода, вместо да се доверявате, че извикването е успяло. Отворете отново криптирания файл, проверете ValidatePdfMac и потвърдете, че декларираната версия е онова, което очаквате, използвайки проверките за съответствие на версия в точното съответствие на версия на PDF. По-широк списък за проверка на ненадеждни документи има в одита на рискове за сигурността на PDF
PDFiumPas е Delphi и Lazarus компонент около движока PDFium с изцяло нативно имплементиран в Pascal стек за криптиране на PDF 2.0, така че AES-256, GCM и MAC токенът не се нуждаят от външна крипто DLL. API-то за криптиране е документирано на страницата на PDFium компонента за Delphi