Enterprise edición
Marca de agua digital e incrustación esteganográfica
De un vistazo
Sección titulada «De un vistazo»NextPDF Enterprise incrusta una carga útil oculta y cifrada en un PDF generado realizando pequeños ajustes controlados en el espaciado entre pares de letras. Usted suministra una carga útil —normalmente un identificador por destinatario— y una clave secreta; el codificador escribe la carga útil como desviaciones imperceptibles del interletraje natural del texto. Un decodificador correspondiente, dada la misma clave, recupera la carga útil. Esta página es de nivel de comportamiento: indica qué escribe el codificador, la criptografía que utiliza y el límite de la técnica.
El uso previsto es el rastreo interno de fugas de documentos: cuando un documento controlado se filtra, el marcador recuperado identifica la copia del destinatario. No es esteganografía adversaria ni una garantía de supervivencia a través de un procesamiento arbitrario.
Los requisitos previos se indican en el frontmatter y se repiten en Requisitos previos.
Disponibilidad y licencia
Sección titulada «Disponibilidad y licencia»Esta capacidad se incluye en NextPDF Enterprise (nextpdf/enterprise) y se activa con un sobre de licencia de nivel Enterprise. Un despliegue sin esa habilitación no carga las clases de la capacidad. La capacidad se ejecuta enteramente en proceso durante la generación del documento; ningún contenido del documento sale del host. Comparar ediciones y obtener una licencia.
Qué hace esta capacidad
Sección titulada «Qué hace esta capacidad»El texto de PDF dibujado con un arreglo de interletraje transporta un ajuste numérico entre glifos. El codificador trata cada posición de ajuste como un portador de unos pocos bits:
- Cifra la carga útil con un cifrado de cifrado autenticado con datos asociados (AEAD) —AES-256-GCM de manera predeterminada, o ChaCha20-Poly1305—. AEAD proporciona tanto confidencialidad como integridad, de modo que un portador manipulado falla en el descifrado en lugar de producir silenciosamente una carga útil incorrecta.
- Deriva la clave de cifrado de 32 bytes a partir de su clave secreta y la clave de la fuente usando la función de derivación de claves basada en HMAC (HKDF) con SHA-256. HKDF extrae una clave pseudoaleatoria de longitud fija a partir del material de claves de entrada y luego la expande a la longitud requerida, según RFC 5869 §2.
- Genera un vector de inicialización (IV) aleatorio nuevo de 12 bytes por cifrado. AES-GCM requiere que el IV sea único para una clave dada, o se pierde la garantía de autenticación, según NIST SP 800-38D §5.2.1.
- Asigna los bytes cifrados a una secuencia de bits y distribuye los bits entre las posiciones de pares de letras disponibles, codificando uno o dos bits por posición. La desviación que añade al interletraje natural está acotada por una fracción configurable del em — lo bastante pequeña como para permanecer visualmente imperceptible.
El decodificador invierte el proceso: lee los ajustes de interletraje de un flujo de contenido, resta el interletraje natural, cuantiza las desviaciones de vuelta a bits, reensambla el blob cifrado y lo descifra con la misma clave. Si la clave es incorrecta o el portador fue destruido, el descifrado no devuelve nada en lugar de una carga útil incorrecta.
La capacidad escala con la longitud del texto: cada posición de par de letras transporta uno o dos bits, por lo que una carga útil debe caber en las posiciones que proporciona el texto. El codificador genera un error de desbordamiento tipado cuando la carga útil supera la capacidad.
Un modo de compatibilidad con PDF/A reduce a la mitad la desviación máxima para mantenerse por debajo del umbral de tolerancia de anchura de un validador, intercambiando capacidad por una conformidad más estricta.
Por qué funciona así
Sección titulada «Por qué funciona así»La decisión determinante es ocultar el marcador en el interletraje en lugar de en una superposición visible o un campo de metadatos. Un marcador de metadatos es trivial de eliminar, y un sello visible altera la página. Las desviaciones de interletraje, en cambio, viajan dentro del texto que el destinatario debe conservar, y permanecen imperceptibles. El cifrado autenticado es el segundo pilar: un portador manipulado o parcial falla la autenticación, de modo que el decodificador no devuelve nada en lugar de un destinatario incorrecto. La clave se deriva por fuente con HKDF, vinculando el marcador al contexto del documento, no a un secreto compartido desnudo. La divulgación honesta de robustez se sigue directamente: el marcador sobrevive a la redistribución ordinaria pero no a la reescritura deliberada del flujo de contenido, por lo que el alcance declarado es el rastreo interno de fugas, no la esteganografía adversaria.
Contexto de diseño: La redacción no es un rectángulo negro.
Requisitos previos
Sección titulada «Requisitos previos»- Instale NextPDF Core y el paquete Enterprise, y disponga de una licencia de Enterprise activa.
- Genere el documento con una fuente que exponga métricas de pares de interletraje; el codificador lee el interletraje natural de las métricas de la fuente.
- Suministre la clave secreta desde su gestor de secretos, no desde el código fuente. Se requiere la misma clave para descodificar.
- Decida la profundidad de bits (uno o dos bits por posición) y si se requiere compatibilidad con PDF/A, según sus necesidades de capacidad y conformidad.
Configuración
Sección titulada «Configuración»La configuración de codificación es inmutable y se valida en la construcción:
- Profundidad de bits — uno o dos bits por posición de par de letras. Una mayor profundidad da más capacidad pero desviaciones mayores.
- Relación de ajuste máxima — el tope de desviación como fracción del em, dentro de un rango acotado. Valores mayores dan más margen pero arriesgan la visibilidad.
- Cifrado — AES-256-GCM (predeterminado) o ChaCha20-Poly1305. Ambos son AEAD.
- Compatibilidad con PDF/A — cuando se activa, reduce a la mitad la desviación máxima efectiva.
Use la misma configuración para codificar y descodificar; una discrepancia no produce ninguna carga útil recuperada.
Paso a paso
Sección titulada «Paso a paso»- Lea la clave secreta de su gestor de secretos.
- Construya la configuración de codificación (profundidad de bits, relación de desviación, cifrado, indicador de PDF/A).
- Calcule los ajustes de interletraje para el texto que está a punto de renderizar, pasando la carga útil, el texto, la clave de la fuente, las métricas de la fuente, la clave secreta y la configuración.
- Aplique los ajustes devueltos al escribir la corrida de texto, de modo que el marcador se incruste durante la generación.
- Para rastrear una copia filtrada, ejecute el decodificador sobre el flujo de contenido del documento sospechoso con la misma clave de fuente, métricas de fuente, clave secreta y configuración, y lea la carga útil recuperada.
<?php
declare(strict_types=1);
require_once __DIR__ . '/../../vendor/autoload.php';
/** * Reject a payload that cannot fit the carrier text before encoding. * * Each letter-pair position carries $bitDepth bits. Guarding capacity up * front turns an unencodable payload into a clear caller-side error instead * of relying on the encoder's overflow exception alone. * * @param non-empty-string $payload The bytes to embed (already minimal). * @param positive-int $textLength The character count of the carrier text. * @param int<1, 2> $bitDepth Bits encoded per letter-pair position. * * @throws \OverflowException When the payload cannot fit the available positions. */function assertPayloadFits(string $payload, int $textLength, int $bitDepth): void{ $positions = $textLength - 1; $capacityBytes = \intdiv($positions * $bitDepth, 8);
if (\strlen($payload) > $capacityBytes) { throw new \OverflowException(\sprintf( 'Payload of %d bytes exceeds carrier capacity of %d bytes.', \strlen($payload), $capacityBytes, )); }}<?php
declare(strict_types=1);
require_once __DIR__ . '/../../vendor/autoload.php';
use NextPDF\Enterprise\Security\Steganography\SteganographyDecoder;use NextPDF\Enterprise\Security\Steganography\SteganographyConfig;use NextPDF\Typography\FontMetrics;use Psr\Log\LoggerInterface;
final readonly class LeakTracer{ public function __construct(private LoggerInterface $logger) {}
/** * Recover the embedded marker from a suspect document's content stream. * * Decoding returns null on a wrong key or a destroyed carrier rather than * a wrong payload, so the caller treats null as "no marker recovered". * * @param string $contentStream The suspect content-stream bytes. * @param non-empty-string $fontKey The font key used at generation. * @param FontMetrics $metrics Font metrics with kerning pairs. * @param string $secretKey The same secret key used to encode. * @param SteganographyConfig $config The same configuration used to encode. * * @return string|null The recovered marker, or null when none is found. */ public function trace( string $contentStream, string $fontKey, FontMetrics $metrics, string $secretKey, SteganographyConfig $config, ): ?string { $marker = SteganographyDecoder::decodeFromContentStream( $contentStream, $fontKey, $metrics, $secretKey, $config, );
if ($marker === null) { $this->logger->info('No steganographic marker recovered from content stream.'); }
return $marker; }}Verificación
Sección titulada «Verificación»- Codifique una carga útil conocida en una corrida de texto conocida, luego descodifíquela de vuelta con la misma clave y configuración; confirme que la carga útil recuperada coincide.
- Descodifique con una clave deliberadamente incorrecta y confirme que el resultado es nulo, no una carga útil incorrecta — esta es la garantía de integridad de AEAD en acción.
- Inspeccione la página renderizada y confirme que el cambio de espaciado no es visualmente perceptible con la relación de desviación configurada.
- Cuando se requiera compatibilidad con PDF/A, valide la salida frente a su perfil de PDF/A y confirme que no se supera la tolerancia de anchura.
Seguridad y cumplimiento
Sección titulada «Seguridad y cumplimiento»- Cifrado autenticado. La carga útil se cifra con AES-256-GCM o ChaCha20-Poly1305. Un portador manipulado o truncado falla la autenticación en el descifrado; no produce una carga útil incorrecta.
- IV por cifrado. Se genera un IV aleatorio nuevo de 12 bytes para cada cifrado, satisfaciendo el requisito de unicidad de AES-GCM según NIST SP 800-38D §5.2.1.
- Clave derivada. La clave de cifrado se deriva con HKDF-SHA-256 a partir de su secreto y la clave de la fuente (RFC 5869 §2). Mantenga el secreto en su gestor de secretos; trátelo como cualquier secreto de firma.
- El marcador es contenido del documento. Los bytes incrustados forman parte del contenido de la página, no del contenido de registro. No escriba la carga útil ni la clave secreta en los registros.
Esta página trata sobre incrustación criptográfica. Toda fuente normativa está parafraseada; no se reproduce ningún texto normativo. ### Divulgación de robustez
El marcador se transporta en los ajustes de interletraje. Puede ser destruido al imprimir y reescanear, por herramientas de conversión de PDF, por la relinearización o por cualquier reescritura de flujo de contenido que normalice el interletraje. La técnica es más adecuada para el rastreo interno de fugas de documentos distribuidos en su forma generada. No es esteganografía adversaria y no sobrevive a un procesamiento arbitrario aguas abajo. No confíe en ella como único control cuando el modelo de amenazas incluya la eliminación deliberada.
Manejo de fallos
Sección titulada «Manejo de fallos»- Carga útil demasiado grande. El codificador genera un error de desbordamiento tipado cuando la carga útil supera la capacidad del texto. Acorte la carga útil o alargue el texto portador.
- Demasiado poco texto portador. Un texto más corto que dos caracteres no ofrece ninguna posición de portador y genera un error.
- Clave incorrecta al descodificar. El descifrado devuelve nulo. Trate el nulo como «ningún marcador recuperado», no como un resultado parcial.
- Discrepancia de configuración. La codificación y la descodificación deben usar la misma profundidad de bits, relación de desviación, cifrado e indicador de PDF/A; una discrepancia no produce ninguna carga útil recuperada.
Límite de publicación
Sección titulada «Límite de publicación»Esta página documenta únicamente el comportamiento observable externamente y la superficie pública de API soportada. Las rutas de espacio de nombres internas, las clases auxiliares, las tablas de mecanismos, los nombres de archivo de runbook y los prefijos de tickets quedan fuera del alcance.
Véase también
Sección titulada «Véase también»- Steganography — NextPDF Enterprise — la referencia de API del codificador y decodificador esteganográficos.
- Security — NextPDF Enterprise — la superficie de seguridad combinada de Enterprise.
- Branding — NextPDF Enterprise — marcas de agua visibles y sellos en página.
- Forensics — NextPDF Enterprise — examen y rastreo de documentos.
- Security — NextPDF Core — la superficie de cifrado y firma del núcleo.
- AEAD · HKDF · interletraje — términos del glosario.