Chiffrer un PDF avec AES-256 et définir les permissions
Cette recette chiffre un document avec AES-256. Elle définit un mot de passe utilisateur et un mot de passe propriétaire, puis restreint les opérations au moyen d’un masque binaire de permissions. Elle suit examples/22-protection.php.
Reproductibilité — pourquoi cette recette est
structural, pasbitwise. Un PDF chiffré avec AES-256 ne peut jamais être identique octet pour octet d’une exécution à l’autre, même avec la même entrée et les mêmes mots de passe. Le gestionnaire de sécurité standard de révision 6 génère 16 octets aléatoires frais (les sels de validation et de clé user/owner) à chaque chiffrement au moyen d’un générateur de nombres aléatoires robuste avant de dériver la clé de chiffrement du fichier (ISO 32000-2 §7.6.4, algorithme 2.B). L’AES-256-CBC utilise un vecteur d’initialisation aléatoire par objet. Le trailer/IDest lui aussi un tableau de deux chaînes d’octets dont le premier élément est un identifiant permanent dérivé du fichier au moment de sa création (ISO 32000-2 §14.4). Le profil de reproductibilité est doncstructural: le harnais de test canonicalise les sels et l’IV de chiffrement, l’ordre des objets et le/IDdu trailer avant de comparer deux exécutions, plutôt que d’affirmer une correspondance octet par octet impossible.
Prérequis
Section intitulée « Prérequis »- Cœur installé :
composer require nextpdf/core:^3. - L’extension PHP
openssl, utilisée par le chiffreur AES-256.
- Crée le document.
- Appelle
setEncryption()avantaddPage(). Le chiffreur doit exister avant que le moindre objet de contenu soit écrit. - Passe un mot de passe utilisateur (requis pour ouvrir le document), un mot de passe propriétaire (accès complet) et un masque binaire de permissions.
- Ajoute du contenu et enregistre. L’écrivain chiffre le corps de chaque objet.
Exemple complet
Section intitulée « Exemple complet »<?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";Sortie attendue
Section intitulée « Sortie attendue »Wrote encrypted.pdf (AES-256, printing only)À l’ouverture, encrypted.pdf demande un mot de passe. Le mot de passe utilisateur permet de l’ouvrir avec le jeu de permissions restreint. Le mot de passe propriétaire permet de l’ouvrir avec un accès complet.
Cas limites
Section intitulée « Cas limites »- Ordre des appels.
setEncryption()aprèsaddPage()ne chiffre pas rétroactivement le contenu déjà écrit. Configure toujours le chiffrement en premier. - Valeur par défaut du mot de passe propriétaire. Quand le mot de passe propriétaire est vide, le moteur réutilise le mot de passe utilisateur comme mot de passe propriétaire. Définis des mots de passe distincts quand les deux rôles doivent différer.
- Sémantique des permissions — limite. Les bits de permission sont respectés par les lecteurs conformes. Ils ne sont pas appliqués cryptographiquement : un lecteur qui ignore les bits, ou un outil utilisé avec le mot de passe propriétaire, peut effectuer des opérations restreintes. Traite les permissions comme un signal de politique destiné aux logiciels coopératifs, et non comme un contrôle d’accès capable de résister à un acteur déterminé.
- Conflit avec PDF/A. PDF/A interdit la clé de trailer
Encrypt. AppelersetEncryption()sur un document PDF/A, quel que soit l’ordre, lève une exception d’incompatibilité. Voir Portail de conformité PDF/A-4. - AES-256-GCM.
useAesGcm()active le chiffrement en masse GCM de l’ISO/TS 32003 lorsque ce chiffrement est pris en charge par OpenSSL ou la libsodium de l’hôte. Sinon, il lèveInvalidConfigException.
Conformité
Section intitulée « Conformité »| Énoncé | Spécification | Article | reference_id |
|---|---|---|---|
| Le gestionnaire de sécurité standard définit l’algorithme de chiffrement et la longueur de clé. | ISO 32000-2 | §7.6 | |
L’entrée P du dictionnaire de chiffrement porte les bits de permission. | ISO 32000-2 | §7.6 |
Le chiffrement protège la confidentialité du contenu vis-à-vis des parties qui n’ont pas le mot de passe. Les bits de permission sont consultatifs pour les lecteurs et n’empêchent pas, à eux seuls, un outil non conforme d’agir.