ربط مقابض الكائنات
من الجوانب الرئيسية لمكتبة 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) - النطاق: دائم وفريد عبر المنصّة
- مدة الصلاحية: ثابت (لا تتغيّر المعرّفات)
كيف يعمل
عملية الربط
توليد المقابض
تُولَّد المقابض لكل جلسة:
الخوارزمية:
- عيّن المقبض الأول لأول كائن.
- زِد المقبض لكل كائن جديد.
- خزّن الربط في جدول مقابض الجلسة.
جدول الربط
تحتفظ كل جلسة بجدول الربط الخاص بها مع عرضَين:
- الأمامي: المقبض ← معرّف المفتاح
- العكسي: معرّف المفتاح ← المقبض (للبحث العكسي السريع)
العمليات: إدراج ربط جديد، والبحث عن معرّف لمقبض، والبحث العكسي عن مقبض لمعرّف، وحذف ربط عند تدمير كائن.
أنواع الكائنات
المفاتيح السرّية
مفاتيح 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: العثور على مفتاح رئيسي موجود
- يستدعي Oracle الدالة
C_FindObjectsبقالب مثل{ CKA_LABEL: "TDE-MASTER-20251219" }. - تطلب المكتبة من Cockpit تحديد موقع المفتاح بتلك التسمية.
- يُرجع Cockpit معرّف المفتاح.
- تتحقّق المكتبة من جدول الربط الخاص بها؛ المعرّف جديد، لذا تعيّن مقبضًا (مثل
0x12345) وتخزّن الربط. - تُرجع المقبض
0x12345إلى Oracle.
السيناريو 2: تغليف مفتاح مساحة جدولية
- يستدعي Oracle الدالة
C_Encrypt(session, 0x12345, tablespaceKey). - تبحث المكتبة عن معرّف المفتاح للمقبض
0x12345. - تطلب المكتبة من Cockpit تغليف مفتاح المساحة الجدولية تحت ذلك المفتاح الرئيسي (AES-CBC-PAD المحافظ على الطول).
- يُرجع Cockpit المفتاح المغلّف.
- تُرجع المكتبة المفتاح المغلّف إلى Oracle.
السيناريو 3: توليد مفتاح رئيسي جديد
- يستدعي Oracle الدالة
C_GenerateKey(session, mechanism, template)لمفتاح AES-256. - تطلب المكتبة من Cockpit توفير المفتاح.
- يُرجع Cockpit معرّف المفتاح الجديد.
- تعيّن المكتبة مقبضًا (مثل
0x12346) وتخزّن الربط. - تُرجع المقبض
0x12346إلى Oracle.
اعتبارات الأداء
- البحث: O(1) في الحالة المتوسطة (بحث في خريطة التجزئة).
- إعادة استخدام المقبض: إذا طُلب المعرّف نفسه مرة أخرى، يُرجَع المقبض الموجود لتجنّب عمليات الربط المكرّرة.
- البحث العكسي: تدعم خريطة معرّف ← مقبض عمليات البحث العكسي السريعة.
- الذاكرة: تُمسح عمليات الربط عند إغلاق الجلسة.
معالجة الأخطاء
| السيناريو | الاستجابة |
|---|---|
| يقدّم Oracle مقبضًا غير موجود في جدول الربط | CKR_OBJECT_HANDLE_INVALID |
| معرّف مفتاح أُرجع سابقًا لم يعد موجودًا (حُذف الكائن بين العمليات) | CKR_DEVICE_ERROR |
أفضل الممارسات
- لا تخزّن المقابض مؤقتًا عبر الجلسات — فهي خاصة بالجلسة.
- تحقّق من المقابض قبل الاستخدام.
- نظّف عمليات الربط عند إغلاق الجلسة.
- احذف بشكل صحيح باستخدام
C_DestroyObjectبحيث تُزال عمليات الربط.
الخطوات التالية
- طبقة واجهة PKCS#11 → - شاهد كيفية استخدام المقابض
- تدفّق الاتصال → - افهم التدفّق من طرف إلى طرف
- الآليات التشفيرية → - تعلّم عن العمليات المدعومة