يستخدم Tink مجموعات المفاتيح لتفعيل ميزة تغيير مفاتيح التشفير. من الناحية الرسمية، مجموعة المفاتيح هي قائمة1 غير فارغة من المفاتيح التي يتم فيها تحديد مفتاح أساسي (المفتاح الذي يتم استخدامه مثلاً لتوقيع النصوص الواضحة الجديدة وتشفيرها). بالإضافة إلى ذلك، تحصل المفاتيح في مجموعة مفاتيح على معرّف فريد2 وحالة مفتاح تسمح بإيقاف المفاتيح بدون إزالتها من مجموعة مفاتيح.
مجموعات المفاتيح هي الطريقة الرئيسية التي يمكن للمستخدمين من خلالها الوصول إلى المفاتيح (من خلال الفئة
KeysetHandle
). ويضمن ذلك أن يكون لكل مستخدم رمز لمعالجة مفاتيح متعددة
في آنٍ واحد. بالنسبة إلى معظم مستخدمي التشفير، فإنّ التعامل مع مفاتيح متعددة هو
ضرورة: يجب أن يكون من الممكن تغيير المفاتيح (يمكن تسريب المفاتيح القديمة،
على سبيل المثال)، ولا يكاد يكون هناك عملية "تبديل إلى المفتاح التالي"
يمكن تطبيقها على الأجهزة التي يتم تشغيل الرمز عليها وجميع النصوص المشفَّرة،
على مستوى العالم وفي لحظة. وبالتالي، يحتاج المستخدم إلى كتابة رمز برمجي يعمل عند تغيير المفتاح من مفتاح إلى آخر.
مثال: AEAD
فكِّر في مجموعة مفاتيح AEAD التي تحتوي على مفاتيح متعددة لعنصر AEAD الأولي. كما سبق أن أوضحنا، يحدِّد كل مفتاح بشكل فريد وظيفتَين: \(\mathrm{Enc}\) و \(\mathrm{Dec}\). تحدِّد مجموعة المفاتيح الآن أيضًا دالتَين جديدتَين: \(\mathrm{Enc}\) و \(\mathrm{Dec}\) - \(\mathrm{Enc}\) ، وهما تساويان ببساطة الدالة \(\mathrm{Enc}\) للمفتاح الأساسي لمجموعة المفاتيح، بينما تحاول الدالة \(\mathrm{Dec}\) فك التشفير باستخدام كل المفاتيح، مع مراجعتها بترتيب معيّن (اطّلِع على القسم أدناه لمعرفة كيفية تحسين Tink لأداء هذه العملية).
تجدر الإشارة إلى أنّ مجموعات المفاتيح هي مفاتيح كاملة:
فهي وصف كامل للدوالّ \(\mathrm{Enc}\) و
\(\mathrm{Dec}\) المستخدَمة. وهذا يعني أنّه يمكن للمستخدمين كتابة فئة تأخذ KeysetHandle
كمدخل، ما يشير إلى أنّ الفئة تحتاج إلى وصف كامل
للكائنات \(\mathrm{Enc}\) و \(\mathrm{Dec}\) لكي تعمل
بشكلٍ سليم. يتيح ذلك للمستخدم كتابة واجهات برمجة تطبيقات تُعلمه بأنّه لاستخدام
هذه الفئة، عليك تقديم وصف لآلية تشفير أساسية.
تغيير مفاتيح التشفير
لنفترض أنّ أحد مستخدمي Tink يكتب برنامجًا يحصل أولاً على مجموعة مفاتيح من إدارة الخدمات الرئيسية (KMS)، ثم ينشئ عنصر AEAD من مجموعة المفاتيح هذه، ويستخدم أخيرًا هذا العنصر لتشفير النصوص المشفّرة وفك تشفيرها.
يتم إعداد هذا المستخدم تلقائيًا لتغيير المفاتيح، وتغيير الخوارزميات في حال لم يعد اختياره الحالي يستوفي المعيار.
يجب الانتباه إلى بعض الأمور عند تنفيذ عملية تدوير المفاتيح هذه: أولاً، يجب أن تضيف خدمة إدارة مفاتيح التشفير مفتاحًا جديدًا إلى مجموعة المفاتيح (ولكن ليس كملف أساسي بعد). بعد ذلك، يجب طرح مجموعة المفاتيح الجديدة في جميع الملفات الثنائية، بحيث يحتوي كل ملف ثنائي يستخدم مجموعة المفاتيح هذه على أحدث مفتاح في مجموعة المفاتيح. بعد ذلك فقط، يجب جعل المفتاح الجديد أساسيًا، وتوزيع مجموعة المفاتيح الناتجة مرة أخرى على جميع الملفات الثنائية التي تستخدم مجموعة المفاتيح.
معرّفات المفاتيح في النصوص المشفّرة
نذكّرك مرة أخرى بمثال مجموعة مفاتيح التشفير من النوع AEAD. في حال إجراء ذلك بشكل عفوي، يتطلب فك تشفير نص مشفَّر من Tink محاولة فك التشفير باستخدام جميع المفاتيح في مجموعة المفاتيح، لأنّه لا توجد طريقة لمعرفة المفتاح الذي تم استخدامه لتشفير مجموعة المفاتيح. وقد يؤدي ذلك إلى زيادة كبيرة في تكلفة الأداء.
لهذا السبب، تسمح Tink بإضافة سلسلة من 5 بايت قبل النصوص المشفّرة، تكون مستمَدة من المعرّف. وفقًا لفلسفة "المفاتيح الكاملة" أعلاه، هذه البادئة جزء من المفتاح، وجميع النصوص المشفّرة التي تم الحصول عليها باستخدام هذا المفتاح يجب أن تحتوي على هذه البادئة. عندما ينشئ المستخدمون مفاتيح، يمكنهم اختيار ما إذا كان المفتاح سيستخدم بادئة مماثلة، أو إذا كان يجب استخدام تنسيق نص مشفَّر بدونها.
عندما يكون المفتاح في مجموعة مفاتيح، تحسب Tink هذه العلامة من المعرّف الذي يحتوي عليه المفتاح في مجموعة المفاتيح. تشير حقيقة أنّ المعرّفات فريدة2 ضمن مجموعة مفاتيح إلى أنّ العلامات فريدة. وبالتالي، في حال استخدام المفاتيح المُصنَّفة فقط، لن ينخفض الأداء مقارنةً بفك التشفير باستخدام مفتاح واحد: ما على Tink سوى تجربة أحد المفاتيح عند فك التشفير.
ومع ذلك، بما أنّ العلامة هي جزء من المفتاح، يعني ذلك أيضًا أنّه لا يمكن أن يكون المفتاح في مجموعة مفاتيح إلّا إذا كان لديه معرّف واحد محدّد. وينتج عن ذلك بعض التأثيرات عند وصف تنفيذ العناصر الرئيسية بلغات مختلفة.
-
لا تزال بعض أجزاء Tink تتعامل مع مجموعات المفاتيح كمجموعة. ومع ذلك، ينبغي تغيير ذلك. والسبب هو أنّ الترتيب مهم بشكل عام: على سبيل المثال، نأخذ بعين الاعتبار دورة حياة تدوير المفتاح المعتادة باستخدام Aead. أولاً، تتم إضافة مفتاح جديد إلى مجموعة مفاتيح. لم يتم ضبط هذا المفتاح على أنّه أساسي بعد، ولكنه نشط. يتم طرح مجموعة المفاتيح الجديدة هذه لجميع الملفات الثنائية. بعد أن تعرف جميع الملفات الثنائية على المفتاح الجديد، يصبح المفتاح أساسيًا (في هذه المرحلة فقط، يكون استخدام هذا المفتاح آمنًا). في هذه الخطوة الثانية، يجب أن يعرف تبديل المفاتيح المفتاح الأخير الذي تمت إضافته. ↩
-
للتوافق مع مكتبة داخلية في Google، يسمح Tink باستخدام مجموعات مفاتيح يتم فيها تكرار المعرّفات. ستتم إزالة هذه الميزة في المستقبل. ↩