Enterprise الإصدار
العلامة المائية الرقمية والتضمين الإخفائي
لمحة سريعة
قسم بعنوان «لمحة سريعة»يُضمِّن NextPDF Enterprise حمولة مخفيّة مُشفَّرة في PDF مولَّد عبر إجراء تعديلات صغيرة مضبوطة على التباعد بين أزواج الحروف. تزوّد حمولة — عادةً معرّفًا لكل مستلِم — ومفتاحًا سرّيًا؛ ويكتب المُرمِّز الحمولة كانحرافات غير محسوسة عن التقنين الطبيعي للنص. يستعيد مُفكِّك مطابق، مُعطًى المفتاح نفسه، الحمولةَ. هذه الصفحة على مستوى السلوك: تبيّن ما يكتبه المُرمِّز، والتشفير الذي يستخدمه، وحدّ التقنية.
الاستخدام المقصود هو تتبّع تسريب المستندات الداخلية: عند تسريب مستند مضبوط، تحدّد العلامة المُستعادة نسخة المستلِم. وهي ليست إخفائيات عدائية ولا ضمانًا للبقاء عبر معالجة اعتباطية.
المتطلّبات المسبقة مذكورة في المقدّمة ومكرّرة تحت المتطلّبات المسبقة.
الإصدار والترخيص
قسم بعنوان «الإصدار والترخيص»يُشحَن هذا التضمين في NextPDF Enterprise (nextpdf/enterprise) ويُفعَّل بمظروف ترخيص من فئة Enterprise. لا يحمّل النشرُ الذي يفتقر إلى ذلك الاستحقاق أصنافَ القدرة. تعمل القدرة بالكامل داخل العملية أثناء توليد المستند؛ ولا يغادر أي محتوى مستند المضيف. قارن الإصدارات واحصل على ترخيص.
ما الذي تفعله هذه القدرة
قسم بعنوان «ما الذي تفعله هذه القدرة»يحمل نص PDF المرسوم بمصفوفة تقنين تعديلًا عدديًا بين المحارف. يعامل المُرمِّز كل موضع تعديل كحامل لبضع بتات:
- يُشفّر الحمولة بمعمّى تشفير مُصادَق عليه مع بيانات مُرتبطة (AEAD) — AES-256-GCM افتراضيًا، أو ChaCha20-Poly1305. يوفّر AEAD السرّية والسلامة معًا، بحيث يفشل الحامل المُعبَث به في فكّ التشفير بدلًا من إنتاج حمولة خاطئة بصمت.
- يشتقّ مفتاح التشفير ذا الـ 32 بايت من مفتاحك السرّي ومفتاح الخط باستخدام دالة اشتقاق المفاتيح القائمة على HMAC (HKDF) مع SHA-256. يستخلص HKDF مفتاحًا شبه عشوائي ثابت الطول من مادة المفاتيح المُدخَلة، ثم يوسّعه إلى الطول المطلوب، وفق RFC 5869 §2.
- يولّد شعاع تهيئة (IV) عشوائيًا جديدًا من 12 بايت لكل تشفير. يتطلّب AES-GCM أن يكون IV فريدًا لمفتاح معطى، وإلا فُقد تأكيد المصادقة، وفق NIST SP 800-38D §5.2.1.
- يربط البايتات المُشفَّرة بسلسلة بتات ويوزّع البتات عبر مواضع أزواج الحروف المتاحة، مُرمِّزًا بتًا أو بتين لكل موضع. الانحراف الذي يضيفه إلى التقنين الطبيعي محدود بكسر قابل للتهيئة من وحدة em — صغير بما يكفي ليبقى غير محسوس بصريًا.
يعكس المُفكِّك العملية: يقرأ تعديلات التقنين من دفق محتوى، ويطرح التقنين الطبيعي، ويُكمّم الانحرافات عودًا إلى بتات، ويعيد تجميع الكتلة المُشفَّرة، ويفكّ تشفيرها بالمفتاح نفسه. إذا كان المفتاح خاطئًا أو أُتلِف الحامل، يُرجع فكّ التشفير لا شيء بدلًا من حمولة خاطئة.
تتناسب السعة مع طول النص: يحمل كل موضع زوج حروف بتًا أو بتين، لذا يجب أن تتسع الحمولة للمواضع التي يوفّرها النص. يثير المُرمِّز خطأ فيضان من نوع محدَّد عند تجاوز الحمولة السعة.
يخفض وضع التوافق مع PDF/A الانحراف الأقصى إلى النصف ليبقى دون عَتَبة تساهل العرض لدى أداة التحقّق، مقايضًا السعة بمطابقة أصرم.
لماذا يعمل بهذه الطريقة
قسم بعنوان «لماذا يعمل بهذه الطريقة»الخيار الحامل هو إخفاء العلامة في التقنين بدلًا من طبقة مرئية فوقية أو حقل بيانات وصفية. علامة البيانات الوصفية تافهة التجريد، والختم المرئي يغيّر الصفحة. أما انحرافات التقنين فتركب داخل النص الذي يجب أن يحتفظ به المستلِم، وتبقى غير محسوسة. التشفير المُصادَق عليه هو الركيزة الثانية: الحامل المُعبَث به أو الجزئي يفشل في المصادقة، فيُرجع المُفكِّك لا شيء بدلًا من مستلِم خاطئ. يُشتقّ المفتاح لكل خط بـ HKDF، مُقيِّدًا العلامة بسياق المستند، لا بسرّ مشترك مجرَّد. ويتبع بيان المتانة الصادق مباشرةً: تبقى العلامة عبر إعادة التوزيع العادية لكن ليس عبر إعادة كتابة دفق المحتوى المتعمَّدة، لذا النطاق المذكور هو تتبّع التسريب الداخلي، لا الإخفائيات العدائية.
خلفية التصميم: التنقيح ليس مستطيلًا أسود.
المتطلّبات المسبقة
قسم بعنوان «المتطلّبات المسبقة»- ثبّت NextPDF Core وحزمة Enterprise، واحمل ترخيص Enterprise نشطًا.
- ولّد المستند بخط يعرض مقاييس أزواج التقنين؛ يقرأ المُرمِّز التقنين الطبيعي من مقاييس الخط.
- زوّد المفتاح السرّي من مدير أسرارك، لا من المصدر. المفتاح نفسه مطلوب لفكّ التشفير.
- حدّد عمق البتات (بت أو بتان لكل موضع) وما إذا كان التوافق مع PDF/A مطلوبًا، بناءً على احتياجاتك من السعة والمطابقة.
التهيئة
قسم بعنوان «التهيئة»تهيئة الترميز ثابتة ومُتحقَّق منها عند الإنشاء:
- عمق البتات — بت أو بتان لكل موضع زوج حروف. العمق الأعلى يعطي سعة أكبر لكن انحرافات أكبر.
- نسبة التعديل القصوى — سقف الانحراف ككسر من وحدة em، ضمن مدى محدود. القيم الأكبر تعطي هامشًا أكبر لكنها تخاطر بالظهور.
- المعمّى — AES-256-GCM (افتراضي) أو ChaCha20-Poly1305. كلاهما AEAD.
- التوافق مع PDF/A — عند تفعيله، يخفض الانحراف الأقصى الفعّال إلى النصف.
استخدم التهيئة نفسها للترميز والفكّ؛ فعدم التطابق يُنتج عدم استعادة أي حمولة.
خطوة بخطوة
قسم بعنوان «خطوة بخطوة»- اقرأ المفتاح السرّي من مدير أسرارك.
- ابنِ تهيئة الترميز (عمق البتات، ونسبة الانحراف، والمعمّى، وعلم PDF/A).
- احسب تعديلات التقنين للنص الذي توشك على إخراجه، مُمرِّرًا الحمولة، والنص، ومفتاح الخط، ومقاييس الخط، والمفتاح السرّي، والتهيئة.
- طبّق التعديلات المُعادة عند كتابة مقطع النص، بحيث تُضمَّن العلامة أثناء التوليد.
- لتتبّع نسخة مُسرَّبة، شغّل المُفكِّك على دفق محتوى المستند المشتبه به بمفتاح الخط نفسه، ومقاييس الخط، والمفتاح السرّي، والتهيئة، واقرأ الحمولة المُستعادة.
<?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; }}التحقق
قسم بعنوان «التحقق»- رمّز حمولة معروفة في مقطع نص معروف، ثم فكّها بالمفتاح والتهيئة نفسيهما؛ وأكّد تطابق الحمولة المُستعادة.
- فكّ بمفتاح خاطئ عمدًا وأكّد أن النتيجة null، لا حمولة خاطئة — هذا ضمان سلامة AEAD في العمل.
- افحص الصفحة المُخرَجة وأكّد أن تغيّر التباعد غير ظاهر بصريًا عند نسبة الانحراف المُهيَّأة.
- عند اشتراط التوافق مع PDF/A، تحقّق من المُخرَج مقابل ملف تعريف PDF/A لديك وأكّد عدم تجاوز تساهل العرض.
الأمان والمطابقة
قسم بعنوان «الأمان والمطابقة»- تشفير مُصادَق عليه. الحمولة مُشفَّرة بـ AES-256-GCM أو ChaCha20-Poly1305. يفشل الحامل المُعبَث به أو المبتور في المصادقة عند فكّ التشفير؛ ولا يُنتج حمولة خاطئة.
- IV لكل تشفير. يُولَّد IV عشوائي جديد من 12 بايت لكل تشفير، مُحقِّقًا متطلّب تفرّد AES-GCM وفق NIST SP 800-38D §5.2.1.
- مفتاح مُشتقّ. يُشتقّ مفتاح التشفير بـ HKDF-SHA-256 من سرّك ومفتاح الخط (RFC 5869 §2). أبقِ السرّ في مدير أسرارك؛ وعامِله كأي سرّ توقيع.
- العلامة محتوى مستند. البايتات المُضمَّنة جزء من محتوى الصفحة، لا محتوى سجل. لا تكتب الحمولة ولا المفتاح السرّي إلى السجلات.
تتعلق هذه الصفحة بالتضمين التشفيري. كل مصدر معياري مُعاد صياغته؛ ولا يُعاد إنتاج أي نص معياري. ### بيان المتانة
العلامة محمولة في تعديلات التقنين. قد تتلف بالطباعة وإعادة المسح، أو بأدوات تحويل PDF، أو بإعادة التخطيط الخطّي، أو بأي إعادة كتابة لدفق المحتوى تُسوّي التقنين. التقنية الأنسب لتتبّع التسريب الداخلي للمستندات المُوزَّعة بصيغتها المولَّدة. وهي ليست إخفائيات عدائية ولا تبقى عبر معالجة لاحقة اعتباطية. لا تعتمد عليها كضابط وحيد حيث يتضمّن نموذج التهديد التجريد المتعمَّد.
معالجة الإخفاق
قسم بعنوان «معالجة الإخفاق»- حمولة أكبر من اللازم. يثير المُرمِّز خطأ فيضان من نوع محدَّد عند تجاوز الحمولة سعة النص. قصّر الحمولة أو طوّل نص الحامل.
- نص حامل قليل جدًا. النص الأقصر من حرفين لا يوفّر أي موضع حامل ويثير خطأً.
- مفتاح خاطئ عند الفكّ. يُرجع الفكّ null. عامِل null على أنه «لم تُستعَد أي علامة»، لا نتيجة جزئية.
- عدم تطابق التهيئة. يجب أن يستخدم الترميز والفكّ عمق البتات نفسه، ونسبة الانحراف، والمعمّى، وعلم PDF/A؛ فعدم التطابق يُنتج عدم استعادة أي حمولة.
حدود النشر
قسم بعنوان «حدود النشر»توثّق هذه الصفحة السلوك القابل للملاحظة خارجيًا وسطح API العام المدعوم فقط. مسارات فضاء الأسماء الداخلية، والأصناف المساعِدة، وجداول الآليات، وأسماء ملفات كتيّبات التشغيل، وبادئات التذاكر خارج النطاق.
انظر أيضًا
قسم بعنوان «انظر أيضًا»- التضمين الإخفائي — NextPDF Enterprise — مرجع API لمُرمِّز ومُفكِّك التضمين الإخفائي.
- الأمان — NextPDF Enterprise — سطح أمان Enterprise المُجمَّع.
- العلامة التجارية — NextPDF Enterprise — العلامات المائية المرئية والأختام على الصفحة.
- التحليل الجنائي — NextPDF Enterprise — فحص المستندات وتتبّعها.
- الأمان — NextPDF Core — سطح التشفير والتوقيع الأساسي.
- AEAD · HKDF · التقنين — مصطلحات المسرد.