PDF:n käyttöoikeuslippu ei ole lukko. Se on tiedoston pyyntö sen avaavalle ohjelmalle, ja katseluohjelma voi jättää sen huomiotta. Tämä ratkaisee, miten kaikkia muita tämän sivun valintoja pitää arvioida. Todellinen luottamuksellisuus saadaan vain AES-256-salauksella, jonka avain perustuu salasanaan, jota lukijalla ei ole. Tulostuksen ja kopioinnin estot ovat käytäntöjä, joita sääntöjä noudattava ohjelmisto kunnioittaa mutta vihamielinen ohjelmisto ei. Jos nämä kaksi tasoa sekoitetaan, esittelyssä turvalliselta näyttävä tiedosto voi vuotaa käytössä
HotPDF on natiivi VCL PDF component Delphi- ja C++Builder-ympäristöihin. Se tuo ISO 32000 -suojausmallin käyttöön pienellä ominaisuusjoukolla. Ominaisuudet on helppo asettaa. Vaikeampaa on erottaa salaukseen vaikuttava ominaisuus kohteliaasta käyttöoikeuspyynnöstä ja tehdä määritykset oikeassa järjestyksessä, jotta tiedostoon tulee todella pyydetty salaus
Mitä kaksi salasanaa todella takaavat
PDF-salaus määrittelee kaksi eri tehtäviin tarkoitettua tunnistetta. Niiden sekoittaminen on suojatun tulostuksen yleisin suunnitteluvirhe. User password estää salauksen purkamisen: ilman sitä tai owner password -salasanaa sääntöjä noudattava lukija ei voi muodostaa tiedostoavainta, joten sisältö pysyy kryptografisesti lukukelvottomana. Owner password puolestaan suojaa käyttöoikeusasetuksia. Kun lukija saa sen, sillä on täydet oikeudet riippumatta rajoituslipuista
Käyttöoikeusbitit ovat heikompi suoja. Tulostus, sisällön poiminta ja lomakkeiden täyttö ovat lippuja, jotka katseluohjelma lukee ja voi päättää noudattaa (ISO 32000-2 §7.6.4). Salaus suojaa tavut, käyttöoikeusliput vain ohjaavat sääntöjä noudattavaa ohjelmistoa jälkikäteen. User password -salasanalla avattu sisältö on jo purettuna muistissa, joten kopiointi- ja tulostuskiellot vaikuttavat hyvän käytännön mukaiseen katseluohjelmaan mutta eivät määrätietoiseen käyttäjään. Uhkamallissa luottamuksellisuus kuuluu user password -salasanalle. Käyttöoikeudet rajaavat vain valtavirran katseluohjelmien tarjoamia toimintoja
Määritysjärjestys: kaikki ennen BeginDoc-kutsua
HotPDF muodostaa salausdictionaryn ja johtaa tiedostoavaimen, kun BeginDoc suoritetaan. Asiakirjaan jäävät ne suojausominaisuudet, jotka ovat voimassa juuri silloin; myöhemmät muutokset eivät vaikuta siihen. Tärkein ominaisuus on CryptKeyLength, joka valitsee järjestelmän THPDFKeyType-arvoista k40, k128, aes128 ja aes256. Jos arvo asetetaan BeginDoc-kutsun jälkeen, poikkeusta tai varoitusta ei tule, vaan tiedosto säilyttää alussa valitun järjestelmän. Tällainen hiljainen ero voi läpäistä paikalliset testit ja paljastua vasta myöhemmässä vaatimustenmukaisuustarkastuksessa
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;
Salasanat käsitellään UTF-8-muodossa, ja AES-256-järjestelmien ISO 32000-2 -raja on 127 tavua. Jos salasanakäytäntö tuottaa pidempiä salaisuuksia, katkaise ne itse hallitussa kohdassa. Muuten kirjasto ja tuleva katseluohjelma voivat tulkita katkaisukohdan eri tavoin, jolloin samalla salasanalla avautuva tiedosto yhdessä ympäristössä kieltäytyy avautumasta toisessa
Revision 5 vai revision 6: yksi boolean, kaksi ekosysteemiä
UseAES256R6 valitsee kahden AES-256-kättelyn välillä, ja valinta on boolean-tyyppiä merkittävämpi. Arvolla False HotPDF kirjoittaa revision 5 -järjestelmän, joka tuli PDF 1.7 -laajennuksena ja jota noin viidentoista vuoden katseluohjelmat osaavat avata. Arvolla True käytetään revision 6 -järjestelmää, ISO 32000-2:ssa PDF 2.0:lle standardoitua vahvistettua avaimenjohtoa, joka korjaa revision 5:n salasanan tarkistuksen tunnetun heikkouden
Revision 6 on kryptografisesti parempi, mutta yhteensopivuudeltaan vaikeampi. R6-tiedosto edellyttää PDF 1.7 Extension Level 3- tai PDF 2.0 -tukea, jota monissa käytössä olevissa arkistojärjestelmissä, upotetuissa renderöintimoottoreissa ja vanhoissa liiketoimintasovelluksissa ei ole. Ne voivat hylätä tiedoston asiakkaan koneessa. Siksi käytännöllinen oletus on revision 5. Valitse revision 6 vain, jos tietoturvakäytäntö nimeää ISO 32000-2 -revision ja kaikkien vastaanottajien tuki on testattu. Dokumentoi valinta ja sen peruste kummassakin tapauksessa
Vanhemmat THPDFKeyType-arvot k40, k128 ja aes128 ovat historiallisten arkistojen toistamista, eivät uusien tiedostojen suojaamista varten. 40-bit RC4 murtuu tavallisella laitteistolla, ja 128-bittiset järjestelmät edeltävät nykyisissä tietoturvatarkastuksissa odotettuja AES-256-revisioita. Vuonna 2026 luotavassa asiakirjassa todellinen valinta on revision 5:n ja revision 6:n välillä
Käyttöoikeusliput ilman avaussalasanaa
Jos asiakirjan on oltava kaikkien luettavissa mutta tulostusta tai poimintaa halutaan rajoittaa, käytä tyhjää user password -salasanaa ja muuta kuin tyhjää owner password -salasanaa. PDF kutsuu tätä open-password mode -tilaksi. Sallitut toiminnot luetellaan ProtectOptions-ominaisuudessa
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;
THPDFProtectOptions-joukko vastaa ISO-käyttöoikeusbittejä: prPrint ja prPrint12bit sallivat korkearesoluutioisen tulostuksen, prInformationCopy yleisen kopioinnin ja poiminnan ja prExtractContent avustavan teknologian tarvitseman poiminnan. Lisäksi käytettävissä ovat prModifyStructure, prEditAnnotations, prFillAnnotations ja prAssemble. Pidä prExtractContent käytössä lähes kaikissa profiileissa, koska ruudunlukija tarvitsee sitä tekstin lukemiseen. Pelkkä prPrint ilman prPrint12bit-arvoa voi taas saada useat katseluohjelmat heikentämään tulostuslaatua, mikä näyttää käyttäjälle renderöintivirheeltä
Tarkistus kuuluu julkaisuprosessiin. Avaa kunkin profiilin näyte Acrobatissa ja tarkista Document Properties -ikkunan Security-välilehdeltä algoritmi, esimerkiksi "AES 256-bit", sekä jokainen sallittu toiminto. Avaa sama tiedosto myös vanhimmassa asiakkaiden oikeasti käyttämässä katseluohjelmassa. Näin revision 6 -yhteensopivuusongelma löytyy ennen toimitusta
Suojauksen poistaminen olemassa olevista tiedostoista
Salauksen purkaminen käyttää samaa ominaisuusmallia käänteisesti. Lataa asiakirja kelvollisella tunnisteella, poista suojaus käytöstä ja tallenna tulos ilman sitä
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;
Tämä reitti jäsentää koko asiakirjan muistiin, mikä sopii tavallisille tiedostoille mutta kuluttaa turhaan muistia erittäin suurilla tiedostoilla. Satojen megatavujen syötteille DecryptFile on kevyempi: se purkaa salauksen tiedostotason kopioinnin aikana ja käyttää mahdollisuuksien mukaan suoraa AES-256-uudelleenkirjoitusta muodostamatta koko objektipuuta. Se kuuluu Direct File API -rajapintaan, jota käsitellään Delphillä tehtävää suurten PDF-tiedostojen käsittelyä koskevassa artikkelissa
Salaukseen vaikuttavat rajoitukset
Ensimmäinen rajoitus koskee arkistovaatimuksia. ISO 19005 kieltää salauksen PDF/A-tiedostoissa, joten salattu ja samalla PDF/A-yhteensopivaksi ilmoitettu asiakirja on ristiriitainen. HotPDF ei salli molempia samassa tiedostossa. Jos molemmat tarvitaan, tuota kaksi artefaktia: salattu jakelukopio ja erillinen salaamaton arkistokopio
Toinen rajoitus on ehdoton: PDF-salauksessa ei ole escrow- tai palautusmekanismia. Jos R5- tai R6-tiedoston user password katoaa, vaihtoehdot ovat brute force tai tiedostosta luopuminen. Käsittele owner password- ja user password -salaisuuksia tuotantotunnisteina: luo ja säilytä ne holvissa sekä kierrätä ne aikataulun mukaan. Älä kovakoodaa niitä unit-tiedoston vakioiksi, jolloin ne päätyvät versionhallintaan ja jokaisen kehittäjän työkopioon
Muualta saadun tiedoston suojauksen muuttaminen käyttää samaa mekanismia kuin salauksen purku. Lataa tiedosto salasanalla LoadFromFile-kutsulla, muuta ProtectOptions-arvoa tai salasanoja ja kirjoita tiedosto takaisin SaveLoadedDocument-kutsulla. Jos tiedoston salauksen voi purkaa, myös sen käyttöoikeudet voi määrittää uudelleen lähes samalla koodilla
Tässä esitetyt suojausominaisuudet kuuluvat Delphin ja C++Builderin tavalliseen HotPDF Component -tuotteeseen. Tuotesivulla on täydellinen salausviite ja koko käyttöoikeusluettelo