الميزات

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

العناصر الأساسية للتشفير

يوفّر "متجر المفاتيح" فئات العمليات التالية:

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

يُرجى العِلم أنّ Keystore وKeyMint لا يتعاملان مع عمليات المفتاح العام للمفاتيح غير المتكافئة.

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

يتم وصف العناصر الأساسية والأوضاع التي يجب أن تكون متوافقة مع تنفيذ KeyMint في IKeyMintDevice مواصفات واجهة HAL.

يجب أن يؤدي تنفيذ KeyMint الأساسي إلى إنشاء أرقام عشوائية لإتاحة إنشاء المفاتيح وإنشاء الحشو العشوائي أو مصفوفات الإعداد (IV). لدعم ذلك، يقدّم نظام Android بشكل دوري معلومات إضافية عن التشويش لتنفيذ KeyMint.

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

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

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

يتم تحديد قيم العلامات المتوافقة في ملف Tag.aidl ، ويرتبط كل منها بملف TagType يشير إلى نوع القيمة المرتبطة (مثل عدد صحيح أو وحدات بايت)، ويشير أيضًا إلى ما إذا كان يمكن تكرار القيمة لتحديد قيم متوافقة متعددة.

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

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

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

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

على سبيل المثال، لا تفرض البيئة الآمنة عادةً القيود المفروضة على الفاصل الزمني بين التاريخ والوقت الذي يمكن فيه استخدام المفتاح، لأنّها لا تملك إذن وصول موثوقًا إلى معلومات التاريخ والوقت. نتيجةً لذلك، يتم فرض الأذونات مثل Tag::ORIGINATION_EXPIRE_DATETIME من خلال "متجر المفاتيح" في 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 الذي يمكن استخدامه لكل من التشفير والتوقيع لمهاجمٍ يمكنه إقناع النظام بفك تشفير بيانات عشوائية لإنشاء توقيعات.

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

تتيح KeyMint استيراد ما يلي:

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

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

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

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

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

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

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

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

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

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

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

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

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

  • المفتاح الفائق المتماثل UnlockedDeviceRequired هذا هو مفتاح AES‑256‑GCM. ويشفِّر مفاتيح UNLOCKED_DEVICE_REQUIRED التي يتم استيرادها أو إنشاؤها عندما يكون الجهاز غير مقفل.
  • المفتاح الفائق غير المتماثل UnlockedDeviceRequired هذا مفتاحَا تشفير من النوع ECDH P‑521. ويشفِّر UNLOCKED_DEVICE_REQUIRED المفاتيح التي يتم استيرادها أو إنشاؤها عندما يكون الجهاز مقفلًا للمستخدم. تتم إعادة تشفير المفاتيح المشفَّرة باستخدام هذا المفتاح غير المتماثل باستخدام المفتاح المتماثل عند الاستخدام الأول (لا يمكن أن يحدث ذلك إلا عندما يكون الجهاز غير مقفل).

ينشئ Keystore هذه المفاتيح الفائقة عند إنشاء المستخدم ويخزّنها في قاعدة بياناته المشفَّرة بكلمة المرور الاصطناعية للمستخدم. ويتيح ذلك استردادها باستخدام رقم تعريف شخصي أو نقش أو كلمة مرور مكافئة.

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

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

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

ربط العميل

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

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

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

يتيح "متجر المفاتيح" حظر استخدام المفتاح حسب التاريخ. يمكن ربط تاريخ بدء صلاحية المفتاح بمفتاح، ويرفض "متجر المفاتيح" تنفيذ عمليات المفتاح إذا كان التاريخ/الوقت الحالي خارج النطاق الصالح. يتم تحديد نطاق صلاحية المفتاح باستخدام العلامات 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 مستحيلاً على نظام التشغيل الذي ثبَّته المهاجم.

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

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

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