Techninis straipsnis

PDF 2.0 AES-GCM šifravimas Delphi: ISO/TS 32003

PDFiumPas rašo ISO/TS 32003 šifravimą per SaveAsEncrypted: nustatykite Revision į erR7, ir kiekviena eilutė bei srautas apsaugomi AES-256 GCM režimu, autentifikuotu šifru, kurį PDF 2.0 gavo 2023 metais. Nustatykite ir EnableIntegrityProtection, ir dokumentas taip pat nešios savarankišką PDF MAC žetoną, kurį ValidatePdfMac patikrina skaitymo pusėje

Tai dvi skirtingos apsaugos, kurias žmonės nuolat sumaišo. GCM autentifikuoja kiekvieną šifruotą reikšmę. MAC autentifikuoja dokumentą kaip visumą. Norite abiejų, dėl skirtingų priežasčių

Ką prideda GCM, ko niekada nesuteikė CBC?

Šifruoto teksto autentifikavimą. AES-256 CBC režimu, AESV3 schema ISO 32000-2 standarte, išlaiko turinį konfidencialų ir nieko nesako apie tai, ar jis atkeliavo nepakeistas. CBC yra kintamas specifiniais, gerai ištirtais būdais: užpuolikas, galintis apversti bitus šifruotame tekste, sukuria nuspėjamus pokyčius sekančio bloko atvirame tekste, ir niekas formate to nepastebi

GCM tai uždaro. Kiekviena šifruota reikšmė nešioja 16 baitų autentifikavimo žymę, pilnai serializuotą, kaip reikalauja ISO/TS 32003, ir dekodavimas nepavyksta, o negrąžina pakeisto atviro teksto, kai žymė nesutampa. PDF terminais, pakeista eilutė ar srautas AESV4 dokumente yra kieta klaida panaudojimo taške, ne keista reikšmė, kuri plinta į jūsų aplikaciją. Encrypt žodynas tai pažymi su /CFM /AESV4 ir V 6 / R 7, kartu su plėtinio įrašu, deklaruojančiu /ExtensionLevel 32003 ir /ExtensionRevision (:2023)

Trys versijos, trys ekosistemos

TPdfEncryptionRevision siūlo erR5, erR6 ir erR7, o pasirinkimas yra labiau suderinamumo, nei kriptografinis sprendimas. R5 yra originali AES-256 schema, publikuota kaip PDF 1.7 plėtinys, su vienu SHA-256 slaptažodžio maiša, ir ji atsidaro beveik bet kur per pastaruosius penkiolika metų. R6 yra sustiprintas rakto išvedimas, standartizuotas ISO 32000-2, naudojantis iteruojančią SHA-256/384/512 konstrukciją pagal algoritmą 2.B, ir tai yra tai, ko tikisi dabartinis PDF 2.0 ar PDF/A-4 darbo srautas. R7 yra ISO/TS 32003, naudojantis tą pačią 2.B išvestį su AES-GCM kaip šifru

Skaityklių palaikymas eina lygiai ta pačia tvarka, o R7 palaikymas vis dar plonas už dabartinių pagrindinių peržiūros programų ribų. Tai tas pats kompromisas, kuris valdo bet kurią PDF 2.0 funkciją: naujausia parinktis yra geriausia inžinerija ir siauriausia auditorija. Rinkitės pagal tai, kam reikia atverti failą, ir jei atsakymas yra „archyvavimo sistema, kurios niekas neatnaujino nuo 2019 metų", atsakymas yra R5, nepaisant to, ko norėtų saugumo 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;   // savarankiškas PDF MAC žetonas

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

Kodėl dokumento MAC virš autentifikuoto šifro?

Todėl, kad GCM žymės saugo reikšmes, ne reikšmių išdėstymą. Kiekviena eilutė ir srautas AESV4 dokumente autentifikuojami atskirai, tačiau kryžminių nuorodų lentelė, objektų numeravimas ir trumpinamasis žodynas yra struktūra, ne šifruotas turinys. Užpuolikas negali suklastoti srauto, tačiau niekas vien šifre nesustabdo jo nuo objektų, į kuriuos rodo dokumentas, perrikiavimo, ar objektų iš ankstesnės to paties failo redakcijos suklijavimo

Savarankiškas PDF MAC žetonas sprendžia šį sluoksnį. PDFiumPas jį gauna iš failo šifravimo rakto su specialia 32 baitų /KDFSalt reikšme, užrašyta Encrypt žodyne, todėl slaptažodžio turėjimas leidžia skaityklei patvirtinti žetoną. Rezultatas yra vienas atsakymas į vieną klausimą: ar šis dokumentas, kaip visuma, yra tas dokumentas, kuris buvo parašytas

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);       // šiame faile nėra žetono
      pmvsInvalid:     Quarantine(Mac.MessageText);   // pakeistas arba nutrauktas
      pmvsUnsupported: RouteForManualReview(Mac.MessageText);
    end;
  finally
    Pdf.Free;
  end;
end;

Keturios būsenos reikalauja keturių skirtingų atsakymų, o jų suvedimas į loginę reikšmę prarastų skirtumą, kuris svarbus. pmvsNotPresent reiškia, kad faile tiesiog nėra žetono, o tai apibūdina beveik kiekvieną PDF, parašytą prieš 2024 metus, ir tai nėra jokio įrodymas. pmvsInvalid reiškia, kad žetonas yra, bet nepatvirtinamas, o tai yra tikras radinys, ir turėtų sustabdyti apdorojimą. pmvsUnsupported reiškia, kad žetonas egzistuoja forma, kurios ši versija neįgyvendina, o tai suderinamumo spraga, ne ataka. Traktuojant „nėra" kaip „netinkamas" karantinuotumėte visą savo archyvą jau pirmą dieną

Ko šifravimas vis dar nedaro

Leidimų vėliavėlės lieka tuo, kuo visada buvo: prašymas atitinkančiai programinei įrangai, ne kontrolė. /P bitai iš ISO 32000-1 22 lentelės, draudžiantys spausdinimą ar išgavimą, gerbiami tvarkingai veikiančiose peržiūros programose ir ignoruojami visur kitur, o bet kas, turintis naudotojo slaptažodį, jau turi dekoduotą turinį. Šifravimas yra riba; leidimai aprašo ketinimą jos viduje

Verta suplanuoti du eksploatacinius dalykus. Pirma, šifravimas ir vėlesnis keitimas sąveikauja: prieauginio atnaujinimo pridėjimas prie šifruoto dokumento turi savo taisykles, aprašytas straipsnyje apie prieauginius atnaujinimus šifruotuose PDF failuose, o MAC žetonas yra dokumento lygmens teiginys, kurį neatsargus pridėjimas paskelbs negaliojančiu. Antra, GCM konstrukcija naudoja deterministinį IV skaitiklį, ir PDFiumPas sukelia klaidą, o ne pakartotinai naudoja skaitiklio reikšmę, jei ta erdvė kada nors būtų išnaudota, nes nonce pakartotinis naudojimas GCM režime yra katastrofiškas taip, kaip tylus persukimas to niekada neparodytų

Trijų versijų pasirinkimas praktiškai

Užsirašykite, kas atveria failą, tada rinkitės. Vidiniam platinimui, kur kiekvienas skaitytojas yra dabartinė peržiūros programa jūsų kontrolėje, R7 su vientisumo apsauga yra stipriausia turima parinktis, ir nėra priežasties jos nenaudoti. Dokumentams, paliekantiems organizaciją, R6 yra pagrįstas numatytasis pasirinkimas: jis standartizuotas ISO 32000-2, o ne techninėje specifikacijoje virš jo, ir palaikymas platus. Archyvams ir senoms sistemoms R5 yra vienintelis pasirinkimas, kuris patikimai atsidaro, ir turėtumėte užrašyti kodėl toje pačioje vietoje, kur registruojate likusią saugojimo politiką

Kad ir ką pasirinktumėte, patikrinkite rezultatą, o ne pasitikėkite, kad iškvietimas pavyko. Iš naujo atverkite šifruotą failą, patikrinkite ValidatePdfMac, ir patvirtinkite, kad deklaruota versija yra tokia, kokios tikėjotės, naudodami versijos atitikties patikras, aprašytas straipsnyje apie tikslią PDF versijos atitiktį. Platesnis nepatikimų dokumentų priėmimo kontrolinis sąrašas pateiktas straipsnyje apie PDF saugumo rizikų auditą

PDFiumPas yra Delphi ir Lazarus komponentas aplink PDFium variklį su PDF 2.0 šifravimo steku, natyviai įgyvendintu Pascal kalba, todėl AES-256, GCM ir MAC žetonui nereikia jokios išorinės kriptografijos DLL. Šifravimo API dokumentuotas PDFium Delphi komponento puslapyje