Príznak oprávnenia v PDF nie je zámok. Je to len požiadavka, ktorú súbor kladie na program, ktorý ho otvára, a prehliadač ju môže slobodne ignorovať. Táto jediná skutočnosť určuje, ako by ste mali uvažovať o každom ďalšom rozhodnutí na tejto stránke. Skutočná dôvernosť pochádza iba z jedného zdroja: šifrovania AES-256 založeného na hesle, ktoré čitateľ nemá k dispozícii. Všetko ostatné, ako napríklad začiarkavacie políčka "zákaz tlače" a "zákaz kopírovania", sú len pravidlá, ktoré sa kompatibilný softvér zaväzuje rešpektovať a nepriateľský softvér ich ignoruje. Ak tieto dve vrstvy pomiešate, vytvoríte niečo, čo v ukážke vyzerá bezpečne, no v reálnej prevádzke zlyhá.
HotPDF je natívny VCL PDF komponent pre Delphi a C++Builder a sprístupňuje ochranný model podľa normy ISO 32000 prostredníctvom malej sady vlastností. Tieto vlastnosti sa nastavujú jednoducho. Ťažšou časťou je vedieť, ktorá z nich vám prinesie skutočnú kryptografickú ochranu a ktorá je len zdvorilým odporúčaním, a dodržať správne poradie priradenia vlastností, aby šifrovanie, ktoré požadujete, bolo aj reálne aplikované.
Čo v skutočnosti garantujú dve heslá
Šifrovanie PDF definuje dva prístupové údaje s odlišnými úlohami a ich zamieňanie je najčastejšou chybou pri návrhu zabezpečeného kódu. Používateľské heslo (user password) riadi samotné dešifrovanie. Bez neho (alebo bez hesla vlastníka) nedokáže kompatibilná čítačka zrekonštruovať kľúč súboru a obsah zostane kryptograficky nečitateľný. Heslo vlastníka (owner password) naopak riadi nastavenia oprávnení: čítačka, ktorá získa heslo vlastníka, má plný prístup k súboru bez ohľadu na akékoľvek obmedzujúce príznaky.
Bity oprávnení stoja na omnoho slabších základoch. Tlač, extrakcia obsahu, vypĺňanie formulárov: každé z nich je len príznakom, ktorý prehliadač prečíta a rozhodne sa ho rešpektovať (ISO 32000-2 §7.6.4). Šifrovanie chráni samotné bajty. Príznaky oprávnení iba inštruujú kompatibilný softvér, a to až po dešifrovaní. Každý, kto otvorí dokument pomocou používateľského hesla, už drží dešifrovaný obsah v pamäti, takže "zákaz kopírovania" a "zákaz tlače" znamenajú veľa pre slušný prehliadač a vôbec nič pre odhodlaného útočníka. Postavte svoj model hrozieb na tejto skutočnosti. Dôvernosť informácií spočíva v používateľskom hesle. Oprávnenia iba usmerňujú to, čo ponúkajú bežné prehliadače, a to je všetko, čo robia.
Poradie konfigurácie: všetko pred BeginDoc
HotPDF zostavuje šifrovací slovník a odvodzuje kľúč súboru v momente spustenia metódy BeginDoc. Akékoľvek vlastnosti ochrany sú v tomto momente nastavené, také dokument získa a ich dodatočná zmena už nič neovplyvní. Najdôležitejšou vlastnosťou je tu CryptKeyLength, ktorá vyberá schému z hodnôt THPDFKeyType: k40, k128, aes128 a aes256. Ak ju priradíte až po zavolaní BeginDoc, nedostanete žiadnu výnimku ani varovanie, len súbor si ticho ponechá nastavenia, s ktorými začal. Tento typ tichého zlyhania je najhorší: prejde všetkými lokálnymi testami a objaví sa o niekoľko mesiacov neskôr ako bezpečnostný nález u zákazníka.
var
Pdf: THotPDF;
begin
Pdf := THotPDF.Create(nil);
try
Pdf.FileName := 'statement.pdf';
Pdf.ActivateProtection := True;
Pdf.CryptKeyLength := aes256; // must be set before BeginDoc
Pdf.UserPassword := 'open-secret';
Pdf.OwnerPassword := 'admin-secret';
Pdf.UseAES256R6 := False; // R=5: widest viewer support
Pdf.BeginDoc;
Pdf.CurrentPage.SetFont('Arial', [], 11);
Pdf.CurrentPage.TextOut(50, 720, 0, 'Account statement, June 2026');
Pdf.EndDoc;
finally
Pdf.Free;
end;
end;
Heslá sú kódované v UTF-8 a obmedzené na 127 bajtov, čo je limit normy ISO 32000-2 pre schémy AES-256. Ak vaše pravidlá pre heslá generujú dlhšie tajomstvá, vykonajte skrátenie sami na svojej strane, kde presne viete kontrolovať, kde k skráteniu dôjde. Ak to necháte na náhodu, knižnica a nejaký budúci prehliadač sa nemusia zhodnúť na mieste skrátenia, čo vytvorí súbor, ktorý u vás otvoríte, no inde rovnaké heslo odmietne.
Revízia 5 alebo revízia 6: jedna logická hodnota, dva ekosystémy
Vlastnosť UseAES256R6 vyberá medzi dvoma spôsobmi overenia (handshake) AES-256 a táto voľba má väčšie následky, než by naznačoval jej boolovský typ. Ponechajte ju na False and HotPDF zapíše revíziu 5, čo je schéma AES-256 zavedená ako rozšírenie pre PDF 1.7, ktorú dokážu otvoriť prehliadače staré aj pätnásť rokov. Nastavte ju na True a získate revíziu 6, čo je zosilnené odvodzovanie kľúča štandardizované v ISO 32000-2 pre PDF 2.0, ktoré odstraňuje známu zraniteľnosť v spôsobe, akým revízia 5 overuje heslo.
Takže revízia 6 je z kryptografického hľadiska lepšia voľba. Je to však aj tá, ktorá spôsobuje nekompatibilitu. Súbor s revíziou 6 vyžaduje prehliadač vytvorený pre PDF 1.7 Extension Level 3 alebo PDF 2.0, a veľa nasadeného softvéru nespĺňa ani jedno: archívy na správu záznamov, integrované vykresľovacie moduly v iných produktoch či podnikové nástroje, na ktoré nikto roky nesiahol. Tie súbor úplne odmietnu a urobia to priamo na počítači zákazníka, nikdy nie na vašom. Praktickým predvoleným nastavením je preto revízia 5. Po revízii 6 siahnite iba vtedy, keď bezpečnostná politika výslovne vyžaduje ISO 32000-2 podľa revízie a keď máte reálne overené, že ju každý prijímateľ dokáže prečítať. V oboch prípadoch si zapíšte, ktorú možnosť ste vybrali a prečo, pretože ďalší človek, ktorý bude pracovať s týmto kódom, sa bude pýtať.
Staršie typy kľúčov si zaslúžia jednu vetu, aby ste vedeli, že ich máte preskočiť. THPDFKeyType stále uvádza k40, k128 a aes128, no tie existujú len na reprodukciu historických archívov, nie na ochranu nových súborov. 40-bitové RC4 podľahne bežnému hardvéru a 128-bitové schémy predchádzajú revíziám AES-256, ktoré očakáva akýkoľvek moderný bezpečnostný audit. Pri dokumentoch vytváraných v roku 2026 je reálnou otázkou iba revízia 5 verzus revízia 6; ak zistíte, že pri novom návrhu siahate po starších typoch, niečo na začiatku procesu je nesprávne.
Príznaky oprávnení bez hesla na otvorenie
Často je požiadavka presne opačná ako utajenie. Dokument by mal byť čitateľný pre každého, no tlač alebo kopírovanie textu by mali byť obmedzené. To vyjadríte prázdnym používateľským heslom a neprázdnym heslom vlastníka, čo špecifikácia PDF nazýva režimom s otvoreným heslom (open-password mode), a zoznam povolených operácií uvediete vo vlastnosti ProtectOptions.
Pdf.ActivateProtection := True;
Pdf.CryptKeyLength := aes256;
Pdf.UserPassword := ''; // anyone can open the file
Pdf.OwnerPassword := 'rotate-me-quarterly'; // guards the permission set
Pdf.ProtectOptions := [prPrint, prPrint12bit, prExtractContent];
Pdf.BeginDoc;
// ... page content ...
Pdf.EndDoc;
Množina THPDFProtectOptions sa mapuje priamo na bity oprávnení špecifikácie ISO: prPrint a prPrint12bit pre tlač vo vysokom rozlíšení, prInformationCopy pre bežné kopírovanie a extrakciu, prExtractContent pre extrakciu pomocou asistenčných technológií, plus prModifyStructure, prEditAnnotations, prFillAnnotations a prAssemble. Dve z nich si zaslúžia varovanie. Ponechajte prExtractContent zapnuté takmer v každom profile, ktorý vytvoríte. Je to totiž príznak, ktorý čítačka obrazovky potrebuje na prístup k textu, a jeho zakázaním ticho premeníte rozhodnutie o právach na chybu prístupnosti, na ktorú narazí človek so zdravotným postihnutím a vy sa o nej ani nedozviete. Druhou pascou je príznak prPrint osamote bez prPrint12bit: viaceré prehliadače reagujú degradáciou kvality tlače a vaši používatelia to nahlásia ako chybu vykresľovania, a nie ako dôsledok nastavenia oprávnení.
Overenie trvá päť minút a patrí do vášho kontrolného zoznamu pred vydaním. Otvorte vzorku každého profilu v programe Acrobat, otvorte Vlastnosti dokumentu a prečítajte si záložku Zabezpečenie, ktorá popisuje algoritmus ("AES 256-bit") a zobrazuje zoznam povolených operácií. Potom otvorte rovnaký súbor v najstaršom prehliadači, ktorý vaši zákazníci reálne používajú, nie v najnovšom na vašom počítači. Toto druhé otvorenie je lacným poistením proti tomu, aby súbor s revíziou 6 prešiel vývojom a zlyhal u zákazníka, ktorý nikdy neaktualizoval svoj softvér.
Odstránenie ochrany z existujúcich súborov
Dešifrovanie využíva rovnaký model vlastností v opačnom poradí. Načítajte dokument s platnými prihlasovacími údajmi, vypnite ochranu a výsledok uložte bez nej.
var
Pdf: THotPDF;
PageCount: Integer;
begin
Pdf := THotPDF.Create(nil);
try
PageCount := Pdf.LoadFromFile('encrypted.pdf', 'open-secret');
if PageCount > 0 then
begin
Pdf.ActivateProtection := False; // drop encryption on save
Pdf.SaveLoadedDocument('plain.pdf');
end;
finally
Pdf.Free;
end;
end;
Tento spôsob spracuje celý dokument v pamäti, čo je v poriadku pre bežné súbory, ale neefektívne pre obrovské dokumenty. Keď vstup dosahuje stovky megabajtov, výhodnejšou možnosťou je DecryptFile: dešifruje počas kopírovania na úrovni súborov, pričom využíva priamu cestu prepisu AES-256, ktorá preskakuje vytváranie kompletného objektového stromu v pamäti, kedykoľvek to vstup umožňuje. Je súčasťou Direct File API, ktorému sa venuje sprievodný článok o spracovaní veľkých PDF súborov v Delphi.
Obmedzenia súvisiace so šifrovaním
Dve obmedzenia sa oplatí poznať ešte pred samotným návrhom šifrovania. Prvým je archívna kompatibilita. Norma ISO 19005 zakazuje šifrovanie v PDF/A, so any workflow to šifruje dokument a zároveň deklaruje kompatibilitu s PDF/A, je z princípu rozporuplný. HotPDF vám nedovolí mať obe vlastnosti v jednom súbore. Ak skutočne potrebujete obe, riešením sú dva výstupné súbory: šifrovaná kópia na distribúciu a samostatná nešifrovaná kópia na archiváciu.
Druhé obmedzenie je ešte zásadnejšie. Šifrovanie PDF nepozná žiadnu úschovu kľúčov (escrow) ani obnovu hesiel. Ak stratíte používateľské heslo k súboru s revíziou R5 alebo R6, vašimi jedinými možnosťami sú útok hrubou silou alebo zmierenie sa so stratou údajov. Zaobchádzajte preto s heslami vlastníka a používateľa ako s akýmikoľvek inými produkčnými údajmi. Generujte ich, ukladajte do bezpečného úložiska (vaultu) a pravidelne ich meňte. Jediná vec, ktorú by ste nikdy nemali robiť, je pevne ich nakódovať ako konštanty v kóde, kde sa dostanú priamo do správy verzií a zostanú navždy v pracovnej kópii každého vývojára.
A nakoniec jeden užitočný návyk. Zmena ochrany na súbore, ktorý ste sami nevytvorili, využíva rovnaký mechanizmus ako dešifrovanie, nejde o samostatnú funkciu: načítajte súbor s jeho heslom pomocou LoadFromFile, upravte ProtectOptions alebo heslá priamo na mieste a zapíšte ho späť pomocou SaveLoadedDocument. Ak dokážete súbor dešifrovať, dokážete mu aj zmeniť oprávnenia a kód vyzerá takmer identicky ako v príklade vyššie.
Vlastnosti ochrany uvedené v tomto článku sú súčasťou štandardného komponentu HotPDF pre Delphi a C++Builder. Stránka produktu obsahuje kompletnú referenčnú príručku k šifrovaniu vrátane zoznamu všetkých oprávnení.