Keystore با پشتیبانی سخت افزار

در دسترس بودن یک محیط اجرایی قابل اعتماد در یک سیستم روی یک تراشه (SoC) فرصتی را برای دستگاه‌های اندرویدی فراهم می‌کند تا خدمات امنیتی قوی و سخت‌افزاری را برای سیستم‌عامل Android، خدمات پلت‌فرم و حتی برنامه‌های شخص ثالث ارائه کنند. توسعه دهندگانی که به دنبال برنامه های افزودنی مخصوص اندروید هستند باید به android.security.keystore مراجعه کنند.

قبل از اندروید 6.0، اندروید یک API خدمات رمزنگاری ساده و سخت افزاری داشت که توسط نسخه های 0.2 و 0.3 لایه انتزاعی سخت افزار Keymaster (HAL) ارائه شده بود. Keystore عملیات امضای دیجیتال و تأیید، به علاوه تولید و واردات جفت کلید امضای نامتقارن را ارائه می‌کرد. این در حال حاضر بر روی بسیاری از دستگاه ها اجرا شده است، اما اهداف امنیتی بسیاری وجود دارد که به راحتی تنها با یک API امضا نمی توان به آنها دست یافت. Keystore در Android 6.0 API Keystore را گسترش داد تا طیف وسیع تری از قابلیت ها را ارائه دهد.

در Android 6.0، Keystore رمزنگاری های اولیه متقارن ، AES و HMAC و یک سیستم کنترل دسترسی برای کلیدهای سخت افزاری را اضافه کرد. کنترل های دسترسی در طول تولید کلید مشخص شده و برای طول عمر کلید اجرا می شوند. کلیدها را می توان محدود کرد که فقط پس از احراز هویت کاربر و فقط برای اهداف مشخص یا با پارامترهای رمزنگاری مشخص قابل استفاده باشند. برای اطلاعات بیشتر، به صفحات مجوز و برچسب ها مراجعه کنید.

علاوه بر گسترش دامنه رمزنگاری های اولیه، Keystore در اندروید 6.0 موارد زیر را اضافه کرد:

  • یک طرح کنترل استفاده برای محدود کردن استفاده از کلید، برای کاهش خطر به خطر افتادن امنیت به دلیل استفاده نادرست از کلیدها
  • یک طرح کنترل دسترسی برای فعال کردن محدودیت کلیدها برای کاربران مشخص، مشتریان، و محدوده زمانی تعریف شده

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

Version binding کلیدها را به سیستم عامل و نسخه سطح وصله متصل می کند. این تضمین می‌کند که مهاجمی که نقطه ضعفی را در نسخه قدیمی سیستم یا نرم‌افزار TEE کشف می‌کند، نمی‌تواند دستگاه را به نسخه آسیب‌پذیر برگرداند و از کلیدهای ایجاد شده با نسخه جدیدتر استفاده کند. علاوه بر این، هنگامی که کلیدی با یک نسخه معین و سطح وصله روی دستگاهی استفاده می‌شود که به نسخه جدیدتر یا سطح وصله ارتقا یافته است، کلید قبل از اینکه بتوان از آن استفاده کرد ارتقا داده می‌شود و نسخه قبلی کلید باطل می‌شود. همانطور که دستگاه ارتقا می یابد، کلیدها همراه با دستگاه به جلو حرکت می کنند، اما هرگونه بازگشت دستگاه به نسخه قبلی باعث می شود کلیدها غیرقابل استفاده باشند.

در اندروید 8.0، Keymaster 3 از لایه انتزاعی سخت‌افزاری (HAL) به سبک قدیمی C به رابط HAL C++ که از تعریفی در زبان تعریف رابط سخت‌افزار جدید (HIDL) تولید شده بود، انتقال یافت. به عنوان بخشی از تغییر، بسیاری از انواع آرگومان ها تغییر کردند، اگرچه انواع و روش ها مطابقت یک به یک با انواع قدیمی و روش های ساختار HAL دارند. برای جزئیات بیشتر به صفحه توابع مراجعه کنید.

علاوه بر این ویرایش رابط، Android 8.0 ویژگی تأیید Keymaster 2 را برای پشتیبانی از تأیید شناسه گسترش داد. گواهی شناسه مکانیزم محدود و اختیاری را برای تأیید قوی شناسه های سخت افزاری مانند شماره سریال دستگاه، نام محصول و شناسه تلفن (IMEI / MEID) ارائه می دهد. برای پیاده سازی این اضافه، Android 8.0 طرح گواهی ASN.1 را برای افزودن گواهی ID تغییر داد. پیاده‌سازی‌های Keymaster باید راهی مطمئن برای بازیابی اقلام داده‌های مربوطه و همچنین تعریف مکانیزمی برای غیرفعال کردن ایمن و دائمی این ویژگی پیدا کنند.

در اندروید 9، به‌روزرسانی‌ها شامل:

  • به روز رسانی به Keymaster 4
  • پشتیبانی از عناصر امن جاسازی شده
  • پشتیبانی از واردات کلید امن
  • پشتیبانی از رمزگذاری 3DES
  • تغییرات در binding نسخه به طوری که boot.img و system.img به طور جداگانه نسخه هایی را تنظیم کرده اند تا امکان به روز رسانی مستقل را فراهم کنند.

واژه نامه

در اینجا یک مرور سریع از اجزای Keystore و روابط آنها ارائه شده است.

AndroidKeystore API و جزء Android Framework است که توسط برنامه ها برای دسترسی به عملکرد Keystore استفاده می شود. این برنامه به عنوان یک افزونه برای APIهای استاندارد معماری رمزنگاری جاوا پیاده سازی شده است و از کد جاوا تشکیل شده است که در فضای فرآیند خود برنامه اجرا می شود. AndroidKeystore درخواست‌های برنامه برای رفتار Keystore را با ارسال آن‌ها به شبح keystore برآورده می‌کند.

شبح کیستور یک دیمون سیستم اندرویدی است که دسترسی به تمام عملکردهای کی استور را از طریق Binder API فراهم می کند. مسئول ذخیره کردن «حباب‌های کلیدی» است که حاوی مواد کلید مخفی واقعی است، به‌طوری که Keystore بتواند آن‌ها را ذخیره کند اما از آنها استفاده یا فاش نکند.

keymasterd یک سرور HIDL است که دسترسی به Keymaster TA را فراهم می کند. (این نام استاندارد نیست و برای اهداف مفهومی است.)

Keymaster TA (برنامه مورد اعتماد) نرم افزاری است که در یک زمینه ایمن اجرا می شود، اغلب در TrustZone روی یک SoC ARM، که تمام عملیات Keystore امن را ارائه می دهد، به مواد کلید خام دسترسی دارد، همه شرایط کنترل دسترسی کلیدها را تأیید می کند. ، و غیره.

LockSettingsService جزء سیستم اندروید است که مسئول احراز هویت کاربر، رمز عبور و اثر انگشت است. این بخشی از Keystore نیست، اما مرتبط است زیرا بسیاری از عملیات کلید Keystore نیاز به احراز هویت کاربر دارند. LockSettingsService با Gatekeeper TA و Fingerprint TA تعامل می کند تا توکن های احراز هویت را به دست آورد که در اختیار دیمون keystore قرار می دهد و در نهایت توسط برنامه Keymaster TA مصرف می شود.

Gatekeeper TA (برنامه مورد اعتماد) مؤلفه دیگری است که در زمینه امن اجرا می شود و مسئول احراز هویت رمزهای عبور کاربر و تولید نشانه های احراز هویت است که برای اثبات به Keymaster TA استفاده می شود که احراز هویت برای یک کاربر خاص در یک زمان خاص انجام شده است.

اثر انگشت TA (برنامه مورد اعتماد) مؤلفه دیگری است که در زمینه ایمن اجرا می شود و مسئول احراز هویت اثر انگشت کاربر و تولید نشانه های احراز هویت است که برای اثبات به Keymaster TA استفاده می شود که احراز هویت برای یک کاربر خاص در یک مقطع زمانی خاص انجام شده است.

معماری

Android Keystore API و Keymaster HAL زیربنایی مجموعه ای اساسی اما کافی از رمزنگاری های اولیه را فراهم می کند تا امکان اجرای پروتکل ها با استفاده از کلیدهای کنترل شده با دسترسی سخت افزاری را فراهم کند.

Keymaster HAL یک کتابخانه OEM با قابلیت بارگذاری پویا است که توسط سرویس Keystore برای ارائه خدمات رمزنگاری سخت افزاری استفاده می شود. برای حفظ امنیت، پیاده سازی های HAL هیچ عملیات حساسی را در فضای کاربر یا حتی در فضای هسته انجام نمی دهند. عملیات حساس به یک پردازنده ایمن واگذار می شود که از طریق برخی از رابط های هسته قابل دسترسی است. معماری حاصل به این صورت است:

دسترسی به Keymaster

شکل 1. دسترسی به Keymaster

در یک دستگاه Android، "کلینت" Keymaster HAL از چندین لایه (به عنوان مثال برنامه، فریمورک، شبح Keystore) تشکیل شده است، اما برای اهداف این سند می توان از آن چشم پوشی کرد. این بدان معناست که Keymaster HAL API توصیف‌شده سطح پایینی است، توسط مؤلفه‌های داخلی پلتفرم استفاده می‌شود و در معرض توسعه‌دهندگان برنامه قرار نمی‌گیرد. API سطح بالاتر در سایت Android Developer توضیح داده شده است.

هدف Keymaster HAL پیاده‌سازی الگوریتم‌های حساس به امنیت نیست، بلکه فقط مارشال و حذف درخواست‌ها به دنیای امن است. قالب سیم پیاده سازی شده است.

سازگاری با نسخه های قبلی

Keymaster 1 HAL کاملاً با HAL های منتشر شده قبلی، به عنوان مثال Keymaster 0.2 و 0.3 ناسازگار است. برای تسهیل قابلیت همکاری در دستگاه‌های دارای Android نسخه 5.0 و نسخه‌های قدیمی‌تر که با Keymaster HAL‌های قدیمی‌تر راه‌اندازی شده‌اند، Keystore آداپتوری ارائه می‌کند که Keymaster 1 HAL را با فراخوانی به کتابخانه سخت‌افزار موجود پیاده‌سازی می‌کند. نتیجه نمی تواند طیف کاملی از عملکردها را در Keymaster 1 HAL ارائه دهد. به طور خاص، فقط از الگوریتم‌های RSA و ECDSA پشتیبانی می‌کند و تمام اجرای مجوزهای کلیدی توسط آداپتور در دنیای غیر ایمن انجام می‌شود.

Keymaster 2 رابط HAL را با حذف get_supported_* کرد و به متد finish() اجازه داد ورودی را بپذیرد. این باعث کاهش تعداد رفت و برگشت به TEE در مواردی می شود که ورودی به یکباره در دسترس است و اجرای رمزگشایی AEAD را ساده می کند.

در اندروید 8.0، Keymaster 3 از ساختار قدیمی HAL به رابط C++ HAL که از تعریفی در زبان تعریف رابط سخت افزاری جدید (HIDL) ایجاد شده بود، انتقال یافت. یک پیاده سازی HAL به سبک جدید با زیرکلاس بندی کلاس IKeymasterDevice تولید شده و پیاده سازی روش های مجازی خالص ایجاد می شود. به عنوان بخشی از تغییر، بسیاری از انواع آرگومان ها تغییر کرده اند، اگرچه انواع و روش ها مطابقت یک به یک با انواع قدیمی و روش های ساختار HAL دارند.

نمای کلی HIDL

زبان تعریف رابط سخت افزاری (HIDL) مکانیزمی مستقل از زبان پیاده سازی برای تعیین رابط های سخت افزاری ارائه می دهد. ابزار HIDL در حال حاضر از تولید رابط های C++ و جاوا پشتیبانی می کند. انتظار می‌رود که اکثر پیاده‌کننده‌های Trusted Execution Environment (TEE) ابزار C++ را راحت‌تر بیابند، بنابراین این سند فقط نمایش C++ را مورد بحث قرار می‌دهد.

رابط های HIDL شامل مجموعه ای از روش ها هستند که به صورت زیر بیان می شوند:

  methodName(INPUT ARGUMENTS) generates (RESULT ARGUMENTS);

انواع مختلفی از پیش تعریف شده وجود دارد، و HAL ها می توانند انواع جدید برشماری و ساختاری را تعریف کنند. برای جزئیات بیشتر در مورد HIDL، به بخش مرجع مراجعه کنید.

یک روش مثال از Keymaster 3 IKeymasterDevice.hal این است:

generateKey(vec<KeyParameter> keyParams)
        generates(ErrorCode error, vec<uint8_t> keyBlob,
                  KeyCharacteristics keyCharacteristics);

این معادل موارد زیر از keymaster2 HAL است:

keymaster_error_t (*generate_key)(
        const struct keymaster2_device* dev,
        const keymaster_key_param_set_t* params,
        keymaster_key_blob_t* key_blob,
        keymaster_key_characteristics_t* characteristics);

در نسخه HIDL، آرگومان dev حذف می‌شود، زیرا ضمنی است. آرگومان params دیگر ساختاری نیست که حاوی اشاره‌گری است که به آرایه‌ای از اشیاء key_parameter_t ، بلکه یک vec (بردار) حاوی اشیاء KeyParameter است. generates بازگشتی در بند "genes" فهرست شده اند، از جمله بردار مقادیر uint8_t برای حباب کلید.

روش مجازی C++ تولید شده توسط کامپایلر HIDL به صورت زیر است:

Return<void> generateKey(const hidl_vec<KeyParameter>& keyParams,
                         generateKey_cb _hidl_cb) override;

در جایی که generateKey_cb یک اشاره گر تابعی است که به صورت زیر تعریف می شود:

std::function<void(ErrorCode error, const hidl_vec<uint8_t>& keyBlob,
                   const KeyCharacteristics& keyCharacteristics)>

یعنی generateKey_cb تابعی است که مقادیر بازگشتی فهرست شده در عبارت generate را می گیرد. کلاس پیاده سازی HAL این متد generalKey را لغو می کند و نشانگر تابع generateKey را فراخوانی می generateKey_cb تا نتیجه عملیات را به تماس گیرنده برگرداند. توجه داشته باشید که فراخوانی اشاره گر تابع همزمان است. تماس‌گیرنده generalKey را فرا می‌خواند و generateKey اشاره‌گر تابع ارائه‌شده را فراخوانی می‌کند، که تا تکمیل اجرا می‌شود و کنترل را generateKey generateKey ، که سپس به تماس‌گیرنده برمی‌گردد.

برای مثال دقیق، اجرای پیش‌فرض را در hardware/interfaces/keymaster/3.0/default/KeymasterDevice.cpp ببینید. پیاده‌سازی پیش‌فرض برای دستگاه‌هایی با keymaster0، keymaster1، یا keymaster2 HALS قدیمی، سازگاری رو به عقب را فراهم می‌کند.

کنترل دسترسی

اساسی ترین قانون کنترل دسترسی Keystore این است که هر برنامه فضای نام خاص خود را دارد. اما برای هر قانون یک استثنا وجود دارد. Keystore دارای نقشه های سخت کدگذاری شده ای است که به برخی از اجزای سیستم اجازه می دهد به برخی از فضاهای نام دیگر دسترسی داشته باشند. این یک ابزار بسیار صریح است که به یک جزء کنترل کامل بر فضای نام دیگر می دهد. و سپس موضوع اجزای فروشنده به عنوان مشتریان Keystore وجود دارد. ما در حال حاضر راهی برای ایجاد فضای نام برای اجزای فروشنده، به عنوان مثال، درخواست کننده WPA نداریم.

به منظور تطبیق اجزای فروشنده و تعمیم کنترل دسترسی بدون استثناهای کدگذاری سخت، Keystore 2.0 دامنه ها و فضاهای نام SELinux را معرفی می کند.

دامنه های فروشگاه کلید

با دامنه های Keystore، می توانیم فضاهای نام را از UID ها جدا کنیم. مشتریانی که به یک کلید در Keystore دسترسی دارند، باید دامنه، فضای نام و نام مستعاری را که می خواهند به آن دسترسی داشته باشند، مشخص کنند. بر اساس این تاپل و هویت تماس گیرنده، می توانیم تعیین کنیم که تماس گیرنده به کدام کلید می خواهد دسترسی داشته باشد و آیا مجوزهای مناسبی دارد یا خیر.

ما پنج پارامتر دامنه را معرفی می کنیم که نحوه دسترسی به کلیدها را کنترل می کند. آنها معنای پارامتر فضای نام توصیفگر کلید و نحوه کنترل دسترسی را کنترل می کنند.

  • DOMAIN_APP : دامنه برنامه رفتار قدیمی را پوشش می دهد. Java Keystore SPI به طور پیش فرض از این دامنه استفاده می کند. هنگامی که از این دامنه استفاده می شود، آرگومان فضای نام نادیده گرفته می شود و به جای آن از UID تماس گیرنده استفاده می شود. دسترسی به این دامنه توسط برچسب Keystore به کلاس keystore_key در خط مشی SELinux کنترل می شود.
  • DOMAIN_SELINUX : این دامنه نشان می دهد که فضای نام دارای یک برچسب در خط مشی SELinux است. پارامتر فضای نام جستجو شده و به یک زمینه هدف ترجمه می شود، و یک بررسی مجوز برای متن فراخوانی SELinux برای کلاس keystore_key انجام می شود. هنگامی که مجوز برای عملیات داده شده ایجاد شد، تاپل کامل برای جستجوی کلید استفاده می شود.
  • DOMAIN_GRANT : دامنه اعطایی نشان می دهد که پارامتر فضای نام یک شناسه گرنت است. پارامتر مستعار نادیده گرفته می شود. بررسی های SELinux زمانی انجام می شود که کمک هزینه ایجاد شود. کنترل دسترسی بیشتر فقط بررسی می کند که آیا UID تماس گیرنده با UID دریافت کنندگان کمک هزینه درخواستی مطابقت دارد یا خیر.
  • DOMAIN_KEY_ID : این دامنه نشان می دهد که پارامتر فضای نام یک شناسه کلید منحصر به فرد است. ممکن است خود کلید با DOMAIN_APP یا DOMAIN_SELINUX ایجاد شده باشد. بررسی مجوز پس از بارگیری domain و namespace از پایگاه داده کلید انجام می شود، به همان روشی که گویی حباب توسط دامنه، فضای نام و نام مستعار بارگذاری شده است. منطق دامنه شناسه کلید تداوم است. هنگام دسترسی به یک کلید با نام مستعار، تماس‌های بعدی ممکن است روی کلیدهای مختلف عمل کنند، زیرا ممکن است کلید جدیدی تولید یا وارد شده باشد و به این نام مستعار متصل شده باشد. با این حال، شناسه کلید هرگز تغییر نمی کند. بنابراین هنگام استفاده از شناسه کلید به کلید پس از بارگیری آن از پایگاه داده Keystore با استفاده از نام مستعار، می توان مطمئن بود که تا زمانی که شناسه کلید هنوز وجود دارد، همان کلید است. این قابلیت در معرض توسعه دهندگان برنامه نیست. در عوض، از آن در Android Keystore SPI استفاده می‌شود تا تجربه‌ای سازگارتر را ارائه دهد، حتی در صورت استفاده همزمان به روشی ناامن.
  • DOMAIN_BLOB : دامنه blob نشان می دهد که تماس گیرنده به تنهایی لکه را مدیریت می کند. این برای کلاینت هایی استفاده می شود که باید قبل از نصب پارتیشن داده به Keystore دسترسی داشته باشند. حباب کلید در قسمت blob توصیفگر کلید گنجانده شده است.

با استفاده از دامنه SELinux، می‌توانیم به اجزای فروشنده به فضاهای نام بسیار خاص Keystore دسترسی دهیم که می‌توانند توسط اجزای سیستم مانند گفتگوی تنظیمات به اشتراک گذاشته شوند.

خط مشی SELinux برای keystore_key

برچسب‌های فضای نام با استفاده از فایل keystore2_key_context پیکربندی می‌شوند.
هر خط در این فایل ها یک شناسه فضای نام عددی را به یک برچسب SELinux ترسیم می کند. مثلا،

# wifi_key is a keystore2_key namespace intended to be used by wpa supplicant and
# Settings to share keystore keys.
102            u:object_r:wifi_key:s0

پس از راه‌اندازی فضای نام کلید جدید به این روش، می‌توانیم با افزودن یک خط‌مشی مناسب به آن دسترسی داشته باشیم. به عنوان مثال، برای اجازه دادن به wpa_supplicant برای دریافت و استفاده از کلیدها در فضای نام جدید، خط زیر را به hal_wifi_supplicant.te اضافه می کنیم:

allow hal_wifi_supplicant wifi_key:keystore2_key { get, use };

پس از تنظیم فضای نام جدید، AndroidKeyStore تقریباً طبق معمول قابل استفاده است. تنها تفاوت این است که شناسه فضای نام باید مشخص شود. برای بارگیری و وارد کردن کلیدها از و به Keystore، شناسه فضای نام با استفاده از AndroidKeyStoreLoadStoreParameter مشخص می شود. مثلا،

import android.security.keystore2.AndroidKeyStoreLoadStoreParameter;
import java.security.KeyStore;

KeyStore keystore = KeyStore.getInstance("AndroidKeyStore");
keystore.load(new AndroidKeyStoreLoadStoreParameter(102));

برای ایجاد یک کلید در یک فضای نام مشخص، شناسه فضای نام باید با استفاده از KeyGenParameterSpec.Builder#setNamespace():

import android.security.keystore.KeyGenParameterSpec;
KeyGenParameterSpec.Builder specBuilder = new KeyGenParameterSpec.Builder();
specBuilder.setNamespace(102);

فایل های زمینه زیر ممکن است برای پیکربندی فضای نام Keystore 2.0 SELinux استفاده شوند. هر پارتیشن دارای محدوده رزرو شده متفاوتی از 10000 شناسه فضای نام برای جلوگیری از برخورد است.

تقسیم بندی دامنه فایل های پیکربندی
سیستم 0 ... 9,999
/system/etc/selinux/keystore2_key_contexts, /plat_keystore2_key_contexts
سیستم توسعه یافته 10,000 ... 19,999
/system_ext/etc/selinux/system_ext_keystore2_key_contexts, /system_ext_keystore2_key_contexts
تولید - محصول 20,000 ... 29,999
/product/etc/selinux/product_keystore2_key_contexts, /product_keystore2_key_contexts
فروشنده 30,000 ... 39,999
/vendor/etc/selinux/vendor_keystore2_key_contexts, /vendor_keystore2_key_contexts

کلاینت کلید را با درخواست دامنه SELinux و فضای نام مجازی مورد نظر، در این مورد "wifi_key" توسط شناسه عددی خود درخواست می کند.

بالاتر از آن فضاهای نام زیر تعریف شده است. اگر آنها جایگزین قوانین خاصی شوند، جدول زیر UID مورد استفاده برای مطابقت را نشان می دهد.

شناسه فضای نام برچسب SEPolicy UID شرح
0 su_key N/A کلید کاربر فوق العاده فقط برای آزمایش بر روی userdebug و ساخت های eng استفاده می شود. مربوط به ساخت های کاربر نیست.
1 shell_key N/A فضای نام موجود برای پوسته. بیشتر برای آزمایش استفاده می شود، اما می تواند در ساخت های کاربر نیز از خط فرمان استفاده شود.
100 vold_key N/A در نظر گرفته شده برای استفاده توسط ولد.
101 odsing_key N/A توسط دیمون امضای روی دستگاه استفاده می شود.
102 wifi_key AID_WIFI (1010) توسط سیستم فای اندروید از جمله wpa_supplicant استفاده می شود.
120 resume_on_reboot_key AID_SYSTEM (1000) توسط سرور سیستم اندروید برای پشتیبانی از رزومه در راه اندازی مجدد استفاده می شود.

بردارهای دسترسی

کلید keystore_key کلاس SELinux کمی قدیمی شده است و برخی از مجوزها مانند verify یا sign معنی خود را از دست داده اند. در اینجا مجموعه جدیدی از مجوزها، keystore2_key است که Keystore 2.0 اعمال خواهد کرد.

اجازه معنی
delete هنگام برداشتن کلیدها از Keystore بررسی شد.
get_info زمانی که فراداده یک کلید درخواست می شود، بررسی می شود.
grant تماس‌گیرنده به این مجوز نیاز دارد تا به کلید در زمینه هدف کمک کند.
manage_blob تماس گیرنده ممکن است از DOMAIN_BLOB در فضای نام SELinux داده شده استفاده کند، بنابراین حباب ها را به تنهایی مدیریت می کند. این به طور خاص برای ولد مفید است.
rebind این مجوز کنترل می کند که آیا نام مستعار ممکن است به یک کلید جدید بازگردانده شود. این برای درج لازم است و به این معنی است که کلید قبلاً محدود شده حذف خواهد شد. این اساساً یک مجوز درج است، اما معنایی ذخیره کلید را بهتر نشان می دهد.
req_forced_op مشتریان با این مجوز ممکن است عملیات غیرقابل هرس ایجاد کنند، و ایجاد عملیات هرگز با شکست مواجه نمی شود مگر اینکه تمام شکاف های عملیات توسط عملیات غیرقابل هرس گرفته شوند.
update برای به روز رسانی جزء فرعی یک کلید لازم است.
use هنگام ایجاد یک عملیات Keymint که از مواد کلیدی استفاده می کند، به عنوان مثال، برای امضا، رمزگشایی/رمزگشایی، بررسی می شود.
use_dev_id هنگام تولید اطلاعات شناسایی دستگاه، مانند تأیید شناسه دستگاه، لازم است.

علاوه بر این، مجموعه‌ای از مجوزهای ذخیره کلید غیر کلیدی را در keystore2 کلاس امنیتی SELinux تقسیم می‌کنیم:

اجازه معنی
add_auth توسط ارائه دهنده احراز هویت مانند Gatekeeper یا BiometricsManager برای افزودن نشانه های احراز هویت مورد نیاز است.
clear_ns این مجوز که قبلا clear_uid بود، به یک غیر مالک فضای نام اجازه می دهد تا همه کلیدهای آن فضای نام را حذف کند.
list مورد نیاز سیستم برای شمارش کلیدها بر اساس ویژگی‌های مختلف، مانند مالکیت یا محدودیت اعتبار. برای تماس گیرندگانی که فضاهای نام خود را برمی‌شمارند، به این مجوز نیازی نیست. این توسط مجوز get_info پوشش داده شده است.
lock این مجوز امکان قفل کردن Keystore را فراهم می‌کند، یعنی کلید اصلی را خارج می‌کند، به‌طوری که کلیدهای auth bound غیرقابل استفاده و غیرقابل ایجاد شوند.
reset این مجوز امکان بازنشانی Keystore را به پیش‌فرض کارخانه، حذف تمام کلیدهایی که برای عملکرد سیستم عامل اندروید حیاتی نیستند، می‌دهد.
unlock این مجوز برای تلاش برای باز کردن قفل کلید اصلی برای کلیدهای auth bound مورد نیاز است.