الميزات

تحتوي هذه الصفحة على معلومات حول ميزات التشفير في Android Keystore، كما هو موفّر من خلال تنفيذ KeyMint (أو Keymaster) الأساسي.

العمليات الأساسية للتشفير

توفّر خدمة Keystore فئات العمليات التالية:

  • إنشاء مفاتيح ينتج عنه مادة مفتاح خاص أو سرّي لا يمكن الوصول إليها إلا من خلال البيئة الآمنة. يمكن للعملاء إنشاء مفاتيح بالطرق التالية:
    • إنشاء مفتاح جديد
    • استيراد مواد المفاتيح غير المشفرة
    • استيراد مواد المفاتيح المشفَّرة
  • إثبات صحة المفتاح: يؤدي إنشاء مفتاح غير متماثل إلى إنشاء شهادة تتضمّن جزء المفتاح العام من زوج المفاتيح. تحتوي هذه الشهادة اختياريًا أيضًا على معلومات حول البيانات الوصفية للمفتاح وحالة الجهاز، وكلها موقّعة بمفتاح مرتبط بسلسلة مفاتيح تعود إلى مصدر موثوق.
  • عمليات التشفير:
    • التشفير المتماثل وفك التشفير (AES و3DES)
    • فك التشفير غير المتماثل (RSA)
    • التوقيع غير المتماثل (ECDSA وRSA)
    • التوقيع والتحقّق المتماثلان (HMAC)
    • اتفاقية المفتاح غير المتماثل (ECDH)

يتم تحديد عناصر البروتوكول، مثل الغرض والوضع والتعبئة، بالإضافة إلى قيود التحكّم في الوصول، عند إنشاء المفاتيح أو استيرادها، ويتم ربطها بشكل دائم بالمفتاح، ما يضمن عدم إمكانية استخدام المفتاح بأي طريقة أخرى.

بالإضافة إلى القائمة أعلاه، هناك خدمة أخرى توفّرها عمليات تنفيذ KeyMint (المعروفة سابقًا باسم Keymaster)، ولكنّها غير متاحة كواجهة برمجة تطبيقات، وهي: إنشاء أرقام عشوائية. ويتم استخدام ذلك داخليًا لإنشاء المفاتيح ومتّجهات الإعداد والتعبئة العشوائية وعناصر أخرى من البروتوكولات الآمنة التي تتطلّب التوزيع العشوائي.

العناصر الأساسية الضرورية

توفّر جميع عمليات تنفيذ KeyMint ما يلي:

  • RSA
    • إتاحة مفاتيح 2048 و3072 و4096 بت
    • التوافق مع الأس العام F4 (2^16+1)
    • أوضاع المساحة المتروكة لتوقيع RSA:
      • RSASSA-PSS (PaddingMode::RSA_PSS)
      • RSASSA-PKCS1-v1_5 (PaddingMode::RSA_PKCS1_1_5_SIGN)
    • أوضاع الملخّص لتوقيع RSA:
      • SHA-256
    • أوضاع الحشو لتشفير/فك تشفير RSA:
      • Unpadded
      • RSAES-OAEP (PaddingMode::RSA_OAEP)
      • RSAES-PKCS1-v1_5 (PaddingMode::RSA_PKCS1_1_5_ENCRYPT)
  • ECDSA
    • تتوفّر إمكانية استخدام مفاتيح 224 و256 و384 و521 بت، وذلك باستخدام منحنيات NIST P-224 وP-256 وP-384 وP-521 على التوالي.
    • أوضاع الملخّص لتوقيع ECDSA:
      • بدون ملخّص (تم إيقافه نهائيًا، وستتم إزالته في المستقبل)
      • SHA-256
  • AES
    • تتوفّر مفاتيح 128 و256 بت
    • CBC وCTR وECB وGCM لا يسمح تنفيذ GCM باستخدام علامات أصغر من 96 بت أو أطوال أرقام خاصة غير 96 بت.
    • يتوافق وضعا التعبئة PaddingMode::NONE وPaddingMode::PKCS7 مع وضعي CBC وECB. بدون إضافة مساحة فارغة، يتعذّر التشفير في وضع CBC أو ECB إذا لم يكن الإدخال مضاعفًا لحجم الحظر.
  • HMAC SHA-256، مع أي حجم مفتاح يصل إلى 32 بايت على الأقل.

ننصح بشدة باستخدام SHA1 وأفراد مجموعة SHA2 الآخرين (SHA-224 وSHA384 وSHA512) في عمليات تنفيذ KeyMint. وتوفّر Keystore هذه المفاتيح في البرامج إذا لم توفّرها عملية تنفيذ KeyMint في الأجهزة.

يُنصح أيضًا باستخدام بعض العناصر الأساسية لضمان إمكانية التشغيل التفاعلي مع الأنظمة الأخرى:

  • أحجام مفاتيح أصغر لبروتوكول RSA
  • الأسس العامة العشوائية لـ RSA

التحكّم في الوصول إلى المفتاح

لا توفّر المفاتيح المستندة إلى الأجهزة والتي لا يمكن استخراجها من الجهاز أي حماية تقريبًا إذا كان بإمكان المهاجم استخدامها متى شاء (على الرغم من أنّها أكثر أمانًا من المفاتيح التي يمكن استخراجها). لذلك، من الضروري أن تفرض خدمة Keystore قيودًا على الوصول.

يتم تعريف عناصر التحكّم في الوصول على أنّها "قائمة أذونات" تتضمّن أزواجًا من العلامات والقيم. علامات التفويض هي أعداد صحيحة بتنسيق 32 بت، والقيم هي مجموعة متنوعة من الأنواع. يمكن تكرار بعض العلامات لتحديد قيم متعدّدة. يتم تحديد ما إذا كان يمكن تكرار علامة في واجهة KeyMint HAL. عند إنشاء مفتاح، يحدّد المتصل قائمة أذونات. يعدّل تطبيق KeyMint الأساسي في Keystore القائمة لتحديد بعض المعلومات الإضافية، مثل ما إذا كان المفتاح يتضمّن ميزة الحماية من العودة إلى الحالة السابقة، ويعرض قائمة أذونات "نهائية"، يتم ترميزها في كائن المفتاح المعروض. ستفشل أي محاولة لاستخدام المفتاح في أي عملية تشفير إذا تم تعديل قائمة الأذونات النهائية.

بالنسبة إلى Keymaster 2 والإصدارات الأقدم، يتم تحديد مجموعة العلامات المحتملة في التعداد keymaster_authorization_tag_t، وهي ثابتة بشكل دائم (على الرغم من إمكانية توسيعها). تمت إضافة البادئة KM_TAG إلى الأسماء. يتم استخدام أربعة بتات علوية من أرقام تعريف العلامات للإشارة إلى النوع.

غيَّر Keymaster 3 البادئة KM_TAG إلى Tag::.

تشمل الأنواع المحتملة ما يلي:

ENUM: يتم تحديد قيم العديد من العلامات في تعدادات. على سبيل المثال، يتم تحديد القيم المحتملة لـ TAG::PURPOSE في النوع keymaster_purpose_t.

ENUM_REP: هي نفسها ENUM، باستثناء أنّه يمكن تكرار العلامة في قائمة الأذونات. يشير التكرار إلى قيم معتمَدة متعددة. على سبيل المثال، من المحتمل أن يتضمّن مفتاح التشفير KeyPurpose::ENCRYPT وKeyPurpose::DECRYPT.

عندما ينشئ KeyMint مفتاحًا، يحدّد المتصل قائمة أذونات للمفتاح. يتم تعديل هذه القائمة بواسطة Keystore وKeyMint لإضافة قيود إضافية، وتشفّر عملية التنفيذ الأساسية في KeyMint قائمة التفويض النهائية في keyblob التي يتم عرضها. يتم ربط قائمة التفويض المرمّزة بالتشفير في keyblob، وبالتالي فإنّ أي محاولة لتعديل قائمة التفويض (بما في ذلك الترتيب) تؤدي إلى إنشاء keyblob غير صالح لا يمكن استخدامه في عمليات التشفير.

فرض القيود باستخدام الأجهزة أو البرامج

لا تحتوي جميع عمليات تنفيذ الأجهزة الآمنة على الميزات نفسها. ولإتاحة مجموعة متنوعة من الأساليب، يميّز Keymaster بين فرض عناصر التحكّم في الوصول إلى البيئة الآمنة وغير الآمنة، أو فرض عناصر التحكّم في الأجهزة والبرامج، على التوالي.

يتم عرض هذا الحقل في KeyMint API باستخدام الحقل securityLevel من النوع KeyCharacteristics. يكون الجهاز الآمن مسؤولاً عن وضع أذونات الوصول في KeyCharacteristics بمستوى الأمان المناسب، استنادًا إلى ما يمكنه فرضه. تتوفّر هذه المعلومات أيضًا في سجلات التصديق الخاصة بالمفاتيح غير المتماثلة: تظهر خصائص المفتاح SecurityLevel::TRUSTED_ENVIRONMENT أو SecurityLevel::STRONGBOX في القائمة hardwareEnforced، وتظهر خصائص المفتاح SecurityLevel::SOFTWARE أو SecurityLevel::KEYSTORE في القائمة softwareEnforced.

على سبيل المثال، لا تفرض البيئة الآمنة عادةً قيودًا على الفترة الزمنية التي يمكن فيها استخدام المفتاح، لأنّه ليس لديها إذن وصول موثوق إلى معلومات التاريخ والوقت. نتيجةً لذلك، يتم فرض عمليات التفويض، مثل Tag::ORIGINATION_EXPIRE_DATETIME، من خلال Keystore في Android، وستتضمّن SecurityLevel::KEYSTORE.

لمزيد من المعلومات حول تحديد ما إذا كانت المفاتيح وتراخيصها محمية بواسطة الأجهزة، يُرجى الاطّلاع على مقالة إثبات صحة المفتاح.

أذونات إنشاء الرسائل المشفّرة

تُستخدَم العلامات التالية لتحديد الخصائص المتعلقة بالتشفير للعمليات التي تستخدم المفتاح المرتبط بها:

  • Tag::ALGORITHM
  • Tag::KEY_SIZE
  • Tag::BLOCK_MODE
  • Tag::PADDING
  • Tag::CALLER_NONCE
  • Tag::DIGEST
  • Tag::MGF_DIGEST

يمكن تكرار العلامات التالية، ما يعني أنّه يمكن ربط قيم متعدّدة بمفتاح واحد:

  • Tag::BLOCK_MODE
  • Tag::PADDING
  • Tag::DIGEST
  • Tag::MGF_DIGEST

يتم تحديد القيمة التي سيتم استخدامها في وقت العملية.

الغرض

تحتوي المفاتيح على مجموعة مرتبطة من الأغراض، ويتم التعبير عنها كإدخال واحد أو أكثر من إدخالات التفويض باستخدام العلامة Tag::PURPOSE، التي تحدد كيفية استخدامها. يتم تحديد الأغراض في KeyPurpose.aidl.

يُرجى العِلم أنّ بعض مجموعات قيم الأغراض تؤدي إلى حدوث مشاكل أمنية. على سبيل المثال، يتيح مفتاح RSA الذي يمكن استخدامه في التشفير والتوقيع للمهاجم الذي يمكنه إقناع النظام بفك تشفير بيانات عشوائية إنشاء توقيعات.

استيراد المفتاح

يتيح Keymaster تصدير المفاتيح العامة فقط بتنسيق X.509 واستيراد ما يلي:

  • أزواج المفاتيح غير المتماثلة بتنسيق PKCS#8 بترميز DER (بدون تشفير مستند إلى كلمة مرور)
  • المفاتيح المتماثلة كبايتات أولية

لضمان إمكانية التمييز بين المفاتيح المستورَدة والمفاتيح التي تم إنشاؤها بشكل آمن، يتم تضمين Tag::ORIGIN في قائمة تفويض المفاتيح المناسبة. على سبيل المثال، إذا تم إنشاء مفتاح في جهاز آمن، سيتم العثور على Tag::ORIGIN بالقيمة KeyOrigin::GENERATED في قائمة hw_enforced لخصائص المفتاح، بينما سيحتوي المفتاح الذي تم استيراده إلى جهاز آمن على القيمة KeyOrigin::IMPORTED.

مصادقة المستخدم

لا تنفّذ عمليات تنفيذ Secure KeyMint مصادقة المستخدم، ولكنها تعتمد على تطبيقات أخرى موثوق بها تنفّذها. وللاطّلاع على الواجهة التي تنفّذها هذه التطبيقات، راجِع صفحة Gatekeeper.

يتم تحديد متطلبات مصادقة المستخدم من خلال مجموعتَين من العلامات. تشير المجموعة الأولى إلى طرق المصادقة التي تسمح باستخدام المفتاح:

  • يحتوي Tag::USER_SECURE_ID على قيمة رقمية مؤلفة من 64 بت تحدّد معرّف المستخدم الآمن الذي يتم توفيره في رمز مميّز آمن للمصادقة من أجل إتاحة استخدام المفتاح. في حال تكرارها، يمكن استخدام المفتاح إذا تم توفير أي من القيم في رمز مميّز للمصادقة الآمنة.

تشير المجموعة الثانية إلى ما إذا كان يجب إثبات هوية المستخدم ومتى. في حال عدم توفّر أي من هذين الوسمين، ولكن توفّر الوسم Tag::USER_SECURE_ID، يجب إجراء المصادقة في كل مرة يتم فيها استخدام المفتاح.

  • يشير Tag::NO_AUTHENTICATION_REQUIRED إلى أنّه لا يلزم إثبات هوية المستخدم، ولكن يظل الوصول إلى المفتاح مقتصرًا على التطبيق المالك (وأي تطبيقات يمنحها إذن الوصول).
  • Tag::AUTH_TIMEOUT هي قيمة رقمية تحدّد، بالثواني، مدى حداثة مصادقة المستخدم المطلوبة للسماح باستخدام المفتاح. لا تتجاوز المهلات عمليات إعادة التشغيل، فبعد إعادة التشغيل، تصبح جميع عمليات المصادقة غير صالحة. يمكن ضبط المهلة على قيمة كبيرة للإشارة إلى أنّ المصادقة مطلوبة مرة واحدة لكل عملية تشغيل (يبلغ عدد الثواني 2^32 حوالي 136 عامًا، ومن المفترض أن تتم إعادة تشغيل أجهزة Android بشكل متكرر أكثر من ذلك).

يجب فتح قفل الجهاز

لا يمكن استخدام المفاتيح التي تحمل الرمز Tag::UNLOCKED_DEVICE_REQUIRED إلا عندما يكون الجهاز غير مقفل. للاطّلاع على الدلالات التفصيلية، يُرجى الرجوع إلى KeyProtection.Builder#setUnlockedDeviceRequired(boolean).

يتم فرض UNLOCKED_DEVICE_REQUIRED من خلال Keystore، وليس من خلال KeyMint. ومع ذلك، في الإصدار 12 من نظام التشغيل Android والإصدارات الأحدث، يحمي Keystore مفاتيح UNLOCKED_DEVICE_REQUIRED تشفيرًا أثناء قفل الجهاز لضمان عدم إمكانية استخدامها في معظم الحالات حتى إذا تم اختراق Keystore أثناء قفل الجهاز.

تستخدِم جميع عمليات التشفير وإنشاء الأرقام العشوائية الموضّحة في هذا القسم مكتبة BoringSSL، باستثناء الحالات التي يُذكر فيها استخدام KeyMint بشكلٍ صريح. يتم ضبط جميع الأسرار على القيمة صفر فور عدم الحاجة إليها.

مفاتيح Super التي تتطلّب فتح قفل الجهاز

لحماية مفاتيح UNLOCKED_DEVICE_REQUIRED بشكل مشفّر، تستخدم خدمة Keystore عملية "التشفير الفائق" قبل تخزينها في قاعدة البيانات. عند الإمكان، تحمي هذه الميزة مفاتيح التشفير الفائق (المفاتيح الفائقة) عندما يكون الجهاز مقفلاً، وذلك بطريقة لا يمكن استردادها إلا من خلال فتح قفل الجهاز بنجاح. (يتم استخدام مصطلح "التشفير الفائق" لأنّ طبقة التشفير هذه يتم تطبيقها بالإضافة إلى طبقة التشفير التي يطبّقها KeyMint على جميع المفاتيح).

لكل مستخدم (بما في ذلك الملفات الشخصية) مفتاحان فائقان مرتبطان بـ UNLOCKED_DEVICE_REQUIRED:

  • مفتاح التشفير المتماثل المميّز UnlockedDeviceRequired هذا مفتاح AES‑256‑GCM. ويشفّر مفاتيح UNLOCKED_DEVICE_REQUIRED التي يتم استيرادها أو إنشاؤها أو استخدامها أثناء فتح قفل الجهاز للمستخدم.
  • المفتاح المميّز غير المتماثل UnlockedDeviceRequired. هذا مفتاحا تشفير ECDH P-521. ويشفّر UNLOCKED_DEVICE_REQUIRED المفاتيح التي يتم استيرادها أو إنشاؤها أثناء قفل الجهاز للمستخدم. لمزيد من التفاصيل، يُرجى الاطّلاع على تخزين المفاتيح أثناء قفل الجهاز.

إنشاء المفاتيح الفائقة وحمايتها

عند إنشاء مستخدم، ينشئ Keystore المفاتيح الفائقة UnlockedDeviceRequired الخاصة بالمستخدم ويخزّنها في قاعدة البيانات الخاصة به، ويتم تشفيرها (بشكل غير مباشر) باستخدام كلمة المرور الاصطناعية الخاصة بالمستخدم:

  1. يستمد خادم النظام كلمة مرور Keystore الخاصة بالمستخدم من كلمة المرور الاصطناعية الخاصة بالمستخدم باستخدام دالة اشتقاق المفاتيح (KDF) وفقًا لمعيار SP800‑108.
  2. يمرّر خادم النظام كلمة مرور Keystore الخاصة بالمستخدم إلى Keystore.
  3. تنشئ خدمة Keystore المفاتيح الفائقة للمستخدم.
  4. لكل مفتاح فائق خاص بالمستخدم:
    1. ينشئ ملف تخزين المفاتيح قيمة عشوائية.
    2. تستمد خدمة Keystore مفتاح AES‑256‑GCM من كلمة مرور Keystore التي يحدّدها المستخدم ومن القيمة العشوائية باستخدام HKDF‑SHA256.
    3. تشفّر Keystore الجزء السري من المفتاح الفائق باستخدام مفتاح AES‑256‑GCM هذا.
    4. يخزّن Keystore المفتاح الممتاز المشفّر ورمزه العشوائي في قاعدة بياناته. إذا كان المفتاح غير متماثل، يتم أيضًا تخزين الجزء العام من المفتاح بدون تشفير.

يسمح هذا الإجراء بفك تشفير المفاتيح الفائقة عند معرفة كلمة المرور الاصطناعية للمستخدم، مثلاً عند إدخال رقم التعريف الشخصي أو النمط أو كلمة المرور الصحيحة للمستخدم.

تخزّن خدمة Keystore أيضًا هذه المفاتيح الفائقة مؤقتًا في الذاكرة، ما يتيح لها العمل على مفاتيح UNLOCKED_DEVICE_REQUIRED. ومع ذلك، يحاول تخزين الأجزاء السرية من هذه المفاتيح مؤقتًا فقط عندما يكون الجهاز غير مقفل للمستخدم. عندما يكون الجهاز مقفلاً، يمحو Keystore النسخة المخزّنة مؤقتًا من الأجزاء السرية من هذه المفاتيح الفائقة، إذا أمكن ذلك. على وجه التحديد، عندما يكون الجهاز مقفلاً للمستخدم، يختار Keystore أحد مستويات الحماية الثلاثة ويطبّقه على المفاتيح الفائقة UnlockedDeviceRequired الخاصة بالمستخدم:

  • إذا كان المستخدم قد فعّل رقم التعريف الشخصي أو النقش أو كلمة المرور فقط، ستعمل خدمة Keystore على إزالة الأجزاء السرية من المفاتيح الفائقة المخزّنة مؤقتًا. ويجعل ذلك من الممكن استرداد المفاتيح الفائقة فقط من خلال النسخة المشفّرة في قاعدة البيانات التي لا يمكن فك تشفيرها إلا باستخدام رقم التعريف الشخصي أو النقش أو كلمة المرور أو ما يعادلها.
  • إذا كان لدى المستخدم مقاييس حيوية من الفئة 3 ("قوية") ورقم تعريف شخصي أو نقش أو كلمة مرور مفعَّلة فقط، سيوفّر Keystore إمكانية استرداد المفاتيح الفائقة باستخدام أي من المقاييس الحيوية من الفئة 3 التي سجّلها المستخدم (بصمة الإصبع عادةً)، وذلك كبديل لرقم التعريف الشخصي أو النقش أو كلمة المرور المكافئة. ولإجراء ذلك، يتم إنشاء مفتاح جديد من نوع AES‑256‑GCM، وتشفير الأجزاء السرية من المفاتيح الرئيسية باستخدامه، واستيراد مفتاح AES‑256‑GCM إلى KeyMint كمفتاح مرتبط بالمقاييس الحيوية ويتطلّب إكمال عملية المصادقة باستخدام المقاييس الحيوية بنجاح خلال آخر 15 ثانية، ثم يتم محو النسخ غير المشفّرة من جميع هذه المفاتيح.
  • إذا كان لدى المستخدم بيانات بيومترية من الفئة 1 ("مريحة") أو بيانات بيومترية من الفئة 2 ("ضعيفة") أو تم تفعيل الوكيل المعتمد لفتح القفل، سيحتفظ Keystore بالمفاتيح الفائقة مخزّنة مؤقتًا بنص عادي. في هذه الحالة، لا يتم توفير أمان تشفير لمفاتيح UNLOCKED_DEVICE_REQUIRED. يمكن للمستخدمين تجنُّب هذا الخيار الأقل أمانًا من خلال عدم تفعيل طرق فتح القفل هذه. تشمل طرق فتح القفل الأكثر شيوعًا والتي تندرج ضمن هذه الفئات ميزة "فتح القفل ببصمة الوجه" على العديد من الأجهزة، وفتح القفل باستخدام ساعة ذكية مقترنة.

عندما يفتح المستخدم قفل الجهاز، يسترد Keystore المفاتيح الفائقة UnlockedDeviceRequired الخاصة بالمستخدم إذا أمكن ذلك. لفتح القفل باستخدام رقم التعريف الشخصي أو النقش أو كلمة المرور، يتم فك تشفير نسخة من هذه المفاتيح مخزَّنة في قاعدة البيانات. بخلاف ذلك، يتحقّق مما إذا كان قد حفظ نسخة من هذه المفاتيح مشفّرة باستخدام مفتاح مرتبط بالبيانات الحيوية، وإذا كان الأمر كذلك، يحاول فك تشفيرها. لا تنجح هذه العملية إلا إذا تمكّن المستخدم من المصادقة باستخدام مقاييس حيوية من الفئة 3 خلال آخر 15 ثانية، ويتم فرض ذلك من خلال KeyMint (وليس Keystore).

تخزين المفاتيح عندما يكون الجهاز مقفلاً

تسمح خدمة Keystore للمستخدمين باستيراد مفاتيح UNLOCKED_DEVICE_REQUIRED وإنشائها عندما يكون الجهاز مقفلاً. تستخدم هذه الميزة نظام تشفير مختلطًا لضمان عدم إمكانية فك تشفير البيانات إلا عند فتح قفل الجهاز لاحقًا:

  • التشفير (استيراد مفتاح UNLOCKED_DEVICE_REQUIRED أو إنشاؤه أثناء قفل الجهاز):
    1. تنشئ خدمة Keystore زوجًا جديدًا من مفاتيح ECDH P‑521 المؤقتة.
    2. تنشئ خدمة Keystore سرًا مشتركًا من خلال تنفيذ اتفاقية مفتاح ECDH بين المفتاح الخاص لمفتاح التشفير المؤقت هذا والجزء العام من المفتاح الرئيسي غير المتماثل UnlockedDeviceRequired.
    3. ينشئ ملف تخزين المفاتيح قيمة عشوائية.
    4. يستمد Keystore مفتاح AES‑256‑GCM من المفتاح السري المشترك والقيمة العشوائية باستخدام HKDF‑SHA256.
    5. تشفّر خدمة Keystore المفتاح UNLOCKED_DEVICE_REQUIRED باستخدام مفتاح AES‑256‑GCM هذا.
    6. يخزِّن Keystore مفتاح UNLOCKED_DEVICE_REQUIRED المشفّر، والتشفير، والجزء العام من زوج المفاتيح المؤقتة في قاعدة البيانات.
  • فك التشفير (باستخدام UNLOCKED_DEVICE_REQUIRED المفتاح الذي تم إنشاؤه أثناء فتح قفل الجهاز):
    1. يحمّل Keystore المفتاح المشفّر UNLOCKED_DEVICE_REQUIRED والملح والجزء العام من زوج المفاتيح المؤقتة من قاعدة البيانات.
    2. تنشئ خدمة Keystore سرًا مشتركًا من خلال تنفيذ اتفاقية مفتاح ECDH بين الجزء العام من مفتاحَي التشفير المؤقتَين والجزء الخاص من المفتاح الرئيسي غير المتماثل الذي يتطلّب فتح قفل الجهاز. المفتاح الخاص متاح لأنّ الجهاز غير مقفل.
    3. يستمد Keystore مفتاح AES‑256‑GCM من المفتاح السري المشترك والقيمة العشوائية باستخدام HKDF‑SHA256. هذا المفتاح AES‑256‑GCM هو نفسه المفتاح الذي تم استخراجه أثناء التشفير.
    4. تفكّ Keystore تشفير المفتاح UNLOCKED_DEVICE_REQUIRED باستخدام مفتاح AES‑256‑GCM.
    5. تعيد خدمة Keystore تشفير المفتاح UNLOCKED_DEVICE_REQUIRED باستخدام المفتاح الرئيسي المتماثل UnlockedDeviceRequired. لا يؤثّر ذلك في خصائص أمان المفتاح، ولكنّه يتيح الوصول إليه بشكل أسرع لاحقًا.

تتيح هذه الميزة للتطبيقات تخزين البيانات عندما يكون الجهاز مقفلاً، بحيث لا يمكن فك تشفيرها إلا عندما يكون الجهاز مفتوحًا. للقيام بذلك، يجب أن تتّبع التطبيقات الخطوات التالية:

  1. إنشاء مفتاح AES‑256‑GCM خارج Keystore
  2. تشفير البيانات باستخدام مفتاح AES‑256‑GCM
  3. استورِد مفتاح AES‑256‑GCM إلى Keystore مع ضبط setUnlockedDeviceRequired(true) لحماية المفتاح.
  4. إعادة ضبط النسخة الأصلية من المفتاح إلى القيمة صفر.

لإلغاء تشفير البيانات أثناء فتح قفل الجهاز، استخدِم المفتاح الذي تم استيراده إلى Keystore.

ربط حساب العميل

يتم ربط المفتاح بتطبيق عميل معيّن من خلال معرّف عميل اختياري وبعض بيانات العميل الاختيارية (Tag::APPLICATION_ID وTag::APPLICATION_DATA على التوالي). تعامِل خدمة Keystore هذه القيم على أنّها كائنات ثنائية كبيرة غير شفافة، وتضمن فقط أنّه يتم عرض الكائنات الثنائية الكبيرة نفسها التي تم تقديمها أثناء إنشاء المفتاح أو استيراده في كل مرة يتم فيها استخدام المفتاح، وأنّها متطابقة بايت ببايت. لا تعرض KeyMint بيانات ربط العميل. ويجب أن يعرف المتصل هذا المفتاح ليتمكّن من استخدامه.

لا تتوفّر هذه الميزة للتطبيقات.

انتهاء الصلاحية

يتيح Keystore حصر استخدام المفتاح حسب التاريخ. يمكن ربط تاريخ بدء صلاحية المفتاح وتواريخ انتهاء صلاحيته بمفتاح، ويرفض Keymaster تنفيذ عمليات المفتاح إذا كان التاريخ/الوقت الحالي خارج النطاق الصالح. يتم تحديد نطاق صلاحية المفتاح باستخدام العلامات Tag::ACTIVE_DATETIME وTag::ORIGINATION_EXPIRE_DATETIME وTag::USAGE_EXPIRE_DATETIME. يستند التمييز بين "إنشاء" و"استخدام" إلى ما إذا كان يتم استخدام المفتاح "لإنشاء" نص مشفّر أو توقيع أو غير ذلك، أو "لاستخدام" نص مشفّر أو توقيع أو غير ذلك. يُرجى العِلم أنّ هذا التمييز لا يظهر للتطبيقات.

علامات Tag::ACTIVE_DATETIME وTag::ORIGINATION_EXPIRE_DATETIME وTag::USAGE_EXPIRE_DATETIME اختيارية. في حال عدم توفّر العلامات، يُفترض أنّه يمكن دائمًا استخدام المفتاح المعنيّ لفك تشفير الرسائل أو التحقّق منها.

بما أنّ الوقت الفعلي يتم توفيره من خلال بيئة غير آمنة، فإنّ العلامات ذات الصلة بانتهاء الصلاحية تكون ضمن القائمة التي تفرضها البرامج.

ربط جذر الثقة

يتطلّب Keystore ربط المفاتيح بجذر موثوق به، وهو سلسلة بتات يتم توفيرها لأداة KeyMint الآمنة أثناء بدء التشغيل، ويُفضّل أن يتم ذلك من خلال برنامج الإقلاع. سلسلة البتات هذه مرتبطة بشكل مشفّر بكل مفتاح تتم إدارته من خلال KeyMint.

يتكوّن مصدر الثقة من المفتاح العام المستخدَم للتحقّق من التوقيع على صورة التشغيل وحالة قفل الجهاز. في حال تغيير المفتاح العام للسماح باستخدام صورة نظام مختلفة أو تغيير حالة القفل، لن يكون أي من المفاتيح المحمية بواسطة KeyMint التي أنشأها النظام السابق قابلاً للاستخدام، ما لم تتم استعادة جذر الثقة السابق وتشغيل نظام تم توقيعه باستخدام هذا المفتاح. والهدف من ذلك هو زيادة قيمة عناصر التحكّم في الوصول إلى المفاتيح التي يتم فرضها من خلال البرامج، وذلك من خلال منع نظام التشغيل الذي ثبّته المخترق من استخدام مفاتيح KeyMint.

المفاتيح المستقلة

يمكن لبعض أجهزة KeyMint الآمنة اختيار تخزين مواد المفاتيح داخليًا وعرض معرّفات بدلاً من مواد المفاتيح المشفّرة. أو قد تكون هناك حالات أخرى لا يمكن فيها استخدام المفاتيح إلى أن يتوفّر بعض مكونات النظام الأخرى غير الآمنة أو الآمنة. تتيح طبقة تجريد الأجهزة (HAL) الخاصة بـ KeyMint للبرنامج المتصل أن يطلب أن يكون المفتاح "مستقلاً" من خلال العلامة TAG::STANDALONE، ما يعني أنّه لا يلزم توفير أي موارد أخرى غير الكائن الثنائي الكبير (blob) ونظام KeyMint قيد التشغيل. يمكن فحص العلامات المرتبطة بمفتاح لمعرفة ما إذا كان المفتاح مستقلاً. في الوقت الحالي، تم تحديد قيمتين فقط:

  • KeyBlobUsageRequirements::STANDALONE
  • KeyBlobUsageRequirements::REQUIRES_FILE_SYSTEM

لا تتوفّر هذه الميزة للتطبيقات.

السرعة

عند إنشاء مقياس السرعة، يمكن تحديد الحد الأقصى لسرعة الاستخدام باستخدام TAG::MIN_SECONDS_BETWEEN_OPS. ترفض عمليات تنفيذ TrustZone إجراء عمليات تشفير باستخدام هذا المفتاح إذا تم إجراء عملية قبل أقل من TAG::MIN_SECONDS_BETWEEN_OPS ثانية.

الأسلوب البسيط لتنفيذ حدود السرعة هو جدول يتضمّن معرّفات المفاتيح والطوابع الزمنية لآخر استخدام. هذا الجدول محدود الحجم، ولكنّه يتضمّن 16 إدخالاً على الأقل. في حال امتلاء الجدول وعدم إمكانية تعديل أي إدخالات أو تجاهلها، يتم تنفيذ عمليات الأجهزة الآمنة "بشكل آمن"، مع تفضيل رفض جميع عمليات المفاتيح المحدودة السرعة إلى أن تنتهي صلاحية أحد الإدخالات. من المقبول أن تنتهي صلاحية جميع الإدخالات عند إعادة التشغيل.

يمكن أيضًا حصر استخدام المفاتيح في n مرة لكل عملية تشغيل باستخدام TAG::MAX_USES_PER_BOOT. يتطلّب ذلك أيضًا جدول تتبُّع يتضمّن أربعة مفاتيح على الأقل، كما أنّه يوفّر ميزة "التعطُّل الآمن". يُرجى العِلم أنّه لا يمكن للتطبيقات إنشاء مفاتيح محدودة لكل عملية إعادة تشغيل. ولا يتم عرض هذه الميزة من خلال Keystore، وهي محجوزة لعمليات النظام.

لا تتوفّر هذه الميزة للتطبيقات.

إعادة ضبط أداة إنشاء الأرقام العشوائية

بما أنّ الأجهزة الآمنة تنشئ أرقامًا عشوائية لمواد المفاتيح ومتجهات التهيئة (IV)، وبما أنّ مولّدات الأرقام العشوائية للأجهزة قد لا تكون موثوقة تمامًا في بعض الأحيان، يوفّر KeyMint HAL واجهة للسماح للعميل بتقديم إنتروبيا إضافية يتم دمجها في الأرقام العشوائية التي يتم إنشاؤها.

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