Enterprise รุ่น
การฝังลายน้ำดิจิทัลและการฝังแบบ steganographic
ภาพรวมโดยสังเขป
หัวข้อที่มีชื่อว่า “ภาพรวมโดยสังเขป”NextPDF Enterprise ฝัง payload ที่ซ่อนอยู่และเข้ารหัสลงในไฟล์ PDF ที่สร้างขึ้น โดยปรับระยะห่างระหว่างคู่ตัวอักษรเล็กน้อยและควบคุมได้ คุณจัดหา payload — โดยทั่วไปคือตัวระบุต่อผู้รับ — และคีย์ลับ ตัวเข้ารหัสเขียน payload เป็นการเบี่ยงเบนจาก kerning ตามธรรมชาติของข้อความที่ไม่สามารถรับรู้ได้ ตัวถอดรหัสที่ตรงกันเมื่อได้รับคีย์เดียวกันจะกู้คืน payload หน้านี้เป็นระดับพฤติกรรม คือระบุสิ่งที่ตัวเข้ารหัสเขียน การเข้ารหัสที่ใช้ และขอบเขตของเทคนิค
การใช้งานที่ตั้งใจไว้คือการติดตามการรั่วไหลของเอกสารภายใน เมื่อเอกสารที่ควบคุมรั่วไหล เครื่องหมายที่กู้คืนได้จะระบุสำเนาของผู้รับ นี่ไม่ใช่ steganography เชิงปฏิปักษ์และไม่ใช่การรับประกันว่าจะอยู่รอดผ่านการประมวลผลใด ๆ ก็ตาม
ข้อกำหนดเบื้องต้นระบุไว้ใน front matter และกล่าวซ้ำใน ข้อกำหนดเบื้องต้น
รุ่นและสิทธิ์การใช้งาน
หัวข้อที่มีชื่อว่า “รุ่นและสิทธิ์การใช้งาน”ความสามารถนี้มาในแพ็กเกจ NextPDF Enterprise (nextpdf/enterprise) และเปิดใช้งานด้วย license envelope ระดับ Enterprise การนำไปใช้งานที่ไม่มีสิทธิ์นั้นจะไม่โหลดคลาสของความสามารถนี้ ความสามารถนี้รันภายในกระบวนการทั้งหมดระหว่างการสร้างเอกสาร ไม่มีเนื้อหาเอกสารออกจาก host เปรียบเทียบรุ่นและรับสิทธิ์การใช้งาน
ความสามารถนี้ทำอะไร
หัวข้อที่มีชื่อว่า “ความสามารถนี้ทำอะไร”ข้อความ PDF ที่วาดด้วย kerning array พาการปรับเชิงตัวเลขระหว่าง glyph มาด้วย ตัวเข้ารหัสถือตำแหน่งการปรับแต่ละจุดเป็นตัวพาสำหรับไม่กี่บิต:
- มันเข้ารหัส payload ด้วย cipher แบบ authenticated-encryption-with-associated-data (AEAD) — AES-256-GCM ตามค่าเริ่มต้น หรือ ChaCha20-Poly1305 AEAD ให้ทั้งความลับและความครบถ้วน ดังนั้นตัวพาที่ถูกแก้ไขจะถอดรหัสล้มเหลวแทนที่จะให้ payload ที่ผิดอย่างเงียบ ๆ
- มันได้คีย์เข้ารหัส 32 ไบต์มาจากคีย์ลับของคุณและ font key โดยใช้ HMAC-based Key Derivation Function (HKDF) กับ SHA-256 HKDF สกัดคีย์ pseudorandom ความยาวคงที่จากวัสดุคีย์อินพุต แล้วขยายเป็นความยาวที่ต้องการ ตาม RFC 5869 §2
- มันสร้าง initialization vector (IV) แบบสุ่ม 12 ไบต์ใหม่ต่อการเข้ารหัส AES-GCM กำหนดให้ IV ต้องไม่ซ้ำสำหรับคีย์ที่กำหนด มิฉะนั้นการรับประกันการตรวจสอบสิทธิ์จะสูญหาย ตาม NIST SP 800-38D §5.2.1
- มันแมปไบต์ที่เข้ารหัสไปยังลำดับบิตและกระจายบิตไปตามตำแหน่งคู่ตัวอักษรที่มีอยู่ โดยเข้ารหัสหนึ่งหรือสองบิตต่อตำแหน่ง การเบี่ยงเบนที่มันเพิ่มให้กับ kerning ตามธรรมชาติถูกจำกัดด้วยเศษส่วนของ em ที่กำหนดค่าได้ — เล็กพอที่จะไม่สามารถรับรู้ได้ด้วยสายตา
ตัวถอดรหัสย้อนกระบวนการ คือมันอ่านการปรับ kerning จาก content stream ลบ kerning ตามธรรมชาติ quantize การเบี่ยงเบนกลับเป็นบิต ประกอบ blob ที่เข้ารหัสใหม่ และถอดรหัสด้วยคีย์เดียวกัน หากคีย์ผิดหรือตัวพาถูกทำลาย การถอดรหัสจะคืนค่าว่างเปล่าแทนที่จะเป็น payload ที่ผิด
ความจุปรับขนาดตามความยาวข้อความ คือแต่ละตำแหน่งคู่ตัวอักษรพาหนึ่งหรือสองบิต ดังนั้น payload จึงต้องพอดีกับตำแหน่งที่ข้อความให้มา ตัวเข้ารหัสยกข้อผิดพลาด overflow แบบมีชนิดเมื่อ payload เกินความจุ
โหมดที่เข้ากันได้กับ PDF/A ลดการเบี่ยงเบนสูงสุดลงครึ่งหนึ่งเพื่อให้อยู่ใต้เกณฑ์ความคลาดเคลื่อนของความกว้างของเครื่องมือตรวจสอบ โดยแลกความจุกับความสอดคล้องที่เข้มงวดกว่า
เหตุใดจึงทำงานเช่นนี้
หัวข้อที่มีชื่อว่า “เหตุใดจึงทำงานเช่นนี้”ทางเลือกที่สำคัญคือการซ่อนเครื่องหมายไว้ใน kerning แทนที่จะเป็นการซ้อนทับที่มองเห็นได้หรือฟิลด์ metadata เครื่องหมายแบบ metadata ลอกออกได้ง่าย และ stamp ที่มองเห็นได้ทำให้หน้าเปลี่ยนไป การเบี่ยงเบน kerning กลับไปอยู่ภายในข้อความที่ผู้รับต้องเก็บไว้ และยังคงไม่สามารถรับรู้ได้ การเข้ารหัสที่มีการตรวจสอบสิทธิ์เป็นเสาหลักที่สอง คือตัวพาที่ถูกแก้ไขหรือไม่ครบจะการตรวจสอบสิทธิ์ล้มเหลว ดังนั้นตัวถอดรหัสจึงคืนค่าว่างแทนที่จะเป็นผู้รับที่ผิด คีย์ถูกได้มาต่อฟอนต์ด้วย HKDF ผูกเครื่องหมายเข้ากับบริบทของเอกสาร ไม่ใช่กับความลับที่แชร์ร่วมกันเปล่า ๆ การเปิดเผยด้านความทนทานอย่างตรงไปตรงมาตามมาโดยตรง คือเครื่องหมายอยู่รอดผ่านการแจกจ่ายซ้ำตามปกติแต่ไม่รอดผ่านการเขียน content stream ใหม่โดยจงใจ ดังนั้นขอบเขตที่ระบุไว้คือการติดตามการรั่วไหลภายใน ไม่ใช่ steganography เชิงปฏิปักษ์
ภูมิหลังการออกแบบ: การลบข้อมูลไม่ใช่สี่เหลี่ยมสีดำ
ข้อกำหนดเบื้องต้น
หัวข้อที่มีชื่อว่า “ข้อกำหนดเบื้องต้น”- ติดตั้ง NextPDF Core และแพ็กเกจ Enterprise และถือสิทธิ์การใช้งาน Enterprise ที่ใช้งานอยู่
- สร้างเอกสารด้วยฟอนต์ที่เปิดเผย kerning-pair metrics ตัวเข้ารหัสอ่าน kerning ตามธรรมชาติจาก font metrics
- จัดหาคีย์ลับจาก secret manager ของคุณ ไม่ใช่จากซอร์ส คีย์เดียวกันนี้จำเป็นต้องใช้ในการถอดรหัส
- ตัดสินใจ bit depth (หนึ่งหรือสองบิตต่อตำแหน่ง) และว่าจำเป็นต้องเข้ากันได้กับ PDF/A หรือไม่ ตามความจุและความต้องการด้านความสอดคล้องของคุณ
การกำหนดค่า
หัวข้อที่มีชื่อว่า “การกำหนดค่า”การกำหนดค่าการเข้ารหัสเป็นแบบไม่เปลี่ยนแปลงและถูกตรวจสอบในการสร้าง:
- Bit depth — หนึ่งหรือสองบิตต่อตำแหน่งคู่ตัวอักษร depth ที่สูงกว่าให้ความจุมากกว่าแต่การเบี่ยงเบนใหญ่กว่า
- อัตราการปรับสูงสุด — เพดานการเบี่ยงเบนเป็นเศษส่วนของ em ภายในช่วงที่มีขอบเขต ค่าที่ใหญ่กว่าให้พื้นที่มากกว่าแต่เสี่ยงต่อการมองเห็น
- Cipher — AES-256-GCM (ค่าเริ่มต้น) หรือ ChaCha20-Poly1305 ทั้งสองเป็น AEAD
- ความเข้ากันได้กับ PDF/A — เมื่อเปิดใช้งาน จะลดการเบี่ยงเบนสูงสุดที่มีผลลงครึ่งหนึ่ง
ใช้การกำหนดค่าเดียวกันสำหรับการเข้ารหัสและการถอดรหัส ความไม่ตรงกันจะให้ผลเป็น payload ที่กู้คืนไม่ได้
ทีละขั้นตอน
หัวข้อที่มีชื่อว่า “ทีละขั้นตอน”- อ่านคีย์ลับจาก secret manager ของคุณ
- สร้างการกำหนดค่าการเข้ารหัส (bit depth, อัตราการเบี่ยงเบน, cipher, แฟล็ก PDF/A)
- คำนวณการปรับ kerning สำหรับข้อความที่คุณกำลังจะเรนเดอร์ โดยส่ง payload, ข้อความ, font key, font metrics, คีย์ลับ และการกำหนดค่า
- ใช้การปรับที่คืนมาเมื่อคุณเขียน text run เพื่อให้เครื่องหมายถูกฝังระหว่างการสร้าง
- ในการติดตามสำเนาที่รั่วไหล ให้รันตัวถอดรหัสบน content stream ของเอกสารต้องสงสัยด้วย font key, font metrics, คีย์ลับ และการกำหนดค่าเดียวกัน และอ่าน 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; }}การตรวจสอบยืนยัน
หัวข้อที่มีชื่อว่า “การตรวจสอบยืนยัน”- เข้ารหัส payload ที่รู้ลงใน text run ที่รู้ แล้วถอดรหัสกลับด้วยคีย์และการกำหนดค่าเดียวกัน ยืนยันว่า payload ที่กู้คืนได้ตรงกัน
- ถอดรหัสด้วยคีย์ที่ผิดโดยจงใจและยืนยันว่าผลลัพธ์เป็น null ไม่ใช่ payload ที่ผิด — นี่คือการรับประกันความครบถ้วนของ AEAD ที่ทำงาน
- ตรวจสอบหน้าที่เรนเดอร์และยืนยันว่าการเปลี่ยนแปลงระยะห่างไม่ปรากฏชัดด้วยสายตาที่อัตราการเบี่ยงเบนที่กำหนดค่าไว้
- เมื่อต้องการความเข้ากันได้กับ PDF/A ให้ตรวจสอบความถูกต้องของเอาต์พุตเทียบกับโปรไฟล์ PDF/A ของคุณและยืนยันว่าไม่ทำให้เกินความคลาดเคลื่อนของความกว้าง
ความปลอดภัยและการปฏิบัติตามข้อกำหนด
หัวข้อที่มีชื่อว่า “ความปลอดภัยและการปฏิบัติตามข้อกำหนด”- การเข้ารหัสที่มีการตรวจสอบสิทธิ์ payload ถูกเข้ารหัสด้วย AES-256-GCM หรือ ChaCha20-Poly1305 ตัวพาที่ถูกแก้ไขหรือตัดทอนจะการตรวจสอบสิทธิ์ล้มเหลวในการถอดรหัส มันไม่ให้ payload ที่ผิด
- IV ต่อการเข้ารหัส IV แบบสุ่ม 12 ไบต์ใหม่ถูกสร้างขึ้นสำหรับการเข้ารหัสทุกครั้ง เป็นไปตามข้อกำหนดความไม่ซ้ำของ AES-GCM ตาม NIST SP 800-38D §5.2.1
- คีย์ที่ได้มา คีย์เข้ารหัสถูกได้มาด้วย HKDF-SHA-256 จากคีย์ลับของคุณและ font key (RFC 5869 §2) เก็บคีย์ลับไว้ใน secret manager ของคุณ ถือเหมือนข้อมูลลับการลงนามใด ๆ
- เครื่องหมายคือเนื้อหาของเอกสาร ไบต์ที่ฝังเป็นส่วนหนึ่งของเนื้อหาหน้า ไม่ใช่เนื้อหาบันทึก อย่าเขียน payload หรือคีย์ลับลงในบันทึก
หน้านี้เกี่ยวข้องกับการฝังทางการเข้ารหัส ทุกแหล่งเชิงบรรทัดฐานเป็นการถอดความ ไม่มีการทำซ้ำข้อความเชิงบรรทัดฐาน ### การเปิดเผยด้านความทนทาน
เครื่องหมายถูกพาในการปรับ kerning มันอาจถูกทำลายได้ด้วยการพิมพ์และสแกนใหม่ ด้วยเครื่องมือแปลง PDF ด้วยการ re-linearise หรือด้วยการเขียน content stream ใหม่ใด ๆ ที่ทำให้ kerning เป็นมาตรฐาน เทคนิคนี้เหมาะที่สุดสำหรับการติดตามการรั่วไหลภายในของเอกสารที่แจกจ่ายในรูปแบบที่สร้างขึ้น นี่ไม่ใช่ steganography เชิงปฏิปักษ์และไม่อยู่รอดผ่านการประมวลผลปลายทางใด ๆ ก็ตาม อย่าพึ่งพามันเป็นมาตรการควบคุมเพียงอย่างเดียวในกรณีที่แบบจำลองภัยคุกคามรวมการลอกออกโดยจงใจ
การจัดการความล้มเหลว
หัวข้อที่มีชื่อว่า “การจัดการความล้มเหลว”- payload ใหญ่เกินไป ตัวเข้ารหัสยกข้อผิดพลาด overflow แบบมีชนิดเมื่อ payload เกินความจุของข้อความ ให้ย่อ payload หรือยืดข้อความตัวพา
- ข้อความตัวพาน้อยเกินไป ข้อความที่สั้นกว่าสองตัวอักษรไม่มีตำแหน่งตัวพาและยกข้อผิดพลาด
- คีย์ผิดเมื่อถอดรหัส การถอดรหัสคืนค่า null ให้ถือ null ว่า “ไม่มีเครื่องหมายที่กู้คืนได้” ไม่ใช่ผลลัพธ์บางส่วน
- การกำหนดค่าไม่ตรงกัน การเข้ารหัสและการถอดรหัสต้องใช้ bit depth, อัตราการเบี่ยงเบน, cipher และแฟล็ก PDF/A เดียวกัน ความไม่ตรงกันจะให้ผลเป็น payload ที่กู้คืนไม่ได้
ขอบเขตการเผยแพร่
หัวข้อที่มีชื่อว่า “ขอบเขตการเผยแพร่”หน้านี้บันทึกเฉพาะพฤติกรรมที่สังเกตได้จากภายนอกและพื้นผิว public API ที่รองรับเท่านั้น เส้นทาง namespace ภายใน คลาสตัวช่วย ตารางกลไก ชื่อไฟล์ runbook และคำนำหน้า ticket อยู่นอกขอบเขต
ดูเพิ่มเติม
หัวข้อที่มีชื่อว่า “ดูเพิ่มเติม”- Steganography — NextPDF Enterprise — เอกสารอ้างอิง API สำหรับตัวเข้ารหัสและตัวถอดรหัสแบบ steganographic
- Security — NextPDF Enterprise — พื้นผิวความปลอดภัยรวมของ Enterprise
- Branding — NextPDF Enterprise — watermark ที่มองเห็นได้และ stamp บนหน้า
- Forensics — NextPDF Enterprise — การตรวจสอบและการติดตามเอกสาร
- Security — NextPDF Core — พื้นผิวการเข้ารหัสและลายเซ็นหลัก
- AEAD · HKDF · kerning — คำศัพท์ในอภิธานศัพท์