Pular para o conteúdo

Criptografe um PDF com AES-256 e configure permissões

Use esta receita para criptografar um documento com AES-256. Você define uma senha de usuário, uma senha de proprietário e uma máscara de bits de permissões que restringe as operações permitidas. Esta receita se baseia em examples/22-protection.php.

Reprodutibilidade — por que esta receita é structural, e não bitwise. Um PDF criptografado com AES-256 nunca é idêntico byte a byte entre execuções, mesmo com a mesma entrada e as mesmas senhas. Antes de derivar a chave de criptografia do arquivo, o manipulador de segurança padrão da revisão 6 gera 16 novos bytes aleatórios (os salts de validação e de chave de user/owner) para cada criptografia, usando um gerador forte de números aleatórios (ISO 32000-2 §7.6.4, Algorithm 2.B). O AES-256-CBC usa um vetor de inicialização aleatório para cada objeto. O trailer /ID também é um array com duas cadeias de bytes. Seu primeiro elemento é um identificador permanente derivado do arquivo no momento da criação (ISO 32000-2 §14.4). O perfil de reprodutibilidade é, portanto, structural: antes de comparar duas execuções, o harness canonicaliza os salts/IV de criptografia, a ordem dos objetos e o /ID do trailer, em vez de exigir uma correspondência de bytes impossível.

  • Core instalado: composer require nextpdf/core:^3.
  • A extensão PHP openssl habilitada, exigida pelo criptografador AES-256.
  1. Crie o documento.
  2. Chame setEncryption() antes de addPage(). O criptografador precisa estar pronto antes que qualquer objeto de conteúdo seja gravado.
  3. Informe uma senha de usuário (necessária para abrir o documento), uma senha de proprietário (para acesso total) e uma máscara de bits de permissões.
  4. Adicione o conteúdo e salve. O gravador criptografa o corpo de cada objeto.
<?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)

Quando você abre encrypted.pdf, o leitor solicita uma senha. A senha de usuário abre o documento com o conjunto de permissões restrito. A senha de proprietário abre o documento com acesso total.

  • Ordem de chamada. setEncryption() após addPage() não criptografa retroativamente o conteúdo já gravado. Sempre configure a criptografia primeiro.
  • Padrão da senha de proprietário. Quando a senha de proprietário está vazia, o engine reutiliza a senha de usuário como senha de proprietário. Defina senhas distintas quando essas funções precisarem ser diferentes.
  • Semântica de permissões — limite. Leitores em conformidade respeitam os bits de permissão. Esses bits não são impostos criptograficamente: um leitor que ignore os bits, ou uma ferramenta usada com a senha de proprietário, pode realizar operações restritas. Trate as permissões como um sinal de política para softwares cooperativos, não como um controle de acesso que resista a uma parte determinada.
  • Conflito com PDF/A. O PDF/A proíbe a chave de trailer Encrypt. Chamar setEncryption() em um documento PDF/A, em qualquer ordem, lança uma exceção de incompatibilidade. Consulte Gate de conformidade PDF/A-4.
  • AES-256-GCM. useAesGcm() ativa a criptografia em massa GCM do ISO/TS 32003 quando a cifra está disponível no OpenSSL ou no libsodium do host. Caso contrário, lança InvalidConfigException.
DeclaraçãoEspecificaçãoCláusulareference_id
O manipulador de segurança padrão define o algoritmo de criptografia e o comprimento da chave.ISO 32000-2§7.6
A entrada P do dicionário de criptografia carrega os bits de permissão.ISO 32000-2§7.6

A criptografia protege a confidencialidade do conteúdo contra partes que não têm a senha. Os bits de permissão são consultivos para os leitores e, por si só, não impedem que uma ferramenta fora de conformidade realize ações.