اندروید دارای مفهوم احراز هویت کاربر است که برای باز کردن قفل دستگاه و دسترسی به کلیدهای رمزنگاری استفاده می شود. این شامل اجزای زیر است:
- ذخیره سازی کلید رمزنگاری و ارائه دهنده خدمات. کلیدهای رمزنگاری را ذخیره می کند و روال های رمزنگاری استاندارد را در بالای آن کلیدها ارائه می دهد. Android از Keystore و KeyMint (قبلاً Keymaster) با پشتوانه سختافزاری برای خدمات رمزنگاری پشتیبانی میکند، از جمله رمزنگاری سختافزاری برای ذخیرهسازی کلید که ممکن است شامل یک محیط اجرای مطمئن (TEE) یا Secure Element (SE) مانند StrongBox باشد.
- احراز هویت کاربر حضور کاربر و/یا احراز هویت موفق را تأیید کنید. اندروید از Gatekeeper برای احراز هویت پین/الگو/رمز عبور و اثر انگشت برای احراز هویت با اثر انگشت پشتیبانی میکند. دستگاههایی که با Android 9 و بالاتر عرضه میشوند میتوانند از
BiometricPromptبه عنوان یک نقطه ادغام برای اثر انگشت و بیومتریک اضافی استفاده کنند. این مولفه ها وضعیت احراز هویت خود را از طریق یک کانال احراز هویت شده با سرویس keystore ارتباط می دهند. ( سیستم Android Keystore در سطح چارچوب نیز توسط سرویس Keystore پشتیبانی می شود.)
هر یک از این مؤلفهها مختص فروشنده است، اما پیادهسازی فروشنده برای برآوردن مشخصات رابط لایه انتزاعی سختافزار (HAL) و گذراندن آزمایشهای مجموعه تست فروشنده (VTS) مربوطه مورد نیاز است.
پیاده سازی های فروشنده نیز معمولاً به دو بخش تقسیم می شوند که توسط یک مکانیسم ارتباطی خاص فروشنده به هم متصل می شوند:
- یک سرویس HAL به عنوان یک فرآیند سیستم اندروید اجرا می شود و درخواست های Binder را از سیستم اندروید دریافت می کند.
- یک برنامه قابل اعتماد (TA) در محیط امن اجرا می شود و عملیات ایمن واقعی را انجام می دهد.
در اولین راهاندازی دستگاه پس از بازنشانی کارخانه، همه احراز هویتکنندگان برای دریافت ثبتنام اعتبار از کاربر آماده میشوند. کاربر باید ابتدا یک پین، الگو یا رمز عبور را در Gatekeeper (یا Weaver، در صورت وجود) ثبت کند. این ثبتنام اولیه یک شناسه امن کاربر 64 بیتی (SID) بهطور تصادفی ایجاد میکند که به عنوان یک شناسه برای کاربر و به عنوان یک نشانه الزامآور برای مواد رمزنگاری کاربر عمل میکند. این SID کاربر از نظر رمزنگاری به رمز عبور کاربر متصل است. احراز هویت موفق Gatekeeper منجر به AuthToken هایی می شود که حاوی SID کاربر برای آن رمز عبور است.
کاربری که می خواهد اعتبار موجود را تغییر دهد باید آن اعتبار را ارائه دهد. اگر اعتبار موجود با موفقیت تأیید شود، SID کاربر مرتبط با اعتبار موجود به اعتبار جدید منتقل میشود و کاربر را قادر میسازد تا پس از تغییر اعتبار به کلیدها دسترسی داشته باشد.
در برخی شرایط، یک سرپرست دستگاه میتواند یک ثبت نام غیرقابل اعتماد برای ثبت یک اعتبار جدید بدون ارائه اعتبار موجود انجام دهد. این به کاربر امکان دسترسی به دستگاه را می دهد، اما کلیدهای ایجاد شده تحت SID کاربر قدیمی برای همیشه گم می شوند. این بخش یک جریان احراز هویت معمولی را توصیف می کند که شامل تعاملات بین چندین مؤلفه هم در Android و هم در محیط امن است. توجه داشته باشید که همه اجزای امن یک کلید مخفی HMAC (در هر بوت) مشترک دارند که از آن برای احراز هویت پیام های یکدیگر استفاده می کنند. پس از اینکه کاربر یک اعتبارنامه را تنظیم کرد و یک SID کاربر به او اختصاص داد، میتواند احراز هویت را شروع کند، که زمانی شروع میشود که کاربر یک پین، الگو، رمز عبور، اثر انگشت یا سایر بیومتریکهای قوی ارائه کند. شکل 1. جریان احراز هویت جریان احراز هویت نیازی به ارتباط مستقیم بین TAها در محیط امن ندارد: AuthTokenها از TA احراز هویت کننده به سرویس فرمت AuthToken با مشخصات AIDL در در هر بوت یک دستگاه، کلید AuthToken HMAC باید تولید شده و با تمام اجزای TEE (Gatekeeper، KeyMint و تراست های بیومتریک پشتیبانی شده) به اشتراک گذاشته شود. بنابراین، برای محافظت بیشتر در برابر حملات مجدد، کلید HMAC باید هر بار که دستگاه راهاندازی مجدد میشود، بهطور تصادفی تولید شود. دو راه متداول وجود دارد که TAها به این کلید HMAC مشترک دسترسی پیدا می کنند:LockSettingsService درخواستی از gatekeeperd میکند.FingerprintService درخواست fingerprintd میکند. در دستگاههای دارای Android 9 و بالاتر، BiometricPrompt با استفاده از کلاس Biometric Manager مناسب، مانند FingerprintManager یا FaceManager ، از دیمون بیومتریک مناسب (به عنوان مثال، fingerprintd برای اثر انگشت یا faced برای چهره) درخواست میکند. صرف نظر از نسخه، احراز هویت بیومتریک به صورت ناهمزمان پس از ارسال درخواست انجام می شود.gatekeeperd پین، الگو یا هش رمز عبور را از طریق سرویس Gatekeeper HAL به Gatekeeper TA در TEE میفرستد. اگر احراز هویت در TEE موفقیت آمیز باشد، Gatekeeper TA یک AuthToken حاوی SID کاربر مربوطه (امضا شده با کلید HMAC مشترک) منتشر می کند.fingerprintd به رویدادهای اثر انگشت گوش میدهد و دادهها را از طریق HAL اثر انگشت به Fingerprint TA در TEE ارسال میکند. اگر احراز هویت در TEE موفقیت آمیز باشد، اثر انگشت TA یک AuthToken (که با کلید AuthToken HMAC امضا شده است) منتشر می کند.gatekeeperd همچنین هنگام قفل مجدد دستگاه و تغییر رمز دستگاه به سرویس فروشگاه کلید اطلاع می دهد.)keystore2 در اندروید جریان می یابند که به نوبه خود آنها را به KeyMint TA منتقل می کند. این همچنین به سرویس keystore2 اجازه میدهد تا به سرعت درخواستهایی را که ممکن است شکست بخورند، رد کند، زیرا از AuthTokenهای موجود در سیستم آگاهی دارد و یک IPC بالقوه پرهزینه را در TEE ذخیره میکند.HardwareAuthToken.aidl ارائه شده است.keystore2 یک پروتکل توافقنامه کلید چند طرفه را هنگام راهاندازی دستگاه اجرا میکند و امکان استخراج امن کلید HMAC را بین آن دسته از TAهای شرکتکننده فراهم میکند. با این حال، TAهای شرکت کننده باید به یک راز مشترک از قبل به اشتراک گذاشته شده دسترسی داشته باشند.
در هر صورت، کلید HMAC هرگز نباید خارج از TEE در دسترس قرار گیرد.
سیستم عامل Trusty که در کنار اندروید اجرا می شود، نمونه ای از TEE است، اما می توان به جای آن از سایر TEE ها استفاده کرد. Trusty از یک سیستم IPC داخلی برای برقراری ارتباط مستقیم بین KeyMint و Gatekeeper یا Trustlet بیومتریک مناسب استفاده می کند. کلید HMAC فقط در KeyMint نگهداری می شود. اثر انگشت و Gatekeeper برای هر بار استفاده، کلید را از KeyMint درخواست میکنند و مقدار را ثابت یا کش نکنید.
از آنجایی که برخی از TEE ها فاقد زیرساخت IPC هستند، هیچ ارتباطی بین اپلت ها در TEE رخ نمی دهد. این همچنین به سرویس keystore اجازه میدهد تا به سرعت درخواستهایی را که احتمالاً شکست میخورند رد کند، زیرا از جدول احراز هویت در سیستم اطلاعات دارد و یک IPC بالقوه پرهزینه را در TEE ذخیره میکند.