Pular para o conteúdo

Modelo de segurança para assinaturas e criptografia

Esta página define o modelo de segurança das duas superfícies criptográficas expostas pelo core engine: a criptografia de documentos com Advanced Encryption Standard 256-bit (AES-256) e a assinatura de documentos com Cryptographic Message Syntax (CMS)/PDF Advanced Electronic Signatures (PAdES). Ela explica o que cada mecanismo protege, o que não protege e onde fica o limite de confiança.

Limite. O suporte a um mecanismo criptográfico não garante segurança da sua implantação. A robustez de um documento criptografado depende da senha e da custódia de chaves que você escolher. O significado de uma assinatura depende do certificado, da âncora de confiança, da autoridade de carimbo de tempo e da política do verificador. Esses controles ficam fora desta biblioteca. Esta página descreve o mecanismo; não certifica o resultado.

Terminal window
composer require nextpdf/core:^3

ext-openssl é necessária para os fluxos de assinatura e CMS.

No core engine, a criptografia usa o security handler AES-256 (AESV3, Revision 6) da ISO 32000-2 §7.6 (iso32000_2_sec7#x1.x65.p29). Ela fornece confidencialidade: quem não tem a senha não consegue ler o conteúdo de strings e streams. Ela não fornece integridade nem autenticidade. Um texto cifrado ainda pode ser truncado ou substituído. Uma assinatura ou um message authentication code (MAC) de documento deve detectar esse tipo de alteração; o encryption handler não detecta.

As permissões (imprimir, copiar, modificar) são separadas, e é fácil interpretá-las de forma errada. Os flags de permissão da ISO 32000-2 dependem da cooperação do leitor (iso32000_2_sec7#x1.x71.p27). Um leitor em conformidade os respeita, mas eles são metadados de caráter consultivo, não um controle de acesso criptográfico. Uma ferramenta não cooperativa pode ignorá-los. O engine os emite fielmente; não consegue impô-los.

Para a assinatura, o engine incorpora uma estrutura CMS SignedData conforme descrito na ISO 32000-2 §12.8. O byte range assinado é um objeto direto, e o digest exclui deliberadamente o valor Contents da assinatura (iso32000_2_sec12#x1.x121.p45), de modo que a assinatura cobre o documento, mas não a si mesma.

Esta página não repete a referência de assinatura. Os pontos de entrada de criptografia e o orquestrador de assinatura estão descritos em /modules/core/security/ e /modules/core/security/signing/. Este modelo trata do significado e dos limites, não do formato dos métodos.

A criptografia protege a confidencialidade contra quem não tem a senha, e nada além disso:

<?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');

Um fluxo de assinatura de produção aplica uma assinatura baseline CMS/PAdES com uma chave mantida em software. A edição Core produz o nível PAdES B-B. Quando você configura uma autoridade de carimbo de tempo, a edição Core produz PAdES B-T, que equivale ao B-B mais um único atributo não assinado signature-time-stamp da RFC 3161:

<?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');

O PAdES B-T é exatamente o B-B mais um atributo não assinado signature-time-stamp da RFC 3161 carregado no SignerInfo do CMS (rfc5652#p603). O carimbo de tempo vincula o valor da assinatura a um tempo confiável de uma autoridade de carimbo de tempo (rfc3161#p208). Ele não adiciona um dicionário de validation-data, uma estrutura de revocation-information nem um loop de archive-timestamp. Esses são níveis de longo prazo distintos, com escopo separado, que não fazem parte da superfície B-B/B-T e ficam fora do escopo desta página.

U-1. O NextPDF não declara certificação independente ETSI EN 319 142-1 para o PAdES B-T. A EN 319 142-1 não está no corpus de verificação usado aqui. O requisito de signature-time-stamp do B-T é verificado em relação à ETSI EN 319 122-1 §5.3 — a base CMS Advanced Electronic Signatures (CAdES) que a família PAdES da EN 319 142 importa por referência (etsi_en_319_122_1#6.x40.p96) — juntamente com a RFC 3161, a RFC 5652 e a ISO 32000-2 §12.8. O suporte ao perfil B-T não equivale a uma certificação de conformidade nem a uma certificação de validade jurídica. Cabe a um validador independente fazer essa determinação.

  • Criptografia ≠ integridade. Um leitor que consegue abrir o documento ainda pode receber uma cópia adulterada. Apenas uma assinatura (ou um MAC de documento) detecta isso. “À prova de adulteração” não é uma propriedade fornecida pelo encryption handler, e o termo não é usado como alegação de produto.
  • A presença de uma assinatura não equivale à sua validade. O fato de um documento carregar um dicionário de assinatura não diz nada sobre se o certificado é confiável, não expirado ou não revogado. Estabelecer a validade é uma operação do lado do verificador, regida pela política da parte confiante, não pelo signatário.
  • A confiança no carimbo de tempo é externa. Um carimbo de tempo B-T só tem significado na medida da confiança que o verificador deposita na autoridade de carimbo de tempo (TSA) que o emitiu. A biblioteca obtém e incorpora o token. Ela não atesta a TSA.
  • A postura FIPS é ambiental. A execução em um módulo criptográfico validado por FIPS é uma propriedade do ambiente operacional e do módulo (fips_140_3#x12), não algo que uma biblioteca PHP possa afirmar em nome de quem a chama.

O fluxo de assinatura calcula um digest de byte-range e uma estrutura CMS. A extensão B-T adiciona um round-trip síncrono à autoridade de carimbo de tempo. A criptografia é uma operação simétrica per-string/per-stream. Nenhuma das duas costuma dominar uma renderização típica. O round-trip de rede do B-T é o custo variável, e ele depende da TSA escolhida por quem chama.

As declarações de limite, reformuladas como regras aplicáveis para revisores:

  1. Apenas confidencialidade. A criptografia AES-256 protege o conteúdo contra quem não tem a senha. Ela não fornece integridade, autenticidade nem controle de acesso (iso32000_2_sec7#x1.x65.p29).
  2. As permissões são consultivas. Os flags de permissão dependem da cooperação do leitor e não são impostos criptograficamente (iso32000_2_sec7#x1.x71.p27). O texto do produto não deve alegar que eles impedem uma ação.
  3. Apenas B-B e B-T nesta página. A superfície de assinatura core/Pro documentada aqui cobre o B-B e sua extensão de carimbo de tempo B-T, com cada menção a B-T junto da ressalva U-1 acima. Os níveis de arquivamento de longo prazo são uma superfície separada, de edição paga, e não são descritos aqui intencionalmente. Nenhuma capacidade de validation-data, revocation-information ou archive-timestamp é afirmada nesta página.
  4. Nenhuma alegação de validade jurídica. Uma assinatura produzida é um artefato criptográfico. Se ela é juridicamente válida depende da jurisdição, da política de certificado e da parte confiante, não desta biblioteca.

Suporte não é conformidade. O engine produz uma saída que usa os construtos citados da ISO 32000-2, da RFC 3161, da RFC 5652 e da ETSI EN 319 122-1. O engine não declara conformidade PAdES, CAdES nem eIDAS. A validação FIPS 140-3 é uma propriedade de module/environment (fips_140_3#x12), não uma alegação da biblioteca. Um validador ou avaliador independente faz qualquer determinação de conformidade ou de validade jurídica.