Salta ai contenuti

Cifrare un PDF con AES-256 e configurare le autorizzazioni

Questa ricetta mostra come cifrare un documento con AES-256, impostando una password utente e una password proprietario e limitando le operazioni tramite una bitmask delle autorizzazioni. Segue examples/22-protection.php.

Riproducibilità — perché questa ricetta è structural, non bitwise. Un PDF AES-256 non può mai essere byte-identico tra due esecuzioni, neppure a parità di input e password. Il gestore di sicurezza standard di revisione 6 genera 16 byte casuali nuovi (per la convalida user/owner e i salt della chiave) per ogni cifratura, tramite un generatore di numeri casuali robusto, prima di derivare la chiave di cifratura del file (ISO 32000-2 §7.6.4, algoritmo 2.B). AES-256-CBC utilizza un vettore di inizializzazione casuale per ogni oggetto. Il trailer /ID è anch’esso un array di due stringhe di byte il cui primo elemento è un identificatore permanente derivato dal file al momento della creazione (ISO 32000-2 §14.4). Il profilo di riproducibilità è quindi structural: l’harness canonicalizza i salt/IV di cifratura, l’ordine degli oggetti e l’/ID del trailer prima di confrontare due esecuzioni, invece di pretendere una corrispondenza byte per byte impossibile.

  • Core installato: composer require nextpdf/core:^3.
  • L’estensione PHP openssl deve essere abilitata; è usata dal componente di cifratura AES-256.
  1. Creare il documento.
  2. Chiamare setEncryption() prima di addPage(). Il componente di cifratura deve essere presente prima che venga scritto qualunque oggetto di contenuto.
  3. Passare una password utente (richiesta per aprire il documento), una password proprietario (accesso completo) e una bitmask delle autorizzazioni.
  4. Aggiungere il contenuto e salvare. Il writer cifra il corpo di ogni oggetto.
<?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)

Per aprire encrypted.pdf è richiesta una password. La password utente consente di aprirlo con il set di autorizzazioni limitato. La password proprietario consente di aprirlo con accesso completo.

  • Ordine di chiamata. setEncryption() dopo addPage() non cifra retroattivamente il contenuto già scritto. Configurare sempre prima la cifratura.
  • Password proprietario predefinita. Quando la password proprietario è vuota, il motore riutilizza la password utente come password proprietario. Impostare password distinte quando i due ruoli devono rimanere separati.
  • Semantica delle autorizzazioni — limite. I bit delle autorizzazioni sono rispettati dai reader conformi. Non sono applicati a livello crittografico: un reader che ignora i bit, oppure uno strumento usato con la password proprietario, può eseguire le operazioni soggette a restrizione. Considerare le autorizzazioni come un’indicazione di criterio destinata al software cooperante, non come un controllo di accesso in grado di resistere a un soggetto determinato.
  • Conflitto con PDF/A. PDF/A vieta la chiave Encrypt del trailer. Chiamare setEncryption() su un documento PDF/A, in qualsiasi ordine, genera un’eccezione di incompatibilità. Vedere Gate di conformità PDF/A-4.
  • AES-256-GCM. useAesGcm() abilita la cifratura in blocco GCM di ISO/TS 32003 quando OpenSSL o libsodium sull’host rendono disponibile il cifrario. In caso contrario, genera InvalidConfigException.
DichiarazioneSpecificaClausolareference_id
Il gestore di sicurezza standard definisce l’algoritmo di cifratura e la lunghezza della chiave.ISO 32000-2§7.6
La voce P del dizionario di cifratura contiene i bit delle autorizzazioni.ISO 32000-2§7.6

La cifratura tutela la riservatezza del contenuto rispetto alle parti che non dispongono della password. I bit delle autorizzazioni hanno valore indicativo per i reader e, da soli, non impediscono a uno strumento non conforme di agire.