Salta ai contenuti

Modello di sicurezza per firma e cifratura

Questa pagina descrive il modello di sicurezza per le due superfici crittografiche esposte dal core engine: la cifratura del documento (AES-256) e la firma del documento (CMS/PAdES). Spiega cosa protegge ciascun meccanismo, cosa non protegge e dove si colloca il relativo confine di fiducia.

Confine. Il supporto di un meccanismo crittografico non è una garanzia della sua sicurezza nella distribuzione in uso. La robustezza di un documento cifrato dipende dalla password scelta e dalle modalità di custodia della chiave. Il significato di una firma dipende dal certificato, dal trust anchor, dall’autorità di marca temporale e dalla policy del verificatore. Il certificato, il trust anchor, l’autorità di marca temporale e la policy del verificatore sono tutti esterni a questa libreria. Questa pagina descrive il meccanismo; non certifica il risultato.

Terminal window
composer require nextpdf/core:^3

ext-openssl è necessaria per i percorsi di firma e CMS.

Nel core engine, la cifratura è il security handler AES-256 di ISO 32000-2 §7.6 (AESV3, Revision 6) (iso32000_2_sec7#x1.x65.p29). Fornisce riservatezza: chi non possiede la password non può leggere il contenuto di stringhe e flussi. Non fornisce integrità o autenticità. Un testo cifrato può comunque essere troncato o sostituito. Rilevare un testo cifrato troncato o sostituito è compito di una firma o di un MAC del documento, non del security handler di cifratura.

I permessi (stampa, copia, modifica) sono un concetto distinto e una frequente fonte di equivoci sul piano della fiducia. I flag di permesso di ISO 32000-2 sono reader-cooperative (iso32000_2_sec7#x1.x71.p27). Un reader conforme li rispetta, ma sono metadati indicativi, non un controllo di accesso crittografico. Uno strumento non cooperante può ignorarli. L’engine li emette fedelmente; non può farli rispettare.

La firma è una struttura CMS SignedData incorporata secondo ISO 32000-2 §12.8. Il byte range firmato è un oggetto diretto e il digest esclude deliberatamente il valore Contents della firma (iso32000_2_sec12#x1.x121.p45), in modo che la firma copra il documento ma non sé stessa.

Questa pagina non documenta di nuovo le firme. I punti di ingresso della cifratura e l’orchestratore della firma sono descritti in /modules/core/security/ e /modules/core/security/signing/. Il modello qui riguarda il significato e il confine, non la forma dei metodi.

La cifratura protegge la riservatezza rispetto ai soggetti privi della password — e niente di più:

<?php
declare(strict_types=1);
require_once __DIR__ . '/vendor/autoload.php';
use NextPDF\Core\Document;
$doc = new Document();
// AES-256 (AESV3 R6). The owner/user passwords gate read access only.
// Permission flags below are advisory: a conforming reader honors them.
$doc->encrypt(
userPassword: 'open-secret',
ownerPassword: 'owner-secret',
);
$doc->save('confidential.pdf');

In produzione, un flusso di firma applica una firma baseline CMS/PAdES con una chiave gestita via software. La Core edition produce il livello PAdES B-B. Quando è configurata un’autorità di marca temporale, la Core edition produce PAdES B-T, ovvero B-B più un singolo attributo non firmato RFC 3161 signature-time-stamp:

<?php
declare(strict_types=1);
require_once __DIR__ . '/vendor/autoload.php';
use NextPDF\Core\Document;
use NextPDF\Security\Signature\CertificateInfo;
use NextPDF\Security\Signature\SignatureLevel;
$cert = CertificateInfo::fromPkcs12('signer.p12', 'pin');
$doc = new Document();
// B-B is the default. B-T adds a trusted timestamp over the signature value.
$doc->setSignature($cert, SignatureLevel::PAdES_B_B);
$doc->save('signed.pdf');

PAdES B-T corrisponde esattamente a B-B più un attributo non firmato RFC 3161 signature-time-stamp trasportato nel CMS SignerInfo (rfc5652#p603). La marca temporale lega il valore della firma a un orario attendibile ottenuto da un’autorità di marca temporale (rfc3161#p208). Non aggiunge un dizionario di validation-data, una struttura di revocation-information né un ciclo di archive-timestamp. Sono livelli a lungo termine distinti, con ambito separato, che non fanno parte della superficie B-B/B-T e che esulano dall’ambito di questa pagina.

U-1. NextPDF non dichiara alcuna certificazione indipendente ETSI EN 319 142-1 per PAdES B-T. EN 319 142-1 non è incluso nel corpus di verifica usato qui. Il requisito B-T signature-time-stamp è verificato rispetto a ETSI EN 319 122-1 §5.3 — la base CAdES che la famiglia EN 319 142 PAdES importa per riferimento (etsi_en_319_122_1#6.x40.p96) — insieme a RFC 3161, RFC 5652 e ISO 32000-2 §12.8. Il supporto del profilo B-T non è una certificazione di conformità né di validità legale. Tale determinazione spetta a un validatore indipendente.

  • Cifratura ≠ integrità. Un reader in grado di aprire il documento può comunque ricevere una copia manomessa. Solo una firma (o un MAC del documento) può rilevarlo. «A prova di manomissione» non è una proprietà fornita dal security handler di cifratura e il termine non viene utilizzato come dichiarazione di prodotto.
  • La presenza di una firma non è la sua validità. Il fatto che un documento contenga un dizionario di firma non indica se il certificato sia attendibile, non scaduto o non revocato. Stabilire la validità è un’operazione lato verificatore, regolata dalla policy della relying party, non dal firmatario.
  • La fiducia nella marca temporale è esterna. Una marca temporale B-T è significativa solo nella misura in cui il verificatore si fida dell’autorità di marca temporale che l’ha emessa. La libreria ottiene e incorpora il token. Non offre garanzie sulla TSA.
  • La conformità FIPS è ambientale. L’esecuzione su un modulo crittografico convalidato FIPS è una proprietà dell’ambiente operativo e del modulo (fips_140_3#x12), non una proprietà che una libreria PHP possa dichiarare per conto del proprio chiamante.

Il percorso di firma calcola un digest del byte range e una struttura CMS. L’estensione B-T aggiunge un round-trip sincrono verso l’autorità di marca temporale. La cifratura è un’operazione simmetrica per-string/per-stream. Nessuna delle due operazioni domina il costo di un rendering tipico. Il round-trip di rete per B-T è il costo variabile e dipende dalla scelta della TSA da parte del chiamante.

Dichiarazioni di confine, riformulate come regole applicabili da un revisore:

  1. Solo riservatezza. La cifratura AES-256 protegge il contenuto rispetto ai soggetti privi della password. Non è integrità, non è autenticità, non è controllo di accesso (iso32000_2_sec7#x1.x65.p29).
  2. I permessi sono indicativi. I flag di permesso sono reader-cooperative e non sono applicati crittograficamente (iso32000_2_sec7#x1.x71.p27). Nessuna formulazione di prodotto dichiara che impediscano un’azione.
  3. Solo B-B e B-T in questa pagina. La superficie di firma core/Pro documentata qui copre B-B e la sua estensione di marca temporale B-T; ogni menzione di B-T è affiancata alla precisazione U-1 riportata sopra. I livelli di archiviazione a lungo termine sono una superficie separata, della paid edition, e non sono descritti qui intenzionalmente. In questa pagina non viene dichiarata alcuna capacità di validation-data, revocation-information o archive-timestamp.
  4. Nessuna dichiarazione di validità legale. Una firma prodotta è un artefatto crittografico. Il fatto che sia legalmente valida dipende dalla giurisdizione, dalla certificate policy e dalla relying party — non da questa libreria.

Il supporto non equivale alla conformità. L’engine produce output che utilizza i costrutti citati di ISO 32000-2, RFC 3161, RFC 5652 ed ETSI EN 319 122-1. L’engine non dichiara conformità a PAdES, CAdES o eIDAS. La convalida FIPS 140-3 è una proprietà del module/environment (fips_140_3#x12), non una dichiarazione della libreria. Qualsiasi determinazione di conformità o di validità legale spetta a un validatore o valutatore indipendente.