Ga naar inhoud

Een PDF versleutelen met AES-256 en machtigingen instellen

Gebruik dit recept om een document met AES-256 te versleutelen. Je stelt een gebruikerswachtwoord, een eigenaarswachtwoord en een machtigingsbitmasker in dat de toegestane bewerkingen beperkt. Het recept volgt examples/22-protection.php.

Reproduceerbaarheid — waarom dit recipe structural is en niet bitwise. Een AES-256-PDF is tussen afzonderlijke runs nooit byte-identiek, zelfs niet met dezelfde invoer en dezelfde wachtwoorden. Voordat de bestandsversleutelingssleutel wordt afgeleid, genereert de standaard security handler van revisie 6 per versleuteling 16 nieuwe willekeurige bytes (de user/owner validatie- en sleutel-salts) met een sterke generator voor willekeurige getallen (ISO 32000-2 §7.6.4, Algorithm 2.B). AES-256-CBC gebruikt voor elk object een willekeurige initialisatievector. De trailer- /ID is eveneens een array van twee byte-strings. Het eerste element is een permanente identifier die bij het aanmaken uit het bestand wordt afgeleid (ISO 32000-2 §14.4). Daarom is het reproduceerbaarheidsprofiel structural: voordat twee runs worden vergeleken, canoniseert de harness de versleutelings-salts/IV, de objectvolgorde en de trailer-/ID, in plaats van een onmogelijke byte-overeenkomst af te dwingen.

  • Core geïnstalleerd: composer require nextpdf/core:^3.
  • De PHP-extensie openssl moet ingeschakeld zijn; die is vereist voor de AES-256-encryptor.
  1. Maak het document aan.
  2. Roep setEncryption() vóór addPage() aan. De encryptor moet gereed zijn voordat er een inhoudsobject wordt geschreven.
  3. Geef een gebruikerswachtwoord (vereist om het document te openen), een eigenaarswachtwoord (voor volledige toegang) en een machtigingsbitmasker door.
  4. Voeg inhoud toe en sla op. De writer versleutelt de body van elk object.
<?php
declare(strict_types=1);
require_once __DIR__ . '/vendor/autoload.php';
use NextPDF\Core\Document;
// Permission bits (ISO 32000-2, encryption dictionary P entry):
// bit 3 (4) allow printing
// bit 4 (8) allow content modification
// bit 5 (16) allow text extraction / copying
// bit 6 (32) allow annotation and form editing
// Grant printing only:
$permissions = 4;
$doc = Document::createStandalone();
$doc->setTitle('Encrypted Document');
// setEncryption() MUST run before addPage(). Order matters.
$doc->setEncryption(
userPassword: 'open-me',
ownerPassword: 'owner-secret',
permissions: $permissions,
);
$doc->addPage();
$doc->setFont('helvetica', '', 12);
$doc->cell(0, 10, 'This document is encrypted with AES-256.', newLine: true);
$doc->save(__DIR__ . '/encrypted.pdf');
echo "Wrote encrypted.pdf (AES-256, printing only)\n";
Wrote encrypted.pdf (AES-256, printing only)

Wanneer je encrypted.pdf opent, vraagt de reader om een wachtwoord. Met het gebruikerswachtwoord open je het document met de beperkte machtigingenset. Met het eigenaarswachtwoord open je het met volledige toegang.

  • Aanroepvolgorde. setEncryption() na addPage() versleutelt eerder geschreven inhoud niet met terugwerkende kracht. Stel versleuteling daarom altijd eerst in.
  • Standaard eigenaarswachtwoord. Als het eigenaarswachtwoord leeg is, hergebruikt de engine het gebruikerswachtwoord als eigenaarswachtwoord. Stel verschillende wachtwoorden in als deze rollen van elkaar moeten verschillen.
  • Machtigingssemantiek — beperking. Conforme readers respecteren de machtigingsbits. Ze worden niet cryptografisch afgedwongen: een reader die de bits negeert, of een tool die met het eigenaarswachtwoord wordt gebruikt, kan beperkte bewerkingen uitvoeren. Behandel machtigingen als een beleidssignaal voor meewerkende software, niet als toegangsbeheer dat bestand is tegen een vastberaden partij.
  • PDF/A-conflict. PDF/A verbiedt de trailer-sleutel Encrypt. Het aanroepen van setEncryption() op een PDF/A-document werpt, ongeacht de aanroepvolgorde, een incompatibiliteitsuitzondering. Zie PDF/A-4-conformiteitspoort.
  • AES-256-GCM. useAesGcm() schakelt ISO/TS 32003 GCM-bulkversleuteling in wanneer de host-OpenSSL of libsodium het cipher beschikbaar stelt. Anders werpt het InvalidConfigException.
BeweringSpecificatieClausulereference_id
De standaard security handler bepaalt het versleutelingsalgoritme en de sleutellengte.ISO 32000-2§7.6
De P-entry van de versleutelingsdictionary bevat de machtigingsbits.ISO 32000-2§7.6

Versleuteling beschermt de vertrouwelijkheid van de inhoud tegen partijen zonder het wachtwoord. Machtigingsbits zijn adviserend voor readers en verhinderen op zichzelf niet dat een niet-conforme tool actie onderneemt.