Enterprise editie
Digitaal watermerken en steganografische inbedding
In het kort
Sectie met titel “In het kort”NextPDF Enterprise bedt een verborgen, versleutelde payload in een gegenereerde PDF in door kleine, gecontroleerde aanpassingen te maken aan de spatiëring tussen letterparen. Je levert een payload — doorgaans een identificator per ontvanger — en een geheime sleutel; de encoder schrijft de payload als onmerkbare afwijkingen van de natuurlijke kerning van de tekst. Een bijbehorende decoder, gegeven dezelfde sleutel, herstelt de payload. Deze pagina is op gedragsniveau: ze beschrijft wat de encoder schrijft, de cryptografie die deze gebruikt en de grens van de techniek.
Het beoogde gebruik is interne document-leak-tracing: wanneer een gecontroleerd document lekt, identificeert de herstelde marker de ontvangerkopie. Het is geen adversariële steganografie en geen garantie voor overleving door willekeurige verwerking heen.
Vereisten staan in de front matter en worden herhaald onder Vereisten.
Beschikbaarheid en licentiëring
Sectie met titel “Beschikbaarheid en licentiëring”Deze mogelijkheid wordt geleverd in NextPDF Enterprise (nextpdf/enterprise) en wordt geactiveerd met een license-envelope op Enterprise-niveau. Een deployment zonder die entitlement laadt de klassen van de mogelijkheid niet. De mogelijkheid draait volledig in-process tijdens documentgeneratie; geen documentinhoud verlaat de host. Vergelijk edities en verkrijg een licentie.
Wat deze mogelijkheid doet
Sectie met titel “Wat deze mogelijkheid doet”PDF-tekst die met een kerning-array wordt getekend, draagt een numerieke aanpassing tussen glyphs. De encoder behandelt elke aanpassingspositie als een drager voor een paar bits:
- Het versleutelt de payload met een authenticated-encryption-with-associated-data (AEAD)-cipher — AES-256-GCM standaard, of ChaCha20-Poly1305. AEAD biedt zowel vertrouwelijkheid als integriteit, zodat een gemanipuleerde drager faalt bij decryptie in plaats van stilzwijgend een verkeerde payload op te leveren.
- Het leidt de 32-byte encryptiesleutel af uit je geheime sleutel en de fontsleutel met behulp van de HMAC-based Key Derivation Function (HKDF) met SHA-256. HKDF extraheert een pseudorandom-sleutel met vaste lengte uit het input-keying-materiaal en breidt deze vervolgens uit tot de vereiste lengte, volgens RFC 5869 §2.
- Het genereert een verse willekeurige 12-byte initialisatievector (IV) per encryptie. AES-GCM vereist dat de IV uniek is voor een gegeven sleutel, anders gaat de authenticatiezekerheid verloren, volgens NIST SP 800-38D §5.2.1.
- Het mapt de versleutelde bytes naar een bitsequentie en verdeelt de bits over de beschikbare letterpaar-posities, waarbij één of twee bits per positie worden gecodeerd. De afwijking die het toevoegt aan de natuurlijke kerning is begrensd door een configureerbare fractie van de em — klein genoeg om visueel onmerkbaar te blijven.
De decoder keert het proces om: het leest de kerning-aanpassingen uit een content stream, trekt de natuurlijke kerning af, kwantiseert de afwijkingen terug naar bits, reassembleert de versleutelde blob en ontsleutelt deze met dezelfde sleutel. Als de sleutel verkeerd is of de drager is vernietigd, retourneert decryptie niets in plaats van een verkeerde payload.
De capaciteit schaalt met de tekstlengte: elke letterpaar-positie draagt één of twee bits, dus een payload moet passen in de posities die de tekst biedt. De encoder werpt een getypeerde overflow-fout wanneer de payload de capaciteit overschrijdt.
Een PDF/A-compatibiliteitsmodus halveert de maximale afwijking om onder de breedtetolerantiedrempel van een validator te blijven, en ruilt capaciteit in voor striktere conformiteit.
Waarom het zo werkt
Sectie met titel “Waarom het zo werkt”De dragende keuze is om de marker in de kerning te verbergen in plaats van in een zichtbare overlay of een metadataveld. Een metadata-marker is triviaal te verwijderen, en een zichtbaar stempel verandert de pagina. Kerning-afwijkingen rijden in plaats daarvan mee in de tekst die de ontvanger moet behouden, en blijven onmerkbaar. Geauthenticeerde encryptie is de tweede pijler: een gemanipuleerde of gedeeltelijke drager faalt bij authenticatie, zodat de decoder niets retourneert in plaats van een verkeerde ontvanger. De sleutel wordt per font afgeleid met HKDF, wat de marker bindt aan de documentcontext, niet aan een kale gedeelde geheime sleutel. De eerlijke robuustheidsdisclosure volgt hier direct uit: de marker overleeft gewone herdistributie maar geen opzettelijke content-stream-herschrijving, dus de gestelde scope is interne leak-tracing, geen adversariële steganografie.
Ontwerpachtergrond: Redactie is geen zwarte rechthoek.
Vereisten
Sectie met titel “Vereisten”- Installeer NextPDF Core en het Enterprise-pakket, en houd een actieve Enterprise-licentie.
- Genereer het document met een font dat kerning-paar-metrics blootstelt; de encoder leest de natuurlijke kerning uit de font-metrics.
- Lever de geheime sleutel uit je secret manager, niet uit de broncode. Dezelfde sleutel is vereist om te decoderen.
- Bepaal de bitdiepte (één of twee bits per positie) en of PDF/A-compatibiliteit vereist is, op basis van je capaciteits- en conformiteitsbehoeften.
Configuratie
Sectie met titel “Configuratie”De encoderingsconfiguratie is onveranderlijk en wordt bij constructie gevalideerd:
- Bitdiepte — één of twee bits per letterpaar-positie. Een hogere diepte geeft meer capaciteit maar grotere afwijkingen.
- Maximale aanpassingsratio — het afwijkingsplafond als fractie van de em, binnen een begrensd bereik. Grotere waarden geven meer speelruimte maar riskeren zichtbaarheid.
- Cipher — AES-256-GCM (standaard) of ChaCha20-Poly1305. Beide zijn AEAD.
- PDF/A-compatibiliteit — indien ingeschakeld, halveert dit de effectieve maximale afwijking.
Gebruik dezelfde configuratie voor encodering en decodering; een mismatch levert geen herstelde payload op.
Stap voor stap
Sectie met titel “Stap voor stap”- Lees de geheime sleutel uit je secret manager.
- Bouw de encoderingsconfiguratie (bitdiepte, afwijkingsratio, cipher, PDF/A-vlag).
- Bereken de kerning-aanpassingen voor de tekst die je gaat renderen, door de payload, de tekst, de fontsleutel, de font-metrics, de geheime sleutel en de configuratie door te geven.
- Pas de geretourneerde aanpassingen toe wanneer je de tekst-run schrijft, zodat de marker tijdens generatie wordt ingebed.
- Om een gelekte kopie te traceren, voer je de decoder uit over de content stream van het verdachte document met dezelfde fontsleutel, font-metrics, geheime sleutel en configuratie, en lees je de herstelde payload.
<?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; }}Verificatie
Sectie met titel “Verificatie”- Codeer een bekende payload in een bekende tekst-run en decodeer deze vervolgens terug met dezelfde sleutel en configuratie; bevestig dat de herstelde payload overeenkomt.
- Decodeer met een bewust verkeerde sleutel en bevestig dat het resultaat null is, niet een verkeerde payload — dit is de AEAD-integriteitsgarantie in werking.
- Inspecteer de gerenderde pagina en bevestig dat de spatiëringswijziging visueel niet waarneembaar is bij de geconfigureerde afwijkingsratio.
- Wanneer PDF/A-compatibiliteit vereist is, valideer de uitvoer tegen je PDF/A-profiel en bevestig dat de breedtetolerantie niet wordt overschreden.
Beveiliging en compliance
Sectie met titel “Beveiliging en compliance”- Geauthenticeerde encryptie. De payload wordt versleuteld met AES-256-GCM of ChaCha20-Poly1305. Een gemanipuleerde of afgekapte drager faalt bij authenticatie tijdens decryptie; het levert geen verkeerde payload op.
- IV per encryptie. Een verse willekeurige 12-byte IV wordt voor elke encryptie gegenereerd, wat voldoet aan de AES-GCM-uniciteitsvereiste volgens NIST SP 800-38D §5.2.1.
- Afgeleide sleutel. De encryptiesleutel wordt afgeleid met HKDF-SHA-256 uit je geheim en de fontsleutel (RFC 5869 §2). Houd het geheim in je secret manager; behandel het als elk ondertekeningsgeheim.
- De marker is documentinhoud. De ingebedde bytes maken deel uit van de pagina-inhoud, niet van de loginhoud. Schrijf de payload of de geheime sleutel niet naar logs.
Deze pagina betreft cryptografische inbedding. Elke normatieve bron is geparafraseerd; er wordt geen normatieve tekst gereproduceerd. ### Robuustheidsdisclosure
De marker wordt gedragen in kerning-aanpassingen. Deze kan worden vernietigd door printen en opnieuw scannen, door PDF-conversietools, door re-linearisatie, of door elke content-stream-herschrijving die de kerning normaliseert. De techniek is het meest geschikt voor interne leak-tracing van documenten die in hun gegenereerde vorm worden gedistribueerd. Het is geen adversariële steganografie en overleeft geen willekeurige downstream-verwerking. Vertrouw er niet op als de enige controle wanneer het dreigingsmodel opzettelijk verwijderen omvat.
Foutafhandeling
Sectie met titel “Foutafhandeling”- Payload te groot. De encoder werpt een getypeerde overflow-fout wanneer de payload de tekstcapaciteit overschrijdt. Verkort de payload of verleng de dragertekst.
- Te weinig dragertekst. Tekst korter dan twee tekens biedt geen dragerpositie en werpt een fout.
- Verkeerde sleutel bij decode. Decodering retourneert null. Behandel null als “geen marker hersteld”, niet als een gedeeltelijk resultaat.
- Configuratie-mismatch. Encodering en decodering moeten dezelfde bitdiepte, afwijkingsratio, cipher en PDF/A-vlag gebruiken; een mismatch levert geen herstelde payload op.
Publicatiegrens
Sectie met titel “Publicatiegrens”Deze pagina documenteert alleen extern waarneembaar gedrag en het ondersteunde publieke API-oppervlak. Interne namespace-paden, helperklassen, mechanismetabellen, runbook-bestandsnamen en ticket-prefixen vallen buiten de scope.
Zie ook
Sectie met titel “Zie ook”- Steganography — NextPDF Enterprise — de API-referentie voor de steganografische encoder en decoder.
- Security — NextPDF Enterprise — het gecombineerde Enterprise-beveiligingsoppervlak.
- Branding — NextPDF Enterprise — zichtbare watermarks en on-page-stempels.
- Forensics — NextPDF Enterprise — documentonderzoek en tracing.
- Security — NextPDF Core — het core-encryptie- en handtekeningoppervlak.
- AEAD · HKDF · kerning — woordenlijsttermen.