Enterprise sürüm
Dijital filigran ve steganografik gömme
Bir bakışta
“Bir bakışta” başlıklı bölümNextPDF Enterprise, harf çiftleri arasındaki boşluğa küçük, kontrollü ayarlamalar yaparak üretilen bir PDF’e gizli, şifrelenmiş bir yük gömer. Bir yük — tipik olarak alıcı başına bir tanımlayıcı — ve bir gizli anahtar sağlarsınız; kodlayıcı, yükü metnin doğal kerning’inden algılanamaz sapmalar olarak yazar. Aynı anahtar verilen eşleşen bir kod çözücü, yükü kurtarır. Bu sayfa davranış düzeyindedir: kodlayıcının ne yazdığını, kullandığı kriptografiyi ve tekniğin sınırını belirtir.
Amaçlanan kullanım, dahilî belge sızıntı izlemedir: kontrollü bir belge sızdığında, kurtarılan işaretçi alıcı kopyasını tanımlar. Düşmanca steganografi değildir ve keyfi bir işlemeyle hayatta kalmanın garantisi değildir.
Önkoşullar ön bilgide belirtilmiştir ve Önkoşullar altında tekrarlanmıştır.
Sürüm ve lisanslama
“Sürüm ve lisanslama” başlıklı bölümBu yetenek NextPDF Enterprise (nextpdf/enterprise) içinde sevk edilir ve Enterprise katmanlı bir lisans zarfıyla etkinleşir. Bu yetkilendirme olmadan bir dağıtım, yeteneğin sınıflarını yüklemez. Yetenek, belge üretimi sırasında tamamen süreç içinde çalışır; hiçbir belge içeriği ana makineyi terk etmez. Sürümleri karşılaştırın ve bir lisans edinin.
Bu yetenek ne yapar
“Bu yetenek ne yapar” başlıklı bölümBir kerning dizisiyle çizilen PDF metni, glifler arasında sayısal bir ayarlama taşır. Kodlayıcı, her ayarlama konumunu birkaç bit için bir taşıyıcı olarak ele alır:
- Yükü, kimliği doğrulanmış-şifreleme-ile-ilişkili-veri (AEAD) bir şifreyle şifreler — varsayılan olarak AES-256-GCM veya ChaCha20-Poly1305. AEAD hem gizlilik hem de bütünlük sağlar; böylece kurcalanan bir taşıyıcı, sessizce yanlış bir yük vermek yerine kod çözmede başarısız olur.
- 32 baytlık şifreleme anahtarını, gizli anahtarınızdan ve yazı tipi anahtarından, SHA-256 ile HMAC tabanlı Anahtar Türetme Fonksiyonu (HKDF) kullanarak türetir. HKDF, girdi anahtarlama materyalinden sabit uzunlukta sözde rastgele bir anahtar çıkarır, ardından bunu gerekli uzunluğa genişletir — RFC 5869 §2.
- Şifreleme başına taze rastgele 12 baytlık bir başlatma vektörü (IV) üretir. AES-GCM, belirli bir anahtar için IV’nin benzersiz olmasını gerektirir; aksi durumda kimlik doğrulama güvencesi kaybolur — NIST SP 800-38D §5.2.1.
- Şifrelenmiş baytları bir bit dizisine eşler ve bitleri, konum başına bir veya iki bit kodlayarak mevcut harf-çifti konumlarına dağıtır. Doğal kerning’e eklediği sapma, em’in yapılandırılabilir bir kesriyle sınırlanır — görsel olarak algılanamaz kalacak kadar küçük.
Kod çözücü, süreci tersine çevirir: bir içerik akışından kerning ayarlamalarını okur, doğal kerning’i çıkarır, sapmaları bitlere geri niceler, şifrelenmiş bloğu yeniden birleştirir ve aynı anahtarla şifresini çözer. Anahtar yanlışsa veya taşıyıcı yok edildiyse, kod çözme yanlış bir yük yerine hiçbir şey döndürmez.
Kapasite, metin uzunluğuyla ölçeklenir: her harf-çifti konumu bir veya iki bit taşır; bu nedenle bir yük, metnin sağladığı konumlara sığmalıdır. Yük kapasiteyi aştığında kodlayıcı, türü belirtilmiş bir taşma hatası yükseltir.
Bir PDF/A-uyumluluk modu, bir doğrulayıcının genişlik-tolerans eşiğinin altında kalmak için maksimum sapmayı yarıya indirir; kapasiteyi daha katı uygunluk karşılığında takas eder.
Neden bu şekilde çalışır
“Neden bu şekilde çalışır” başlıklı bölümYük taşıyan tercih, işaretçiyi görünür bir kaplama ya da bir meta veri alanı yerine kerning içinde gizlemektir. Bir meta veri işaretçisini sıyırmak önemsizdir ve görünür bir damga sayfayı değiştirir. Kerning sapmaları ise alıcının saklamak zorunda olduğu metnin içinde taşınır ve algılanamaz kalır. Kimliği doğrulanmış şifreleme ikinci sütundur: kurcalanmış ya da kısmi bir taşıyıcı kimlik doğrulamada başarısız olur; böylece kod çözücü, yanlış bir alıcı yerine hiçbir şey döndürmez. Anahtar, yazı tipi başına HKDF ile türetilir ve işaretçiyi çıplak bir paylaşılan gizli anahtara değil, belge bağlamına bağlar. Dürüst dayanıklılık açıklaması doğrudan bunu izler: işaretçi sıradan yeniden dağıtıma dayanır ama kasıtlı içerik-akışı yeniden yazımına dayanmaz; bu nedenle belirtilen kapsam düşmanca steganografi değil, dahilî sızıntı izlemedir.
Tasarım arka planı: Redaksiyon siyah bir dikdörtgen değildir.
Önkoşullar
“Önkoşullar” başlıklı bölüm- NextPDF Core’u ve Enterprise paketini kurun ve etkin bir Enterprise lisansı tutun.
- Belgeyi, kerning-çifti metriklerini açığa çıkaran bir yazı tipiyle üretin; kodlayıcı, doğal kerning’i yazı tipi metriklerinden okur.
- Gizli anahtarı kaynaktan değil, gizli yöneticinizden sağlayın. Kod çözmek için aynı anahtar gereklidir.
- Kapasite ve uygunluk ihtiyaçlarınıza göre bit derinliğine (konum başına bir veya iki bit) ve PDF/A uyumluluğunun gerekip gerekmediğine karar verin.
Yapılandırma
“Yapılandırma” başlıklı bölümKodlama yapılandırması değişmezdir ve oluşturma sırasında doğrulanır:
- Bit derinliği — harf-çifti konumu başına bir veya iki bit. Daha yüksek derinlik daha fazla kapasite ama daha büyük sapmalar verir.
- Maksimum ayarlama oranı — sınırlı bir aralık içinde, em’in bir kesri olarak sapma tavanı. Daha büyük değerler daha fazla pay verir ama görünürlük riski taşır.
- Şifre — AES-256-GCM (varsayılan) veya ChaCha20-Poly1305. Her ikisi de AEAD’dir.
- PDF/A uyumluluğu — etkinleştirildiğinde, etkin maksimum sapmayı yarıya indirir.
Kodlama ve kod çözme için aynı yapılandırmayı kullanın; bir uyumsuzluk hiçbir kurtarılan yük vermez.
Adım adım
“Adım adım” başlıklı bölüm- Gizli anahtarı gizli yöneticinizden okuyun.
- Kodlama yapılandırmasını oluşturun (bit derinliği, sapma oranı, şifre, PDF/A bayrağı).
- İşlemek üzere olduğunuz metin için kerning ayarlamalarını, yükü, metni, yazı tipi anahtarını, yazı tipi metriklerini, gizli anahtarı ve yapılandırmayı geçirerek hesaplayın.
- Metin çalışmasını yazdığınızda döndürülen ayarlamaları uygulayın; böylece işaretçi üretim sırasında gömülür.
- Sızdırılmış bir kopyayı izlemek için kod çözücüyü, şüpheli belgenin içerik akışı üzerinde aynı yazı tipi anahtarı, yazı tipi metrikleri, gizli anahtar ve yapılandırmayla çalıştırın ve kurtarılan yükü okuyun.
<?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; }}Doğrulama
“Doğrulama” başlıklı bölüm- Bilinen bir yükü bilinen bir metin çalışmasına kodlayın, ardından aynı anahtar ve yapılandırmayla geri çözün; kurtarılan yükün eşleştiğini doğrulayın.
- Bilerek yanlış bir anahtarla kod çözün ve sonucun yanlış bir yük değil, null olduğunu doğrulayın — bu, AEAD bütünlük garantisinin işbaşındaki halidir.
- İşlenen sayfayı inceleyin ve yapılandırılmış sapma oranında boşluk değişiminin görsel olarak belirgin olmadığını doğrulayın.
- PDF/A uyumluluğu gerektiğinde, çıktıyı PDF/A profilinize karşı doğrulayın ve genişlik toleransının aşılmadığını doğrulayın.
Güvenlik ve uygunluk
“Güvenlik ve uygunluk” başlıklı bölüm- Kimliği doğrulanmış şifreleme. Yük, AES-256-GCM veya ChaCha20-Poly1305 ile şifrelenir. Kurcalanan veya kesilen bir taşıyıcı, kod çözmede kimlik doğrulamada başarısız olur; yanlış bir yük vermez.
- Şifreleme başına IV. Her şifreleme için taze rastgele 12 baytlık bir IV üretilir; bu, AES-GCM benzersizlik gereksinimini karşılar — NIST SP 800-38D §5.2.1.
- Türetilmiş anahtar. Şifreleme anahtarı, gizli bilginizden ve yazı tipi anahtarından HKDF-SHA-256 ile türetilir (RFC 5869 §2). Gizli bilgiyi gizli yöneticinizde tutun; onu herhangi bir imzalama gizli bilgisi gibi ele alın.
- İşaretçi belge içeriğidir. Gömülü baytlar, günlük içeriği değil, sayfa içeriğinin bir parçasıdır. Yükü veya gizli anahtarı günlüklere yazmayın.
Bu sayfa kriptografik gömmeyle ilgilidir. Her normatif kaynak başka sözcüklerle ifade edilir; hiçbir normatif metin yeniden üretilmez. ### Dayanıklılık açıklaması
İşaretçi, kerning ayarlamalarında taşınır. Yazdırma ve yeniden tarama, PDF dönüştürme araçları, yeniden doğrusallaştırma veya kerning’i normalleştiren herhangi bir içerik-akışı yeniden yazımıyla yok edilebilir. Teknik, üretilmiş biçimlerinde dağıtılan belgelerin dahilî sızıntı izlemesine en uygundur. Düşmanca steganografi değildir ve keyfi alt akış işlemeyle hayatta kalmaz. Tehdit modeli kasıtlı sıyırmayı içerdiğinde buna tek denetim olarak güvenmeyin.
Başarısızlık işleme
“Başarısızlık işleme” başlıklı bölüm- Yük çok büyük. Yük metin kapasitesini aştığında kodlayıcı, türü belirtilmiş bir taşma hatası yükseltir. Yükü kısaltın veya taşıyıcı metni uzatın.
- Çok az taşıyıcı metin. İki karakterden kısa metin, hiçbir taşıyıcı konumu sunmaz ve bir hata yükseltir.
- Kod çözmede yanlış anahtar. Kod çözme null döndürür. Null’ı, kısmi bir sonuç olarak değil, “hiçbir işaretçi kurtarılmadı” olarak ele alın.
- Yapılandırma uyumsuzluğu. Kodlama ve kod çözme aynı bit derinliğini, sapma oranını, şifreyi ve PDF/A bayrağını kullanmalıdır; bir uyumsuzluk hiçbir kurtarılan yük vermez.
Yayın sınırı
“Yayın sınırı” başlıklı bölümBu sayfa yalnızca dışarıdan gözlemlenebilir davranışı ve desteklenen genel API yüzeyini belgeler. Dahilî ad alanı yolları, yardımcı sınıflar, mekanizma tabloları, runbook dosya adları ve talep önekleri kapsam dışıdır.
Ayrıca bakınız
“Ayrıca bakınız” başlıklı bölüm- Steganography — NextPDF Enterprise — steganografik kodlayıcı ve kod çözücü için API referansı.
- Security — NextPDF Enterprise — birleşik Enterprise güvenlik yüzeyi.
- Branding — NextPDF Enterprise — görünür filigranlar ve sayfa üzerindeki damgalar.
- Forensics — NextPDF Enterprise — belge incelemesi ve izleme.
- Security — NextPDF Core — çekirdek şifreleme ve imza yüzeyi.
- AEAD · HKDF · kerning — sözlük terimleri.