اثر انگشت HIDL

در دستگاه‌هایی که دارای حسگر اثر انگشت هستند، کاربران می‌توانند یک یا چند اثر انگشت را ثبت کنند و از آن اثر انگشت‌ها برای باز کردن قفل دستگاه و انجام سایر کارها استفاده کنند. اندروید از زبان تعریف رابط سخت‌افزاری اثر انگشت (HIDL) برای اتصال به یک کتابخانه و سخت‌افزار اثر انگشت مخصوص فروشنده (به عنوان مثال، یک حسگر اثر انگشت) استفاده می‌کند.

برای پیاده‌سازی Fingerprint HIDL، باید IBiometricsFingerprint.hal در یک کتابخانه مخصوص فروشنده پیاده‌سازی کنید.

تطبیق اثر انگشت

حسگر اثر انگشت یک دستگاه معمولاً غیرفعال است. با این حال، در پاسخ به فراخوانی برای authenticate یا enroll ، حسگر اثر انگشت منتظر لمس می‌ماند (همچنین ممکن است صفحه نمایش هنگام لمس حسگر اثر انگشت توسط کاربر روشن شود). جریان سطح بالای تطبیق اثر انگشت شامل مراحل زیر است:

  1. کاربر انگشت خود را روی حسگر اثر انگشت قرار می‌دهد.
  2. کتابخانه‌ی مختص فروشنده، وجود اثر انگشت منطبق در مجموعه‌ی فعلی الگوهای اثر انگشت ثبت‌شده را تعیین می‌کند.
  3. نتایج منطبق به FingerprintService ارسال می‌شوند.

این جریان فرض می‌کند که یک اثر انگشت از قبل روی دستگاه ثبت شده است، یعنی کتابخانه‌ی مخصوص فروشنده، الگویی برای اثر انگشت ثبت کرده است. برای جزئیات بیشتر، به بخش احراز هویت مراجعه کنید.

معماری

حسگر اثر انگشت HAL با اجزای زیر در تعامل است.

  • BiometricManager مستقیماً با یک برنامه در یک فرآیند برنامه تعامل دارد. هر برنامه یک نمونه از IBiometricsFingerprint.hal دارد.
  • FingerprintService در فرآیند سیستم فعالیت می‌کند که ارتباط با HAL اثر انگشت را مدیریت می‌کند.
  • Fingerprint HAL یک پیاده‌سازی C/C++ از رابط IBiometricsFingerprint HIDL است. این شامل کتابخانه مخصوص فروشنده است که با سخت‌افزار مخصوص دستگاه ارتباط برقرار می‌کند.
  • اجزای Keystore API و KeyMint (که قبلاً Keymaster نام داشت) رمزنگاری مبتنی بر سخت‌افزار را برای ذخیره‌سازی امن کلید در یک محیط امن، مانند Trusted Execution Environment (TEE)، فراهم می‌کنند.
جریان داده برای احراز هویت اثر انگشت
شکل ۱. جریان داده سطح بالا برای احراز هویت اثر انگشت

یک پیاده‌سازی HAL مختص فروشنده باید از پروتکل ارتباطی مورد نیاز TEE استفاده کند. تصاویر خام و ویژگی‌های اثر انگشت پردازش‌شده نباید در حافظه غیرقابل اعتماد منتقل شوند. همه این داده‌های بیومتریک باید در سخت‌افزار امنی مانند TEE ذخیره شوند. روت کردن نباید بتواند داده‌های بیومتریک را به خطر بیندازد.

FingerprintService و fingerprintd از طریق Fingerprint HAL با کتابخانه‌ی مخصوص فروشنده تماس برقرار می‌کنند تا اثر انگشت‌ها را ثبت کرده و سایر عملیات را انجام دهند.

تعامل با اثر انگشت
شکل ۲. تعامل دیمن اثر انگشت با کتابخانه‌ی مختص فروشنده‌ی اثر انگشت

دستورالعمل‌های اجرایی

دستورالعمل‌های HAL اثر انگشت زیر به گونه‌ای طراحی شده‌اند که اطمینان حاصل شود داده‌های اثر انگشت فاش نمی‌شوند و هنگام جدا شدن کاربر از دستگاه، حذف می‌شوند:

  • داده‌های خام اثر انگشت یا مشتقات آن (به عنوان مثال، الگوها) هرگز نباید از خارج از درایور حسگر یا TEE قابل دسترسی باشند. اگر سخت‌افزار از TEE پشتیبانی می‌کند، دسترسی به سخت‌افزار باید محدود به TEE باشد و توسط یک سیاست SELinux محافظت شود. کانال رابط سریال جانبی (SPI) باید فقط برای TEE قابل دسترسی باشد و باید یک سیاست SELinux صریح در مورد تمام فایل‌های دستگاه وجود داشته باشد.
  • ثبت، شناسایی و دریافت اثر انگشت باید درون TEE انجام شود.
  • فقط شکل رمزگذاری شده داده‌های اثر انگشت می‌تواند در سیستم فایل ذخیره شود، حتی اگر خود سیستم فایل رمزگذاری شده باشد.
  • الگوهای اثر انگشت باید با یک کلید خصوصی مخصوص دستگاه امضا شوند. برای استاندارد رمزگذاری پیشرفته (AES)، حداقل یک الگو باید با مسیر سیستم فایل، گروه و شناسه اثر انگشت مطلق امضا شود، به طوری که فایل‌های الگو در دستگاه دیگر یا برای هر کسی غیر از کاربری که آنها را در همان دستگاه ثبت کرده است، غیرقابل اجرا باشند. به عنوان مثال، کپی کردن داده‌های اثر انگشت از یک کاربر دیگر در همان دستگاه یا از دستگاه دیگر نباید کار کند.
  • پیاده‌سازی‌ها یا باید از مسیر سیستم فایل ارائه شده توسط تابع setActiveGroup() استفاده کنند یا راهی برای پاک کردن تمام داده‌های الگوی کاربر هنگام حذف کاربر ارائه دهند. اکیداً توصیه می‌شود که فایل‌های الگوی اثر انگشت به صورت رمزگذاری شده و در مسیر ارائه شده ذخیره شوند. اگر این امر به دلیل الزامات ذخیره‌سازی TEE امکان‌پذیر نباشد، پیاده‌سازی‌کننده باید قلاب‌هایی را اضافه کند تا از حذف داده‌ها هنگام حذف کاربر اطمینان حاصل شود.

روش‌های اثر انگشت

رابط Fingerprint HIDL شامل متدهای اصلی زیر در IBiometricsFingerprint.hal است.

روش توضیحات
enroll() دستگاه حالت HAL را برای شروع جمع‌آوری و ذخیره الگوی اثر انگشت تغییر می‌دهد. هنگامی که ثبت نام کامل شد یا پس از یک مهلت زمانی، دستگاه حالت HAL به حالت آماده به کار باز می‌گردد.
preEnroll() یک توکن منحصر به فرد برای نشان دادن شروع ثبت اثر انگشت تولید می‌کند. یک توکن برای تابع enroll ارائه می‌دهد تا اطمینان حاصل شود که احراز هویت قبلی، به عنوان مثال، با استفاده از رمز عبور، انجام شده است. برای جلوگیری از دستکاری، توکن پس از تأیید اعتبار دستگاه، بسته‌بندی می‌شود. توکن باید در حین ثبت بررسی شود تا تأیید شود که هنوز معتبر است.
getAuthenticatorId() توکنی مرتبط با مجموعه اثر انگشت فعلی را برمی‌گرداند.
cancel() عملیات ثبت نام یا احراز هویت در انتظار را لغو می‌کند. دستگاه حالت HAL به حالت آماده به کار بازگردانده می‌شود.
enumerate() فراخوانی همزمان برای شمارش تمام الگوهای اثر انگشت شناخته شده.
remove() الگوی اثر انگشت را حذف می‌کند.
setActiveGroup() یک عملیات HAL را به مجموعه‌ای از اثر انگشت‌ها که متعلق به یک گروه مشخص هستند و توسط یک شناسه گروه (GID) شناسایی می‌شوند، محدود می‌کند.
authenticate() یک عملیات مرتبط با اثر انگشت (که توسط یک شناسه عملیات شناسایی می‌شود) را تأیید می‌کند.
setNotify() یک تابع کاربر را ثبت می‌کند که اعلان‌هایی از HAL دریافت می‌کند. اگر دستگاه حالت HAL در حالت مشغول باشد، تابع تا زمانی که HAL از حالت مشغول خارج شود، مسدود می‌شود.
postEnroll() عملیات ثبت را پایان می‌دهد و چالش تولید شده توسط preEnroll() را نامعتبر می‌کند. این باید در پایان جلسه ثبت نام چند انگشتی فراخوانی شود تا نشان دهد که دیگر نمی‌توان انگشت اضافه کرد.

برای جزئیات بیشتر در مورد این موارد، به توضیحات موجود در IBiometricsFingerprint.hal مراجعه کنید.