إنتقل إلى المحتوى الرئيسي

ربط مقابض الكائنات

من الجوانب الرئيسية لمكتبة DuoKey PKCS#11 نظام ربط مقابض الكائنات، الذي يجسر الفجوة بين مقابض الكائنات الصحيحة في PKCS#11 ومعرّفات المفاتيح الدائمة في DuoKey Cockpit.

نظرة عامة​

المشكلة​

يشير PKCS#11 إلى الكائنات بمقابض صحيحة (أعداد صحيحة غير موقّعة بطول 32 بت)، بينما يشير DuoKey Cockpit إلى المفاتيح بمعرّفات دائمة (سلاسل نصية بتنسيق UUID). يترجم نظام الربط بين الاثنين.

مقابض PKCS#11​

  • النوع: CK_OBJECT_HANDLE (عدد صحيح)
  • النطاق: لكل جلسة (المقابض خاصة بالجلسة)
  • مدة الصلاحية: صالحة فقط أثناء فتح الجلسة

معرّفات المفاتيح في DuoKey​

  • النوع: سلسلة نصية (تنسيق UUID، مثل xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)
  • النطاق: دائم وفريد عبر المنصّة
  • مدة الصلاحية: ثابت (لا تتغيّر المعرّفات)

كيف يعمل​

عملية الربط​

توليد المقابض​

تُولَّد المقابض لكل جلسة:

الخوارزمية:

  1. عيّن المقبض الأول لأول كائن.
  2. زِد المقبض لكل كائن جديد.
  3. خزّن الربط في جدول مقابض الجلسة.

جدول الربط​

تحتفظ كل جلسة بجدول الربط الخاص بها مع عرضَين:

  • الأمامي: المقبض ← معرّف المفتاح
  • العكسي: معرّف المفتاح ← المقبض (للبحث العكسي السريع)

العمليات: إدراج ربط جديد، والبحث عن معرّف لمقبض، والبحث العكسي عن مقبض لمعرّف، وحذف ربط عند تدمير كائن.

أنواع الكائنات​

المفاتيح السرّية​

مفاتيح AES المستخدمة لعمليات التغليف / فكّ التغليف.

Handle: 0x12345
Type: CKO_SECRET_KEY
Algorithm: AES-256

كائنات البيانات​

كائنات بيانات وصفية يستخدمها Oracle لتتبّع معلومات مخزن المفاتيح.

Handle: 0x12346
Type: CKO_DATA
Label: ORACLE.TDE.CDB$ROOT.MK.IDENT

دورة حياة المقبض​

الإنشاء​

تُنشأ المقابض عند العثور على الكائنات (C_FindObjects)، أو عند توليد مفتاح (C_GenerateKey)، أو عند إنشاء كائن بيانات (C_CreateObject).

الاستخدام​

العمليات التي تأخذ مقبضًا: C_Encrypt / C_Decrypt (التغليف / فكّ التغليف)، وC_GetAttributeValue، وC_DestroyObject.

التنظيف​

تُبطَل المقابض عند إغلاق الجلسة؛ ويُزال ربط فردي عند تدمير كائنه.

سيناريوهات أمثلة​

السيناريو 1: العثور على مفتاح رئيسي موجود​

  1. يستدعي Oracle الدالة C_FindObjects بقالب مثل { CKA_LABEL: "TDE-MASTER-20251219" }.
  2. تطلب المكتبة من Cockpit تحديد موقع المفتاح بتلك التسمية.
  3. يُرجع Cockpit معرّف المفتاح.
  4. تتحقّق المكتبة من جدول الربط الخاص بها؛ المعرّف جديد، لذا تعيّن مقبضًا (مثل 0x12345) وتخزّن الربط.
  5. تُرجع المقبض 0x12345 إلى Oracle.

السيناريو 2: تغليف مفتاح مساحة جدولية​

  1. يستدعي Oracle الدالة C_Encrypt(session, 0x12345, tablespaceKey).
  2. تبحث المكتبة عن معرّف المفتاح للمقبض 0x12345.
  3. تطلب المكتبة من Cockpit تغليف مفتاح المساحة الجدولية تحت ذلك المفتاح الرئيسي (AES-CBC-PAD المحافظ على الطول).
  4. يُرجع Cockpit المفتاح المغلّف.
  5. تُرجع المكتبة المفتاح المغلّف إلى Oracle.

السيناريو 3: توليد مفتاح رئيسي جديد​

  1. يستدعي Oracle الدالة C_GenerateKey(session, mechanism, template) لمفتاح AES-256.
  2. تطلب المكتبة من Cockpit توفير المفتاح.
  3. يُرجع Cockpit معرّف المفتاح الجديد.
  4. تعيّن المكتبة مقبضًا (مثل 0x12346) وتخزّن الربط.
  5. تُرجع المقبض 0x12346 إلى Oracle.

اعتبارات الأداء​

  • البحث: O(1) في الحالة المتوسطة (بحث في خريطة التجزئة).
  • إعادة استخدام المقبض: إذا طُلب المعرّف نفسه مرة أخرى، يُرجَع المقبض الموجود لتجنّب عمليات الربط المكرّرة.
  • البحث العكسي: تدعم خريطة معرّف ← مقبض عمليات البحث العكسي السريعة.
  • الذاكرة: تُمسح عمليات الربط عند إغلاق الجلسة.

معالجة الأخطاء​

السيناريوالاستجابة
يقدّم Oracle مقبضًا غير موجود في جدول الربطCKR_OBJECT_HANDLE_INVALID
معرّف مفتاح أُرجع سابقًا لم يعد موجودًا (حُذف الكائن بين العمليات)CKR_DEVICE_ERROR

أفضل الممارسات​

  • لا تخزّن المقابض مؤقتًا عبر الجلسات — فهي خاصة بالجلسة.
  • تحقّق من المقابض قبل الاستخدام.
  • نظّف عمليات الربط عند إغلاق الجلسة.
  • احذف بشكل صحيح باستخدام C_DestroyObject بحيث تُزال عمليات الربط.

الخطوات التالية​