Zastavica dopuštenja u PDF-u nije brava. To je zahtjev koji datoteka upućuje onome što je otvara, a preglednik ga može slobodno zanemariti. Ta jedna činjenica određuje kako biste trebali razmišljati o svakom drugom izboru na ovoj stranici. Prava povjerljivost dolazi samo s jednog mjesta: AES-256 enkripcije zaključane lozinkom koju čitatelj nema. Sve ostalo, okviri poput "bez ispisa" i "bez kopiranja", samo su pravila koja se usklađeni softver slaže poštovati, a zlonamjerni softver ne. Pomiješajte te dvije razine i isporučit ćete nešto što izgleda sigurno na demonstraciji, a curi na terenu
HotPDF je izvorna VCL PDF komponenta za Delphi i C++Builder, a izlaže model zaštite ISO 32000 kroz mali skup svojstava. Svojstva je lako postaviti. Težak je dio znati koje vam od njih pruža kriptografsku zaštitu, a koje samo pristojnu sugestiju, te ispravno postaviti redoslijed dodjele kako bi enkripcija koju ste tražili doista bila enkripcija koju ćete dobiti
Što dvije lozinke zapravo jamče
Enkripcija PDF-a definira dvije vjerodajnice s različitim zadacima, a njihovo miješanje najčeća je pogreška u dizajnu koda za zaštićeni izlaz. Korisnička lozinka (user password) kontrolira dešifriranje. Bez nje, ili bez vlasničke lozinke, usklađeni čitač ne može rekonstruirati ključ datoteke i sadržaj ostaje kriptografski nečitljiv. Vlasnička lozinka (owner password) umjesto toga kontrolira postavke dopuštenja: čitaču koji unese vlasničku lozinku odobren je puni pristup bez obzira na to što govore zastavice ograničenja
Bitovi dopuštenja stoje na slabijim temeljima. Ispis, izdvajanje sadržaja, ispunjavanje obrazaca: svaki od njih je zastavica koju preglednik čita i odlučuje hoće li je poštovati (ISO 32000-2 §7.6.4). Enkripcija štiti bajtove. Zastavice dopuštenja samo daju upute usklađenom softveru, i to nakon što je dokument već otvoren. Svatko tko otvori dokument s korisničkom lozinkom već ima dešifrirani sadržaj u memoriji, pa "bez kopiranja" i "bez ispisa" znače nešto dobroćudnom pregledniku, a ništa odlučnom napadaču. Izgradite model prijetnji oko te linije. Povjerljivost leži u korisničkoj lozinki. Dopuštenja samo oblikuju ono što uobičajeni preglednici nude, i to je sve što rade
Redoslijed konfiguracije: sve prije BeginDoc
HotPDF gradi rječnik enkripcije i generira ključ datoteke u trenutku kada se pokrene BeginDoc. Što god zaštitna svojstva sadrže u tom trenutku, to dokument dobiva, a njihova promjena nakon toga ne mijenja ništa. Svojstvo koje je ovdje najvažnije je CryptKeyLength, koje bira shemu iz vrijednosti THPDFKeyType k40, k128, aes128 i aes256. Ako ga dodijelite nakon BeginDoc, nećete dobiti nikakvu iznimku niti upozorenje, već samo datoteku koja je tiho zadržala ono s čime je započela. Takvo tiho odstupanje je najgora vrsta: prolazi svaki lokalni test, a pojavi se mjesecima kasnije kao nalaz o nesukladnosti na stolu klijenta
Lozinke su UTF-8 i ograničene na 127 bajtova, što je ograničenje standarda ISO 32000-2 za AES-256 sheme. Ako vam vaša politika lozinki nameće duže tajne, sami skratite lozinku na svojoj strani, gdje točno kontrolirate gdje rez pada. Prepustite li to slučaju, knjižnica i neki budući preglednik mogu se razići oko granice skraćivanja, što proizvodi datoteku koja se kod vas otvara, a na drugom mjestu odbija istu lozinku
Revizija 5 ili revizija 6: jedan boolean, dva ekosustava
UseAES256R6 bira između dva AES-256 protokola, a taj je izbor znatno važniji nego što sugerira njegov boolean tip. Ostavite ga na False i HotPDF piše reviziju 5, AES-256 shemu koja je stigla kao proširenje za PDF 1.7 i koju preglednici mogu otvoriti već otprilike petnaest godina. Postavite ga na True i dobit ćete reviziju 6, ojačano izvođenje ključa standardizirano u ISO 32000-2 za PDF 2.0, koje uklanja poznatu slabost u načinu na koji revizija 5 provjerava lozinku
Dakle, revizija 6 je s kriptografskog stajališta bolja opcija. Međutim, ona je i ona koja uzrokuje probleme s kompatibilnošću. Datoteka s revizijom 6 zahtijeva preglednik izgrađen za PDF 1.7 Extension Level 3 ili PDF 2.0, a velik dio instaliranog softvera nije takav: arhive za upravljanje dokumentima, ugrađeni renderi u drugim proizvodima, poslovni alati koje nitko nije dotaknuo godinama. Oni će glatko odbiti datoteku, i to na računalu klijenta, nikada na vašem. Praktična zadana vrijednost stoga je revizija 5. Posegnite za reviziju 6 samo kada sigurnosna pravila izričito navode ISO 32000-2 po reviziji i kada ste stvarno potvrdili da je svaki primatelj može pročitati. U svakom slučaju, zabilježite koju ste opciju odabrali i zašto, jer će se sljedeća osoba koja bude radila na ovom kodu to pitati
Stariji tipovi ključeva zaslužuju rečenicu-dvije kako biste znali da ih trebate preskočiti. THPDFKeyType i dalje navodi k40, k128 i aes128, no oni postoje radi reprodukcije povijesnih arhiva, a ne radi zaštite novih. 40-bitni RC4 lako se probija na uobičajenom hardveru, a 128-bitne sheme prethode AES-256 revizijama koje će očekivati svaka trenutna sigurnosna revizija. Za dokument koji stvarate u 2026. pravo je pitanje samo revizija 5 nasuprot reviziji 6; ako se nađete u situaciji da posežete za zastarjelim tipovima u novom dizajnu, osjećat ćete se kao da je nešto ranije u procesu pošlo po zlu
Zastavice dopuštenja bez lozinke za otvaranje
Često je zahtjev upravo suprotan tajnosti. Svatko bi trebao moći pročitati dokument, ali ispis ili izdvajanje sadržaja trebaju biti ograničeni. To izražavate praznom korisničkom lozinkom i nepraznom vlasničkom lozinkom, što PDF naziva načinom rada bez lozinke za otvaranje (open-password mode), a operacije koje želite dopustiti navodite u ProtectOptions
Skup THPDFProtectOptions mapira se na ISO bitove dopuštenja: prPrint i prPrint12bit za ispis visoke razlučivosti, prInformationCopy za opće kopiranje i izdvajanje, prExtractContent za izdvajanje pomoću asistivne tehnologije, plus prModifyStructure, prEditAnnotations, prFillAnnotations i prAssemble. Dva od njih zaslužuju upozorenje. Ostavite prExtractContent uključenim u gotovo svakom profilu koji gradite. To je bit koji čitač zaslona treba za pristup tekstu, a njegovo isključivanje tiho pretvara odluku o pravima u problem s pristupačnošću koji pogađa osobe s invaliditetom, a koji vi nikada ne vidite. Druga zamka je prPrint sam za sebe, bez prPrint12bit: nekoliko preglednika na to reagira smanjenjem kvalitete ispisa, pa će vaši korisnici to prijaviti kao pogrešku u renderiranju, a ne kao postavku dopuštenja što to zapravo jest
Provjera traje pet minuta i trebala bi biti na vašem popisu za provjeru prije objave. Otvorite uzorak svakog profila u Acrobatu, otvorite Svojstva dokumenta (Document Properties) i pročitajte karticu Sigurnost (Security), koja navodi algoritam ("AES 256-bit") i dopuštene operacije jednu po jednu. Zatim otvorite istu datoteku u najstarijem pregledniku koji vaši kupci stvarno koriste, a ne u najnovijem na vašem računalu. To drugo otvaranje je jeftino osiguranje da datoteka s revizijom 6 neće proći kroz razvoj i prestati raditi kod klijenta koji nikada nije nadogradio svoj sustav
Uklanjanje zaštite iz postojećih datoteka
Dešifriranje pokreće isti model svojstava unatrag. Učitajte dokument s valjanom vjerodajnicom, isključite zaštitu i spremite rezultat bez nje
Taj pristup učitava cijeli dokument u memoriju, što je u redu za uobičajene datoteke, ali rasipno za one velike. Kada unos doseže stotine megabajta, DecryptFile je povoljnija opcija: dešifrira se tijekom kopiranja na razini datoteke, koristeći izravnu AES-256 putanju prepisivanja koja preskače izgradnju cijelog stabla objekata kad god to unos dopušta. To je dio Direct File API-ja koji je pokriven u pratećem članku o obradi velikih PDF datoteka iz Delphija
Ograničenja koja utječu na enkripciju
Dva ograničenja vrijedi znati prije nego što dizajnirate sustav oko enkripcije, a ne nakon toga. Prvo je sukladnost s arhiviranjem. ISO 19005 zabranjuje enkripciju u PDF/A, pa je svaki tijek rada koji šifrira dokument i istovremeno zahtijeva PDF/A sukladnost proturječan sam po sebi; HotPDF vam neće dopustiti oboje u jednoj datoteci. Kada vam je uistinu potrebno oboje, rješenje su dva dokumenta: šifrirana kopija za distribuciju i zasebna nešifrirana kopija za arhivu
Drugo ograničenje je još strože. PDF enkripcija nema mogućnost povrata niti oporavka lozinke. Ako izgubite korisničku lozinku na R5 ili R6 datoteci, vaše opcije su pogađanje grubom silom ili odustajanje. Stoga tretirajte vlasničke i korisničke tajne onako kako tretirate bilo koje produkcijske vjerodajnice. Generirajte ih, pohranite ih u trezor, rotirajte ih prema rasporedu. Jedina stvar koju nikada ne biste trebali učiniti jest tvrdo ih kodirati kao konstante u kodu, odakle odlaze izravno u sustav kontrole verzija i zauvijek ostaju u radnoj kopiji svakog programera
Još jedna navika koju vrijedi usvojiti. Promjena zaštite na datoteci koju niste sami stvorili koristi isti mehanizam kao i dešifriranje, to nije zasebna značajka: učitajte je s njezinom lozinkom putem LoadFromFile, uredite ProtectOptions ili lozinke na licu mjesta i zapišite je natrag pomoću SaveLoadedDocument. Ako možete dešifrirati datoteku, možete joj promijeniti i dopuštenja, a kod izgleda gotovo identično prethodnom primjeru
Zaštitna svojstva prikazana ovdje dio su standardne HotPDF komponente za Delphi i C++Builder; stranica proizvoda sadrži cjelovitu dokumentaciju o enkripciji, uključujući kompletnu enumeraciju dopuštenja
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;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;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;