تخطَّ إلى المحتوى

سياسة التشفير والاختبارات الذاتية وفق FIPS 140-2/3

يقصر ⁨NextPDF Enterprise⁩ خيارات التشفير المتاحة لعملية التوقيع أو التشفير على مجموعة معتمدة وفق معايير المعالجة الفيدرالية للمعلومات ‏(⁨FIPS⁩)، ويرفض أي خيار خارج تلك المجموعة. يتحقق حارس وقت التشغيل من كل تجزئة ومعرّف خوارزمية توقيع وخوارزمية تشفير وقوة مفتاح قبل تشغيل العملية. تعمل مجموعة الاختبارات الذاتية عند بدء التشغيل مرة واحدة مع بدء العملية. إذا فشل أي اختبار بإجابة معروفة، تدخل الوحدة في حالة خطأ. تصف هذه الصفحة السلوك: ما الذي تسمح به السياسة، وما الذي يرفضه الحارس، وما الذي يغطيه الاختبار الذاتي، وموقفه الصريح من الاعتماد.

يساعد ⁨NextPDF Enterprise⁩ في الامتثال. وهو ليس وحدة تشفير معتمدة. راجع الأمان والامتثال للاطلاع على موقف عدم الاعتماد الصريح.

تسرد البيانات الأولية المتطلبات المسبقة، ويعيد قسم المتطلبات المسبقة ذكرها.

يُشحَن ملف سياسة التشفير في وضع ⁨FIPS⁩ وحارس وقت التشغيل وحارس الاختبار الذاتي عند بدء التشغيل ضمن حزمة nextpdf/enterprise، ويتطلبان علامة ميزة الترخيص enterprise. لا يوفّر ⁨NextPDF Core⁩ ولا ⁨NextPDF Pro⁩ ملف سياسة في وضع ⁨FIPS.⁩ يعمل الحارس والاختبار الذاتي داخل العملية؛ ولا ترسل فحوص السياسة أو الاختبارات الذاتية محتوى المستند خارج المضيف. قارن بين الإصدارات.

تتكون هذه القدرة من ثلاثة أجزاء: سياسة تشفير، وحارس وقت تشغيل، واختبار ذاتي عند بدء التشغيل.

سياسة التشفير تقصر خيارات التشفير على مجموعة معتمدة، مع إعدادين مسبقين:

  • صارم (متوافق مع جيل ⁨FIPS 140-3⁩) — تجزئات ⁨SHA-256⁩ و⁨SHA-384⁩ و⁨SHA-512⁩؛ ومعرّفات كائنات التوقيع ‏(⁨OIDs⁩) لخوارزميتي ⁨RSA⁩ و⁨ECDSA⁩ مع تلك التجزئات؛ وتشفير ⁨AES-256-CBC⁩؛ وحدود دنيا لأحجام المفاتيح قدرها ⁨RSA 2048⁩ ومنحنى إهليلجي 256.
  • قياسي (متوافق مع جيل ⁨FIPS 140-2⁩) — يطابق الإعداد الصارم، ويسمح أيضًا بتشفير ⁨AES-128-CBC⁩ لأغراض التشغيل البيني الأقدم.

بالنسبة إلى إنشاء التوقيع، يقبل ⁨NIST SP 800-131A Rev.2⁩ §3 مفتاح ⁨RSA⁩ لا يقل عن 2048 بت ورتبة ⁨ECDSA⁩ لا تقل عن 224 بت؛ وتفي الحدود الدنيا 2048/256 في الإعداد الصارم بتلك الحدود الدنيا أو تتجاوزها. ترفض السياسة نوع المفتاح غير المعروف افتراضيًا — فهي لا تقبل نوعًا غير معترف به بصمت.

حارس وقت التشغيل يغلّف السياسة ويُتيح طرق تحقق للتجزئة، ومعرّف التوقيع ‏(⁨OID⁩)، وخوارزمية التشفير، وقوة المفتاح. عندما يكون الخيار غير مسموح به، يُطلِق مخالفة مُصنَّفة تذكر اسم السياسة والعنصر المخالف، ثم يوقف العملية. يفشل المسار بأمان: لا تُخفِّف السياسة قيودها أبدًا ولا تستبدل أبدًا خوارزمية أضعف. بالنسبة إلى توقيع ⁨RSASSA-PSS⁩، تربط بوابة الإنشاء خلاصة الرسالة صراحةً. تتشارك جميع متغيرات ⁨PSS⁩ معرّف توقيع ‏(⁨OID⁩) واحدًا؛ وتوجد التجزئة في معاملات ⁨PSS⁩، لا في معرّف ⁨OID.⁩ لا يمكن لقائمة سماح بمعرّفات ⁨OID⁩ وحدها إثبات الخلاصة الفعلية، لذا تتحقق البوابة من أن الخلاصة معتمدة وفق ⁨FIPS⁩ ‏(⁨SHA-256/384/512⁩). وترفض مع الفشل الآمن أي رمز ⁨PSS⁩ تكون خلاصته غير معروفة أو غير معتمدة، مثل ⁨SHA-1 PSS⁩، قبل أي إرسال إلى الموقّع ‏(⁨FIPS 186-5⁩ §5.4(⁨b⁩)).

الاختبار الذاتي عند بدء التشغيل يُشغِّل مجموعة اختبارات بإجابة معروفة ‏(⁨KAT⁩) مرة واحدة عند بدء العملية. تغطي هذه المجموعة دوال التجزئة، ومصادقة الرسائل، والتشفير، والتشفير المُصادَق، والتوقيع، والبتات العشوائية المعتمدة. بموجب ⁨ISO/IEC 19790⁩:2025 §7.10.4.2، يفشل الاختبار بإجابة معروفة عندما لا يساوي الناتج المحسوب الإجابة المعروفة. عند أي فشل، تدخل الوحدة في حالة خطأ وترفض خدمات التشفير ‏(⁨ISO/IEC 19790⁩:2025 §7.2.4.3). حالة الخطأ ملتصقة بالعملية: بعد أن يرصد أي حارس بدء تشغيل في العملية خطأً، تبقى العملية بأكملها في وضع الفشل الآمن طوال مدة حياتها. لا يمكن لإنشاء حارس بدء تشغيل أو سياسة جديدة مسحها. إعادة تشغيل اختبار ذاتي ناجح لاحقًا لا تمسح خطأً مُثبَّتًا — وحدها إعادة تشغيل العملية (دورة طاقة حقيقية) تفعل ذلك، وفق ⁨ISO/IEC 19790⁩:2025 §7.10.2. تُخزَّن النتيجة مؤقتًا طوال مدة حياة العملية؛ يمكنك تشغيل إعادة تشغيل عند الطلب من نقطة نهاية إدارية أو أمر، لكنها تخدم التزام الاختبار الذاتي الدوري، لا استرداد الخطأ.

تتطلب السياسة متجه تهيئة ‏(⁨IV⁩) فريدًا لكل مفتاح لاستخدام التشفير المُصادَق، وفق ⁨NIST SP 800-38D⁩ §5.2.1.

  1. ثبّت ⁨NextPDF Core⁩ وحزمة ⁨Enterprise⁩، واحتفظ بترخيص ⁨Enterprise⁩ نشط.
  2. للادعاء بتشغيل متوافق مع ⁨FIPS⁩، اضبط ⁨NextPDF⁩ باستخدام مزوّد تشفير معتمد وفق ⁨FIPS⁩ — مثل مزوّد ⁨OpenSSL⁩ معتمد وفق ⁨FIPS⁩ — أو وحدة أمان أجهزة ‏(⁨HSM⁩) معتمدة وفق ⁨FIPS.⁩ يتولى ⁨NextPDF Enterprise⁩ التجميع البنيوي وحساب الخلاصة وفرض السياسة؛ بينما تعمل العملية الأساسية الأولية داخل الحدود المعتمدة التي توفّرها.
  3. اختر الإعداد المسبق: صارم للفرض المتوافق مع ⁨FIPS 140-3⁩، أو قياسي عندما يكون التشغيل البيني لـ ⁨AES-128-CBC⁩ مطلوبًا.
  • الإعداد المسبق — اختر صارم أو قياسي. يسمح الإعداد الصارم بـ ⁨AES-256-CBC⁩ فقط؛ بينما يسمح الإعداد القياسي أيضًا بـ ⁨AES-128-CBC.⁩
  • الحارس — أنشئ الحارس باستخدام السياسة المختارة. استخدم الحارس بوصفه الحد الذي تتحقق عنده من كل خيار تشفير.
  • ربط الاختبار الذاتي — اربط حارس بدء التشغيل عند تهيئة التطبيق بحيث تُشغِّل كل عملية عامل دورة الاختبار الذاتي الخاصة بها. تُشغِّل كل نسخة عملية اختبارها الذاتي عند بدء التشغيل.
  1. عند تهيئة التطبيق، شغّل الاختبار الذاتي عند بدء التشغيل عبر حارس بدء التشغيل، وتحقق من أن الوحدة قيد التشغيل. أوقف العملية إذا لم تكن كذلك.
  2. أنشئ الحارس باستخدام السياسة الصارمة أو القياسية.
  3. قبل كل عملية تشفير، تحقق من التجزئة ومعرّف التوقيع ‏(⁨OID⁩) وخوارزمية التشفير وقوة المفتاح عبر الحارس.
  4. التقط المخالفة المُصنَّفة، وسجّل رسالة بنيوية، وارفض العملية. لا تلجأ إلى خيار أضعف.
examples/enterprise/fips-boot-and-guard.php
<?php
declare(strict_types=1);
require_once __DIR__ . '/../../vendor/autoload.php';
use NextPDF\Enterprise\Security\Fips\FipsBootGuard;
use NextPDF\Enterprise\Security\Fips\FipsCryptoPolicy;
use NextPDF\Enterprise\Security\Fips\FipsModeGuard;
use NextPDF\Enterprise\Security\Fips\FipsSelfTest;
use NextPDF\Enterprise\Security\Fips\FipsModuleErrorStateException;
use Psr\Log\LoggerInterface;
/**
* Run the power-on self-test, then build a guard on the strict policy.
*
* The self-test runs once per process. A known-answer failure raises a
* module-error-state exception; the caller must stop rather than proceed
* with an unverified crypto path.
*
* @param LoggerInterface $logger Structural diagnostics only — never secrets.
*
* @throws FipsModuleErrorStateException When a power-on known-answer test fails.
*
* @return FipsModeGuard A guard ready to assert each cryptographic choice.
*/
function bootFipsGuard(LoggerInterface $logger): FipsModeGuard
{
$bootGuard = new FipsBootGuard(new FipsSelfTest());
try {
$bootGuard->assertOperational();
} catch (FipsModuleErrorStateException $e) {
$logger->critical('FIPS power-on self-test failed; refusing crypto services.', [
'reason' => $e->getMessage(),
]);
throw $e;
}
return new FipsModeGuard(FipsCryptoPolicy::strict());
}
examples/enterprise/fips-assert-choices.php
<?php
declare(strict_types=1);
require_once __DIR__ . '/../../vendor/autoload.php';
use NextPDF\Enterprise\Security\Fips\FipsModeGuard;
use NextPDF\Enterprise\Security\Fips\FipsViolationException;
use Psr\Log\LoggerInterface;
final readonly class FipsCheckedSigning
{
public function __construct(
private FipsModeGuard $guard,
private LoggerInterface $logger,
) {}
/**
* Assert the signing choices against the active policy before signing.
*
* A disallowed hash, signature OID, or key strength raises a typed
* violation; the operation is refused rather than downgraded.
*
* @param string $hash The hash algorithm name (e.g. 'sha256').
* @param string $signatureOid The signature algorithm OID.
* @param string $keyType The key type (e.g. 'rsa', 'ec').
* @param positive-int $keyBits The key length in bits.
*
* @throws FipsViolationException When any choice is not approved.
*/
public function assertApproved(
string $hash,
string $signatureOid,
string $keyType,
int $keyBits,
): void {
try {
$this->guard->assertHashAllowed($hash);
$this->guard->assertSignatureAlgorithmAllowed($signatureOid);
$this->guard->assertKeyStrengthAllowed($keyType, $keyBits);
} catch (FipsViolationException $e) {
$this->logger->error('FIPS policy violation', ['reason' => $e->getMessage()]);
throw $e;
}
}
}
  1. شغّل الاختبار الذاتي عند بدء التشغيل وتأكّد من أنه يبلّغ أن الوحدة قيد التشغيل. تأكّد من أنه يختبر كل فئة خوارزمية معتمدة — التجزئة، ومصادقة الرسائل، والتشفير، والتشفير المُصادَق، والتوقيع، والبتات العشوائية.
  2. تحقّق من خيار معتمد، مثل ⁨SHA-256⁩ و⁨RSA 2048⁩، وتأكّد من أنه يجتاز الفحص. تحقّق من خيار غير مسموح به، مثل ⁨SHA-1⁩ و⁨RSA 1024⁩، وتأكّد من أنه يُطلِق مخالفة مُصنَّفة.
  3. أدخِل تجزئة معطّلة عمدًا أو مصدرًا عشوائيًا معطّلًا في الاختبار الذاتي وتأكّد من أن الوحدة تدخل في حالة الخطأ وترفض الخدمات.
  4. تأكّد من أن نوع المفتاح غير المعروف يُرفَض افتراضيًا بدلًا من قبوله.
  • الفشل الآمن. عندما يكون خيار التشفير غير مسموح به، يُطلِق الحارس مخالفة مُصنَّفة ويوقف العملية. لا تُخفِّف السياسة قيودها أبدًا ولا تستبدل أبدًا خوارزمية أضعف.
  • الاختبار الذاتي يرفض عند عدم التطابق. يضع فشل الاختبار بإجابة معروفة الوحدة في حالة خطأ ملتصقة بالعملية. تبقى العملية بأكملها في وضع الفشل الآمن؛ ولا يمكن لحارس بدء تشغيل أو سياسة جديدة استردادها، ولا تُزيل إعادة تشغيل ناجحة القفل. فقط إعادة تشغيل العملية تمسحها ‏(⁨ISO/IEC 19790⁩:2025 §7.10.4.2؛ §7.10.2).
  • قوة المفتاح. يفرض الإعداد الصارم حدودًا دنيا قدرها ⁨RSA 2048⁩ ومنحنى إهليلجي 256، وهي تفي بالحدود الدنيا المقبولة في ⁨NIST SP 800-131A Rev.2⁩ §3 أو تتجاوزها.
  • تفرّد متجه التهيئة. يتطلب استخدام التشفير المُصادَق متجه تهيئة ‏(⁨IV⁩) فريدًا لكل مفتاح ‏(⁨NIST SP 800-38D⁩ §5.2.1).

هذه الصفحة مُعلَّمة بـ export_control_class: legal-review-required لأنها تتعلق بسياسة التشفير. كل مصدر معياري مُعاد صياغته؛ ولا يُستنسخ أي نص معياري. يلزم الحصول على موافقة قانونية قبل تعيين علامة publish.

⁨NextPDF Enterprise⁩ ليس وحدة تشفير معتمدة وفق ⁨FIPS⁩ ولا يقدّم أي ادعاء اعتماد وفق ⁨FIPS.⁩ وهو يعمل في وضع متوافق مع ⁨FIPS⁩ فقط عندما تضبطه باستخدام مزوّد تشفير معتمد وفق ⁨FIPS⁩ — مثل مزوّد ⁨OpenSSL⁩ معتمد وفق ⁨FIPS⁩ — أو وحدة أمان أجهزة ‏(⁨HSM⁩) معتمدة وفق ⁨FIPS.⁩ تساعد سياسة وضع ⁨FIPS⁩ في الامتثال؛ وهي ليست اعتمادًا ولا رأيًا قانونيًا. استشر مستشاري الامتثال والمستشارين القانونيين الخاصين بك بشأن التزاماتك التنظيمية.

  • فشل الاختبار الذاتي عند بدء التشغيل. يُطلِق حارس بدء التشغيل استثناء حالة خطأ الوحدة. أوقف العملية؛ ولا تتابع في مسار تشفير لم يُتحقَّق منه.
  • مخالفة السياسة. يُطلِق الحارس مخالفة مُصنَّفة تذكر اسم السياسة والعنصر المخالف. ارفض العملية؛ ولا تُخفِّض المستوى.
  • نوع مفتاح غير معروف. ترفضه السياسة افتراضيًا. عيّن نوع المفتاح بشكل صريح فقط إذا كان معتمدًا فعلًا.
  • إعادة تشغيل الاختبار الذاتي. تتوفّر إعادة تشغيل عند الطلب من نقطة نهاية إدارية أو أمر، بما يفي بالتزام الاختبار الذاتي الدوري عند الطلب. وهي ليست آلية استرداد: فإعادة التشغيل الفاشلة تُثبِّت العملية أيضًا، وإعادة التشغيل الناجحة لا تُزيل قفلًا قائمًا. يتطلب استرداد وحدة في حالة الخطأ إعادة تشغيل العملية.

يُشحَن ⁨NextPDF Core⁩ مع الموقّع البرمجي والتشفير دون ملف سياسة في وضع ⁨FIPS.⁩ يضيف ⁨NextPDF Enterprise⁩ ملف سياسة التشفير في وضع ⁨FIPS⁩ وحارس وقت التشغيل وحارس الاختبار الذاتي عند بدء التشغيل، بحيث يمكنك قصر خيارات التشفير على مجموعة معتمدة والفشل بأمان عند عدم تطابق الاختبار الذاتي. اقرنه بـ التوقيع بوحدة ⁨HSM⁩ لتشغيل العملية الأولية داخل جهاز معتمد وفق ⁨FIPS.⁩ قارن بين الإصدارات.