يوفِّر ملف تخزين المفاتيح مكانًا أكثر أمانًا لإنشاء ملفات التشفير وتخزينها واستخدامها. المفاتيح بطريقة منظمة. عند توفُّر وحدة تخزين مفتاح مستندة إلى الجهاز واستخدامها، تكون المواد الرئيسية أكثر أمانًا من استخراجها من الجهاز يفرض تطبيق 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. يجب أن يكون وقت المقارنة ثابتًا بغض النظر عن عدد المعرّفات المتوفرة والمطابقة الصحيحة لأي جزء من الاختبار.
معرّفات الأجهزة
تتوافق مصادقة المعرّفات مع معرّفات الأجهزة التالية:
- اسم العلامة التجارية، وفقًا لما يعرضه
Build.BRAND
في نظام Android - اسم الجهاز كما يظهر من قِبل "
Build.DEVICE
" في نظام Android - اسم المنتج وفقًا لما يعرضه تطبيق "
Build.PRODUCT
" في نظام Android - اسم الشركة المصنّعة، وفقًا لما يعرضه
Build.MANUFACTURER
في نظام Android - اسم الطراز، وفقًا لما يعرضه
Build.MODEL
في نظام Android - الرقم التسلسلي
- أرقام IMEI لجميع الأجهزة اللاسلكية
- معرّفات 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 أو استخدامها. يتم تقديم ذلك لمساعدة القائمين بالتنفيذ على فهم كيفية استخدام التطبيقات لهذه الميزة. قد تستخدمها مكونات النظام بشكل مختلف، وهذا هو السبب في أنه من الأهمية بمكان عدم التعامل مع هذا القسم على أنه معياري.