Zum Inhalt springen

PDF mit AES-256 verschlüsseln und Berechtigungen setzen

Dieses Recipe verschlüsselt ein Dokument mit AES-256. Es setzt ein Benutzerpasswort und ein Eigentümerpasswort und schränkt Operationen anhand einer Berechtigungsbitmaske ein. Das Recipe folgt examples/22-protection.php.

Reproduzierbarkeit — warum dieses Recipe structural und nicht bitwise ist. Ein AES-256-PDF kann in zwei Durchläufen niemals bytegenau identisch sein, selbst bei gleicher Eingabe und gleichen Passwörtern. Der Standard-Security-Handler in Revision 6 erzeugt 16 frische Zufallsbytes (die user/owner-Validierungs- und Schlüssel-Salts) pro Verschlüsselung mit einem starken Zufallszahlengenerator, bevor der Dateiverschlüsselungsschlüssel abgeleitet wird (ISO 32000-2 §7.6.4, Algorithmus 2.B). AES-256-CBC verwendet pro Objekt einen zufälligen Initialisierungsvektor. Der Trailer /ID ist ebenfalls ein Array aus zwei Byte-Strings, dessen erstes Element ein permanenter Bezeichner ist, der zum Erstellungszeitpunkt aus der Datei abgeleitet wird (ISO 32000-2 §14.4). Das Reproduzierbarkeitsprofil ist daher structural: Der Harness kanonisiert die Verschlüsselungs-Salts/IV, die Objektreihenfolge und die Trailer-/ID bevor zwei Durchläufe verglichen werden, statt eine unmögliche Byte-Übereinstimmung zu garantieren.

  • Core ist installiert: composer require nextpdf/core:^3.
  • Die PHP-Erweiterung openssl ist aktiviert; sie wird vom AES-256-Encryptor verwendet.
  1. Erstellen Sie das Dokument.
  2. Rufen Sie setEncryption() vor addPage() auf. Der Encryptor muss vorhanden sein, bevor ein Inhaltsobjekt geschrieben wird.
  3. Übergeben Sie ein Benutzerpasswort (zum Öffnen des Dokuments erforderlich), ein Eigentümerpasswort (Vollzugriff) und eine Berechtigungsbitmaske.
  4. Fügen Sie Inhalt hinzu und speichern Sie. Der Writer verschlüsselt jeden Objektkörper.
<?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)

Beim Öffnen von encrypted.pdf wird nach einem Passwort gefragt. Das Benutzerpasswort öffnet das Dokument mit dem eingeschränkten Berechtigungssatz. Das Eigentümerpasswort öffnet es mit Vollzugriff.

  • Aufrufreihenfolge. setEncryption() nach addPage() verschlüsselt bereits geschriebenen Inhalt nicht nachträglich. Konfigurieren Sie die Verschlüsselung immer zuerst.
  • Standard für das Eigentümerpasswort. Wenn das Eigentümerpasswort leer ist, verwendet die Engine das Benutzerpasswort auch als Eigentümerpasswort. Setzen Sie unterschiedliche Passwörter, wenn sich die beiden Rollen unterscheiden müssen.
  • Berechtigungssemantik — Grenze. Die Berechtigungsbits werden von konformen Readern beachtet. Sie werden jedoch nicht kryptografisch erzwungen: Ein Reader, der die Bits ignoriert, oder ein Tool, das mit dem Eigentümerpasswort verwendet wird, kann eingeschränkte Operationen ausführen. Behandeln Sie Berechtigungen als Richtliniensignal für kooperierende Software, nicht als Zugriffskontrolle, die einem entschlossenen Akteur standhält.
  • PDF/A-Konflikt. PDF/A verbietet den Trailer-Schlüssel Encrypt. Der Aufruf von setEncryption() auf einem PDF/A-Dokument wirft unabhängig von der Reihenfolge eine Inkompatibilitäts-Exception. Siehe PDF/A-4-Konformitäts-Gate.
  • AES-256-GCM. useAesGcm() aktiviert die ISO/TS-32003-GCM-Bulk-Verschlüsselung, wenn OpenSSL auf dem Hostsystem oder libsodium die Chiffre unterstützt. Andernfalls wird InvalidConfigException geworfen.
AussageSpezifikationAbschnittreference_id
Der Standard-Security-Handler definiert den Verschlüsselungsalgorithmus und die Schlüssellänge.ISO 32000-2§7.6
Der Eintrag P im Verschlüsselungs-Dictionary trägt die Berechtigungsbits.ISO 32000-2§7.6

Die Verschlüsselung schützt die Vertraulichkeit des Inhalts gegenüber Parteien ohne das Passwort. Berechtigungsbits dienen Readern nur als Hinweis und halten ein nicht-konformes Tool für sich genommen nicht von entsprechenden Operationen ab.