مصادقة المفتاح والمعرّف

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

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

لحلّ هذه المشكلة، قدّم تطبيق Keymaster مصادقة المفتاح في Android 7.0 (Keymaster 2) والمعرّف. مصادقة في Android 8.0 (Keymaster 3).

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

تتيح مصادقة المعرّف للجهاز تقديم إثبات لمعرّفات الأجهزة، مثل الرقم التسلسلي أو رمز IMEI.

مصادقة المفتاح

لدعم مصادقة المفتاح، قدم نظام Android 7.0 مجموعة من العلامات والأنواع إلى HAL.

العلامات

  • Tag::ATTESTATION_CHALLENGE
  • Tag::INCLUDE_UNIQUE_ID
  • Tag::RESET_SINCE_ID_ROTATION

النوع

Keymaster 2 والإصدارات الأقدم

typedef struct {
    keymaster_blob_t* entries;
    size_t entry_count;
} keymaster_cert_chain_t;

طريقة AttestKey

Keymaster 3

    attestKey(vec<uint8_t> keyToAttest, vec<KeyParameter> attestParams)
        generates(ErrorCode error, vec<vec<uint8_t>> certChain);

Keymaster 2 والإصدارات الأقدم

keymaster_error_t (*attest_key)(const struct keymaster2_device* dev,
        const keymaster_key_blob_t* key_to_attest,
        const keymaster_key_param_set_t* attest_params,
        keymaster_cert_chain_t* cert_chain);
  • dev هي بنية الجهاز الرئيسي.
  • keyToAttest هو الكائن الثنائي الكبير الذي يتم عرضه من generateKey الذي سيتم إنشاء المصادقة له.
  • attestParams هي قائمة تضم أي معلمات ضرورية والتحقق. ويشمل ذلك Tag::ATTESTATION_CHALLENGE ربما Tag::RESET_SINCE_ID_ROTATION، وكذلك Tag::APPLICATION_ID وTag::APPLICATION_DATA تشير رسالة الأشكال البيانية يكون العنصران الأخيران ضروريين لفك تشفير الكائن الثنائي الكبير للمفتاح إذا تم تحديدهما أثناء إنشاء المفتاح.
  • certChain هي معلمة الإخراج، والتي تعرض صفيفًا من الشهادات. الإدخال 0 هو شهادة المصادقة، بمعنى أنه لاعتماد المفتاح من keyToAttest وتحتوي على إضافة المصادقة.

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

شهادة مصادقة

شهادة المصادقة هي شهادة X.509 قياسية، بالإضافة إلى شهادة اختيارية إضافة مصادقة تحتوي على وصف للمفتاح الذي تم التصديق عليه. تشير رسالة الأشكال البيانية موقَّعة باستخدام مفتاح مصادقة معتمد. مفتاح المصادقة قد يستخدم خوارزمية مختلفة عن المفتاح الذي يتم التصديق عليه.

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

تسلسل الشهادة

اسم الحقل (يُرجى الاطّلاع على RFC 5280 القيمة
شهادة tbs تسلسل الشهادات في TBS
signatureAlgorithm الخوارزمية المستخدَمة لتوقيع المفتاح:
ECDSA لمفاتيح EC وRSA لمفاتيح RSA.
signatureValue سلسلة BIT، تم حساب التوقيع على tbsCertificate بترميز DER ASN.1.

تسلسل شهادة TBS

اسم الحقل (يُرجى الاطّلاع على RFC 5280 القيمة
version العدد الصحيح 2 (يعني الإصدار 3 شهادة)
serialNumber العدد الصحيح 1 (قيمة ثابتة: هي نفسها في جميع الشهادات)
signature الخوارزمية المستخدَمة لتوقيع المفتاح: ECDSA لمفاتيح EC، RSA في مفاتيح RSA.
issuer يتطابق مع حقل الموضوع لمفتاح المصادقة المجمّعة.
validity تسلسل تاريخين يحتويان على قيم العلامة::ACTIVE_DATETIME و العلامة::USAGE_EXPIRE_DATETIME. تكون هذه القيم بالمللي ثانية منذ 1 يناير 1970. راجِع RFC 5280 للتأكّد من صحة المعلومات تمثيلات التاريخ في الشهادات.
إذا لم تكن Tag::ACTIVE_DATETIME موجودة، فاستخدم قيمة Tag::CREATION_DATETIME في حال حذف نطاق Tag::USAGE_EXPIRE_DATETIME غير متوفّر. يُرجى استخدام تاريخ انتهاء الصلاحية. تاريخ شهادة مفتاح المصادقة المجمّعة.
subject CN = "مفتاح ملف تخزين مفاتيح Android" (القيمة الثابتة: هي نفسها في جميع الشهادات)
subjectPublicKeyInfo تحتوي SubjectPublicKeyInfo على المفتاح العام الذي تم التصديق عليه.
extensions/Key Usage DigitalSignature: يتم ضبطه إذا كان المفتاح يتضمن الغرض KeyPurpose::SIGN أو KeyPurpose::VERIFY يتم إلغاء ضبط جميع وحدات البت الأخرى.
extensions/CRL Distribution Points يتم تحديد القيمة لاحقًا
extensions/"attestation" معرّف OID هو 1.3.6.1.4.1.11129.2.1.17؛ يتم تحديد المحتوى في قسم إضافة المصادقة أدناه كما هي الحال مع الكل بامتدادات شهادة X.509، يتم تمثيل المحتوى كـ OCTET_STRING الذي يحتوي على ترميز DER للتصديق SEQUENCE.

إضافة المصادقة

تحتوي الإضافة attestation على وصف كامل لـ Keymaster الأذونات المرتبطة بالمفتاح، في هيكل يتوافق بشكل مباشر إلى قوائم التفويض كما هي مستخدمة في Android وHAL رئيسية. كل علامة في يتم تمثيل قائمة تفويض بواسطة SEQUENCE ASN.1 بشكل صريح عليها علامة رقم keymaster، ولكن باستخدام واصف النوع (أربعة أعمدة ترتيب وحدات البت).

على سبيل المثال، في Keymaster 3، يتم تحديد Tag::PURPOSE في type.hal باسم ENUM_REP | 1. بالنسبة إلى امتداد المصادقة، تتم إزالة قيمة ENUM_REP، ما يؤدي إلى مغادرة العلامة 1. (بالنسبة إلى Keymaster 2 والإصدارات الأقدم، يتم تحديد KM_TAG_PURPOSE في keymaster_defs.h.)

تتم ترجمة القيم بطريقة مباشرة إلى أنواع ASN.1، وفقًا لهذا الجدول:

نوع تسجيل المفاتيح نوع ASN.1
ENUM عدد صحيح
ENUM_REP مجموعة من العدد الصحيح
UINT عدد صحيح
UINT_REP مجموعة من العدد الصحيح
ULONG عدد صحيح
ULONG_REP مجموعة من العدد الصحيح
DATE INTEGER (مللي ثانية منذ 1 يناير 1970، 00:00:00 بتوقيت غرينيتش)
BOOL NULL (في keymaster، يعني وجود العلامة "صواب"، بينما يعني عدم وجود خطأ) خطأ.
تنطبق الدلالة نفسها على ترميز ASN.1).
BIGNUM لم يتم استخدامها حاليًا، ولذلك لم يتم تحديد أي عملية ربط.
BYTES OCTET_STRING

المخطط

يتم وصف محتوى إضافة المصادقة بواسطة مخطط ASN.1 التالي.

KeyDescription ::= SEQUENCE {
  attestationVersion         INTEGER, # KM2 value is 1. KM3 value is 2. KM4 value is 3.
  attestationSecurityLevel   SecurityLevel,
  keymasterVersion           INTEGER,
  keymasterSecurityLevel     SecurityLevel,
  attestationChallenge       OCTET_STRING,
  uniqueId                   OCTET_STRING,
  softwareEnforced           AuthorizationList,
  teeEnforced                AuthorizationList,
}

SecurityLevel ::= ENUMERATED {
  Software                   (0),
  TrustedEnvironment         (1),
  StrongBox                  (2),
}

AuthorizationList ::= SEQUENCE {
  purpose                     [1] EXPLICIT SET OF INTEGER OPTIONAL,
  algorithm                   [2] EXPLICIT INTEGER OPTIONAL,
  keySize                     [3] EXPLICIT INTEGER OPTIONAL.
  digest                      [5] EXPLICIT SET OF INTEGER OPTIONAL,
  padding                     [6] EXPLICIT SET OF INTEGER OPTIONAL,
  ecCurve                     [10] EXPLICIT INTEGER OPTIONAL,
  rsaPublicExponent           [200] EXPLICIT INTEGER OPTIONAL,
  rollbackResistance          [303] EXPLICIT NULL OPTIONAL, # KM4
  activeDateTime              [400] EXPLICIT INTEGER OPTIONAL
  originationExpireDateTime   [401] EXPLICIT INTEGER OPTIONAL
  usageExpireDateTime         [402] EXPLICIT INTEGER OPTIONAL
  noAuthRequired              [503] EXPLICIT NULL OPTIONAL,
  userAuthType                [504] EXPLICIT INTEGER OPTIONAL,
  authTimeout                 [505] EXPLICIT INTEGER OPTIONAL,
  allowWhileOnBody            [506] EXPLICIT NULL OPTIONAL,
  trustedUserPresenceRequired [507] EXPLICIT NULL OPTIONAL, # KM4
  trustedConfirmationRequired [508] EXPLICIT NULL OPTIONAL, # KM4
  unlockedDeviceRequired      [509] EXPLICIT NULL OPTIONAL, # KM4
  allApplications             [600] EXPLICIT NULL OPTIONAL,
  creationDateTime            [701] EXPLICIT INTEGER OPTIONAL,
  origin                      [702] EXPLICIT INTEGER OPTIONAL,
  rollbackResistant           [703] EXPLICIT NULL OPTIONAL, # KM2 and KM3 only.
  rootOfTrust                 [704] EXPLICIT RootOfTrust OPTIONAL,
  osVersion                   [705] EXPLICIT INTEGER OPTIONAL,
  osPatchLevel                [706] EXPLICIT INTEGER OPTIONAL,
  attestationApplicationId    [709] EXPLICIT OCTET_STRING OPTIONAL, # KM3
  attestationIdBrand          [710] EXPLICIT OCTET_STRING OPTIONAL, # KM3
  attestationIdDevice         [711] EXPLICIT OCTET_STRING OPTIONAL, # KM3
  attestationIdProduct        [712] EXPLICIT OCTET_STRING OPTIONAL, # KM3
  attestationIdSerial         [713] EXPLICIT OCTET_STRING OPTIONAL, # KM3
  attestationIdImei           [714] EXPLICIT OCTET_STRING OPTIONAL, # KM3
  attestationIdMeid           [715] EXPLICIT OCTET_STRING OPTIONAL, # KM3
  attestationIdManufacturer   [716] EXPLICIT OCTET_STRING OPTIONAL, # KM3
  attestationIdModel          [717] EXPLICIT OCTET_STRING OPTIONAL, # KM3
  vendorPatchLevel            [718] EXPLICIT INTEGER OPTIONAL, # KM4
  bootPatchLevel              [719] EXPLICIT INTEGER OPTIONAL, # KM4
}

RootOfTrust ::= SEQUENCE {
  verifiedBootKey            OCTET_STRING,
  deviceLocked               BOOLEAN,
  verifiedBootState          VerifiedBootState,
  verifiedBootHash           OCTET_STRING, # KM4
}

VerifiedBootState ::= ENUMERATED {
  Verified                   (0),
  SelfSigned                 (1),
  Unverified                 (2),
  Failed                     (3),
}

حقول KeyDescription

keymasterVersion وattestationChallenge تم تحديد الحقول وليس حسب موضعها، لذا لا تحدد العلامات في النموذج المشفر سوى نوع الحقل. وقد تم وضع علامات على الحقول المتبقية ضمنيًا على النحو المحدد في ملف Google.

اسم الحقل النوع القيمة
attestationVersion عدد صحيح إصدار مخطط المصادقة: 1 أو 2 أو 3
attestationSecurity مستوى الأمان مستوى أمان هذه المصادقة من الممكن الحصول على برامج مصادقات المفاتيح المدعومة بالأجهزة. ولا يمكن الوثوق بهذه الإقرارات إذا تم اختراق نظام Android.
keymasterVersion عدد صحيح إصدار جهاز Keymaster: 0 أو 1 أو 2 أو 3 أو 4
keymasterSecurity مستوى الأمان مستوى أمان تنفيذ مفتاح التشفير الرئيسي.
attestationChallenge OCTET_STRING قيمة Tag::ATTESTATION_CHALLENGE، تم تحديدها لطلب المصادقة.
uniqueId OCTET_STRING معرّف فريد اختياري، يظهر في حال كان المفتاح يحتوي على Tag::INCLUDE_UNIQUE_ID
softwareEnforced قائمة التفويض تفويضات لوحة المفاتيح الاختيارية التي لا يتم فرضها من قِبل TEE، إذا أي نوع.
teeEnforced قائمة التفويض تفويضات Keymaster اختيارية، إن وُجدت من قِبل بيئة التنفيذ الموثوقة (TEE).

حقول PermissionList

AuthorizationList حقول كلها اختيارية وتم تحديدها. حسب قيمة العلامة keymaster، مع إخفاء وحدات بت النوع. يتم استخدام وضع العلامات الصريح لكي تحتوي الحقول أيضًا على علامة تشير إلى لنوع ASN.1 الخاص بها لتسهيل التحليل.

للحصول على تفاصيل حول قيم كل حقل، يُرجى الاطّلاع على types.hal لتطبيق Keymaster 3 keymaster_defs.h لـ Keymaster 2 والإصدارات الأقدم. أسماء علامات Keymaster تم تحويلها إلى أسماء حقول من خلال حذف KM_TAG وتغيير الباقي إلى حالة الجمل، لذلك أصبح Tag::KEY_SIZE keySize

حقول RootOfTrust

ويتم تحديد حقول RootOfTrust حسب موضعها.

اسم الحقل النوع القيمة
verifiedBootKey OCTET_STRING هي تجزئة آمنة للمفتاح تُستخدَم للتحقّق من صورة النظام. خوارزمية SHA-256 الموصى بها.
deviceLocked منطقية صحيح في حال كان برنامج الإقلاع مقفلاً، ما يعني أنّ الصور التي تم توقيعها فقط هي التي وأن تتم عملية التحقق من التمهيد المتحقق منه.
verifiedBootState حالة VerifyBootState حالة التشغيل المتحقَّق منه
verifiedBootHash OCTET_STRING ملخص لجميع البيانات المحمية من خلال التشغيل المتحقَّق منه. بالنسبة إلى الأجهزة التي تستخدم تنفيذ التمهيد المتحقق منه في Android، فإن هذه القيمة يحتوي على ملخص هيكل VBMeta، أو التشغيل الذي تم التحقق منه بيانات التعريف. لمزيد من المعلومات عن كيفية حساب هذه القيمة، راجع ملخّص VBMeta

قِيم VerifyBootState

تحمل قيم verifiedBootState المعاني التالية:

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

قيم SecurityLevel

تحمل قيم securityLevel المعاني التالية:

القيمة المعنى
Software التعليمة البرمجية التي تقوم بإنشاء العنصر ذي الصلة أو إدارته (مصادقة أو مفتاحًا) في نظام Android ويمكن تغييره إذا تم اختراق البيانات.
TrustedEnvironment التعليمة البرمجية التي تقوم بإنشاء العنصر ذي الصلة أو إدارته (مصادقة أو في بيئة تنفيذ موثوقة (TEE). يمكن أن تكون يتم تغييرها إذا تعرضت بيئة التنفيذ الموثوقة (TEE) للخطر، ولكن بيئة التنفيذ الموثوقة (TEE) مقاومة بدرجة كبيرة للهجمات عن بُعد. اختراقًا ومقاومة معتدلة للاختراق عن طريق الهجوم المباشر على الأجهزة.
StrongBox التعليمة البرمجية التي تقوم بإنشاء العنصر ذي الصلة أو إدارته (مصادقة أو في وحدة أمان مخصصة للأجهزة. يمكن أن تكون تغييرها إذا تم اختراق وحدة أمان الأجهزة، لكنها تكون أمرًا مهمًا إنها مقاومة للحلول الوسط عن بُعد ومقاومة كثيرًا للمخترقات من خلال التواصل المباشر هجوم على الأجهزة.

المعرّف الفريد

المعرّف الفريد هو قيمة مكونة من 128 بت تحدد الجهاز، ولكن تحدد لفترة زمنية محدودة. يتم احتساب القيمة باستخدام:

HMAC_SHA256(T || C || R, HBK)

المكان:

  • T هي "قيمة العدّاد الزمني"، محسوبة بقسمة Tag::CREATION_DATETIME في 2592000000، مع إسقاط أي الباقي. يتم تغيير T كل 30 يومًا (2592000000 = 30 * 24 * 60 * 60 * 1000).
  • C هي قيمة Tag::APPLICATION_ID
  • تكون قيمة R هي 1 إذا كانت قيمة Tag::RESET_SINCE_ID_ROTATION هي موجودة في المعلمة attest_params إلى استدعاء attest_key، أو 0 إذا كانت العلامة غير موجودة.
  • HBK هو سر فريد مرتبط بأجهزة معروفة لدى برنامج "موثوق" بيئة التنفيذ والتي لم يتم الكشف عنها أبدًا. يحتوي السر على ما لا يقل عن 128 بت من القصور وهي فريدة للجهاز الفردي (احتمالية التفرد مقبولاً مع الأخذ في الاعتبار 128 وحدة بت من القصور). ينبغي أن يكون HBK المستمدة من المواد الرئيسية المدمجة عبر بروتوكول HMAC أو AES_CMAC.

يجب اقتطاع الإخراج HMAC_SHA256 إلى 128 بت.

مفاتيح المصادقة الشهادات

يوجد مفتاحان، أحدهما RSA والآخر ECDSA، وسلاسل الشهادات المقابلة. يتم توفير المتطلبات اللازمة بشكل آمن في الجهاز.

يوفّر Android 12 ميزة "إدارة حسابات المفاتيح عن بُعد"، ويتطلّب Android 13 توفُّر أجهزة وتنفيذه. تعمل ميزة توفير مفتاح عن بُعد على تزويد الأجهزة الموجودة في الميدان هي شهادات المصادقة لكل تطبيق وشهادة ECDSA P256. هذه الشهادات هي المدة أقصر من الشهادات التي يوفرها المصنع.

أرقام IMEI المتعددة

يتيح نظام Android 14 استخدام أرقام IMEI متعددة في سجلّ مصادقة مفتاح Android ويمكن للمصنّعين الأصليين للأجهزة تنفيذ هذه الميزة من خلال إضافة علامة KeyMint لرقم IMEI ثانٍ. يزداد استخدام الأجهزة لعدّة أجهزة لاسلكية خلوية بشكل شائع ويمكن للمصنّعين الأصليين للأجهزة الآن دعم الأجهزة التي تحتوي على رقمَي IMEI.

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

مصادقة المعرّف

يتضمن الإصدار Android 8.0 دعمًا اختياريًا لإثبات الهوية للأجهزة التي تستخدم: مدير المفاتيح 3. تسمح مصادقة الهوية للجهاز بتقديم إثبات على أجهزته مثل الرقم التسلسلي أو IMEI. وعلى الرغم من أنها ميزة اختيارية، ننصح بشدة بأن تقدّم جميع عمليات تنفيذ Keymaster 3 الدعم له. لأن القدرة على إثبات هوية الجهاز تمكّن حالات الاستخدام مثل true إعداد برنامج "إعداد الأجهزة الجوّالة للمؤسسات دفعةً واحدة" عن بُعد لتحسين مستوى الأمان (لأنّ الجانب البعيد تأكد من أنه يتحدث إلى الجهاز الصحيح، وليس جهاز ينتحل هويتك).

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

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

خصائص مساحة التخزين

يجب أن تحتوي وحدة التخزين التي تحتفظ بمعرّفات الجهاز على السمات التالية:

  • يتم نسخ القيم المستمدة من المعرّفات الأصلية للجهاز إلى مساحة التخزين قبل مغادرة الجهاز المصنع.
  • يمكن أن تؤدي الطريقة destroyAttestationIds() إلى تدميرها نهائيًا. هذه النسخة من البيانات المستمدة من المعرف. يعني الدمار الدائم تتم إزالة جميع البيانات تمامًا، بحيث لا تتم إعادة تعيين إعدادات المصنع أو الإجراء الذي تم تنفيذه على الجهاز يمكن استعادته. يعد ذلك خاصةً هذه الميزة مهمة للأجهزة التي قام المستخدم فيها بإلغاء قفل برنامج الإقلاع وتغييره برنامج النظام وتعديل المعرّفات التي يعرضها Android وأطر العمل.
  • يجب أن تتوفّر إمكانية الحصول على إذن بإعادة السلع إنشاء نسخ حديثة من البيانات المستمدة من معرف الجهاز. بهذه الطريقة، يمكن للجهاز الذي يمر عبر إذن إعادة السلع إجراء المصادقة على الهوية مرة أخرى. تشير رسالة الأشكال البيانية يجب حماية الآلية التي تستخدمها مرافق الحصول على إذن بإعادة السلع حتى لا يتمكّن المستخدمون من واستدعائها بأنفسهم، لأن ذلك سيسمح لهم بالحصول على إقرارات المعرفات المخادعة.
  • ولا يمكن لأي رمز آخر غير تطبيق Keymaster الموثوق في بيئة التنفيذ الموثوقة (TEE) قراءة البيانات المستمدة من المعرف والمحفوظة في التخزين.
  • وحدة التخزين قابلة للتلاعب: إذا كان محتوى وحدة التخزين فإن بيئة التنفيذ الموثوقة (TEE) تعاملها بنفس الطريقة كما لو كانت نُسخ المحتوى إتلافه ورفض جميع محاولات إثبات الهوية. يتم تنفيذ ذلك من خلال توقيع وحدة التخزين أو إدخال MAC (من خلال MAC) كما هو موضّح أدناه.
  • لا تحتفظ مساحة التخزين بالمعرِّفات الأصلية. لأنّ المصادقة على الهوية يتضمن تحديًا، ويوفر المتصل دائمًا المعرّفات تحقق. تحتاج بيئة التنفيذ الموثوقة (TEE) فقط إلى التحقّق من تطابق هذه القيم مع القيم التي في الأصل. يمكن تخزين تجزئات آمنة بالقيم الأصلية بدلاً من تتيح عملية التحقق هذه.

البناء

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

S = D || HMAC(HBK, D)

حيث:

  • D = HMAC(HBK, ID1) || HMAC(HBK, ID2) || ... || HMAC(HBK, IDn)
  • HMAC عبارة عن بنية HMAC مع تجزئة آمنة مناسبة (ننصح باستخدام خوارزمية SHA-256)
  • HBK هو مفتاح مرتبط بالجهاز ولا يُستخدم لأي غرض آخر.
  • تمثّل ID1...IDn قيم المعرّف الأصلي، جمعية قيمة خاصة لفهرس معين تعتمد على التنفيذ، حيث الأجهزة المختلفة سيكون لها عدد مختلف من المعرّفات
  • يمثّل || ميزة التسلسل.

نظرًا لأن مخرجات HMAC ذات حجم ثابت، فلا يتم تضمين رؤوس أو هيكل المطلوبة لإيجاد تجزئات المعرفات الفردية، أو HMAC لـ D. بالإضافة إلى ذلك للتحقق من القيم المقدمة لإجراء المصادقة، تحتاج عمليات التنفيذ إلى التحقق من صحة S من خلال استخراج D من S، واحتساب HMAC(HBK، D) ومقارنتها القيمة في S للتحقق من أنه لم يتم تعديل/تلف أي معرفات فردية. كذلك، في عمليات التنفيذ يجب أن تستخدم مقارنات في وقت ثابت لجميع المعرفات الفردية والعناصر والتحقق من صحة S. يجب أن يكون وقت المقارنة ثابتًا بغض النظر عن عدد المعرّفات المتوفرة والمطابقة الصحيحة لأي جزء من الاختبار.

معرّفات الأجهزة

تتوافق مصادقة المعرّفات مع معرّفات الأجهزة التالية:

  1. اسم العلامة التجارية، وفقًا لما يعرضه Build.BRAND في نظام Android
  2. اسم الجهاز كما يظهر من قِبل "Build.DEVICE" في نظام Android
  3. اسم المنتج وفقًا لما يعرضه تطبيق "Build.PRODUCT" في نظام Android
  4. اسم الشركة المصنّعة، وفقًا لما يعرضه Build.MANUFACTURER في نظام Android
  5. اسم الطراز، وفقًا لما يعرضه Build.MODEL في نظام Android
  6. الرقم التسلسلي
  7. أرقام IMEI لجميع الأجهزة اللاسلكية
  8. معرّفات MEID لجميع أجهزة الراديو

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

يتم طلب مصادقة الهوية من خلال إجراء مصادقة رئيسية وتضمين معرّفات الأجهزة المراد المصادقة عليها في الطلب. يتم وضع علامات على المعرّفات على أنّها:

  • ATTESTATION_ID_BRAND
  • ATTESTATION_ID_DEVICE
  • ATTESTATION_ID_PRODUCT
  • ATTESTATION_ID_MANUFACTURER
  • ATTESTATION_ID_MODEL
  • ATTESTATION_ID_SERIAL
  • ATTESTATION_ID_IMEI
  • ATTESTATION_ID_MEID

المعرّف المطلوب المصادقة عليه هو سلسلة بايت بترميز UTF-8. ينطبق هذا التنسيق على والمعرفات الرقمية أيضًا. يتم التعبير عن كل معرِّف يجب التصديق عليه باعتباره سلسلة بترميز UTF-8

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

إذا كان الجهاز يتيح مصادقة المعرّف وكانت هناك علامة واحدة أو أكثر من العلامات أعلاه في طلب مصادقة رئيسي، فإن بيئة التنفيذ الموثوقة (TEE) تتحقّق من المعرّف المقدمة مع كل علامة من العلامات مع نسختها من معرّفات الأجهزة. في حال حذف واحد أو أكثر من المعرّفات، تخفق المصادقة بأكملها مع ErrorCode::CANNOT_ATTEST_IDS من الصالح أن تكون العلامة نفسها تقديمها عدة مرات. وقد يكون ذلك مفيدًا، على سبيل المثال، عند التحقّق من أرقام IMEI: قد يحتوي الجهاز على عدة وحدات راديو تحتوي على أرقام IMEI متعددة. طلب المصادقة هو صالحة إذا كانت القيمة المقدمة مع كل ATTESTATION_ID_IMEI مطابقة أحد أجهزة الراديو الخاصة بالجهاز. وينطبق هذا أيضًا على جميع العلامات الأخرى.

إذا كانت المصادقة ناجحة، تتم إضافة المعرّفات التي تم التصديق عليها إلى إضافة مصادقة (OID 1.3.6.1.4.1.11129.2.1.17) لشهادة المصادقة الصادرة، باستخدام المخطط أعلاه. التغييرات من Keymaster 2 مخطّط المصادقة بخط غامق، مع التعليقات.

واجهة برمجة تطبيقات جافا

يقدّم هذا القسم معلومات فقط. منفّذو Keymaster لا وتنفيذ واجهة برمجة تطبيقات Java أو استخدامها. يتم تقديم ذلك لمساعدة القائمين بالتنفيذ على فهم كيفية استخدام التطبيقات لهذه الميزة. قد تستخدمها مكونات النظام بشكل مختلف، وهذا هو السبب في أنه من الأهمية بمكان عدم التعامل مع هذا القسم على أنه معياري.