Google berkomitmen untuk memajukan ekuitas ras untuk komunitas kulit hitam. Lihat bagaimana.
Halaman ini diterjemahkan oleh Cloud Translation API.
Switch to English

Keystore yang didukung perangkat keras

Ketersediaan lingkungan eksekusi tepercaya dalam sistem pada chip (SoC) menawarkan peluang bagi perangkat Android untuk menyediakan layanan keamanan yang kuat dan didukung perangkat keras untuk OS Android, ke layanan platform, dan bahkan ke aplikasi pihak ketiga. Pengembang mencari ekstensi Android-spesifik harus pergi ke android.security.keystore .

Sebelum Android 6.0, Android sudah memiliki API sederhana, layanan crypto yang didukung perangkat keras, yang disediakan oleh versi 0.2 dan 0.3 dari Keymaster Hardware Abstraction Layer (HAL). Keystore menyediakan operasi penandatanganan dan verifikasi digital, plus pembuatan dan impor pasangan kunci penandatanganan asimetris. Ini sudah diterapkan pada banyak perangkat, tetapi ada banyak tujuan keamanan yang tidak dapat dengan mudah dicapai hanya dengan API tanda tangan. Keystore di Android 6.0 memperluas API Keystore untuk memberikan jangkauan kemampuan yang lebih luas.

Di Android 6.0, Keystore menambahkan primitif kriptografi simetris , AES dan HMAC, dan sistem kontrol akses untuk kunci yang didukung perangkat keras. Kontrol akses ditentukan selama pembuatan kunci dan diberlakukan selama masa pakai kunci. Kunci dapat dibatasi untuk dapat digunakan hanya setelah pengguna melakukan otentikasi, dan hanya untuk tujuan tertentu atau dengan parameter kriptografi tertentu. Untuk informasi lebih lanjut, lihat halaman Tag Fungsi dan Fungsi .

Selain memperluas jangkauan primitif kriptografi, Keystore di Android 6.0 menambahkan yang berikut:

  • Skema kontrol penggunaan untuk memungkinkan penggunaan kunci menjadi terbatas, untuk mengurangi risiko kompromi keamanan karena penyalahgunaan kunci
  • Skema kontrol akses untuk memungkinkan pembatasan kunci untuk pengguna, klien, dan rentang waktu yang ditentukan

Di Android 7.0, Keymaster 2 menambahkan dukungan untuk pengesahan kunci dan pengikatan versi. Pengesahan kunci menyediakan sertifikat kunci publik yang berisi uraian terperinci tentang kunci dan kontrol aksesnya, untuk membuat keberadaan kunci dalam perangkat keras yang aman dan konfigurasinya dapat diverifikasi dari jarak jauh.

Mengikat versi mengikat kunci ke sistem operasi dan versi tingkat tambalan. Ini memastikan bahwa penyerang yang menemukan kelemahan dalam versi lama sistem atau perangkat lunak TEE tidak dapat mengembalikan perangkat ke versi yang rentan dan menggunakan kunci yang dibuat dengan versi yang lebih baru. Selain itu, ketika kunci dengan versi yang diberikan dan tingkat tambalan digunakan pada perangkat yang telah ditingkatkan ke versi yang lebih baru atau tingkat tambalan, kunci ditingkatkan sebelum dapat digunakan, dan versi kunci sebelumnya dibatalkan. Ketika perangkat ditingkatkan, tombol "ratchet" maju bersama dengan perangkat, tetapi setiap pembalikan perangkat ke rilis sebelumnya menyebabkan kunci tidak dapat digunakan.

Di Android 8.0, Keymaster 3 beralih dari Lapisan Abstraksi Perangkat Keras (HAL) struktur-C gaya lama ke antarmuka C ++ HAL yang dihasilkan dari definisi dalam Perangkat Keras Antarmuka Definisi Bahasa (HIDL). Sebagai bagian dari perubahan, banyak tipe argumen berubah, meskipun tipe dan metode memiliki korespondensi satu-ke-satu dengan tipe lama dan metode struct HAL. Lihat halaman Fungsi untuk lebih jelasnya.

Selain revisi antarmuka ini, Android 8.0 memperluas fitur pengesahan Keymaster 2 untuk mendukung pengesahan ID . Pengesahan ID menyediakan mekanisme terbatas dan opsional untuk pengesahan kuat terhadap pengidentifikasi perangkat keras, seperti nomor seri perangkat, nama produk, dan ID telepon (IMEI / MEID). Untuk menerapkan penambahan ini, ubah skema pengesahan ASN.1 untuk menambahkan pengesahan ID. Implementasi Keymaster perlu menemukan beberapa cara aman untuk mengambil item data yang relevan, serta mendefinisikan mekanisme untuk menonaktifkan fitur secara aman dan permanen.

Di Android 9, pembaruan meliputi:

  • Perbarui ke Keymaster 4
  • Dukungan untuk Elemen Aman tertanam
  • Dukungan untuk impor kunci aman
  • Dukungan untuk enkripsi 3DES
  • Perubahan pada pengikatan versi sehingga boot.img dan system.img secara terpisah mengatur versi untuk memungkinkan pembaruan independen

Glosarium

Berikut ini adalah tinjauan singkat komponen Keystore dan hubungannya.

AndroidKeystore adalah Android Framework API dan komponen yang digunakan oleh aplikasi untuk mengakses fungsionalitas Keystore. Ini diimplementasikan sebagai perpanjangan dari API Arsitektur Kriptografi Java standar, dan terdiri dari kode Java yang berjalan di ruang proses aplikasi sendiri. AndroidKeystore memenuhi permintaan aplikasi untuk perilaku Keystore dengan meneruskannya ke daemon keystore.

Daemon keystore adalah daemon sistem Android yang menyediakan akses ke semua fungsionalitas Keystore melalui API Binder . Ini bertanggung jawab untuk menyimpan "gumpalan kunci", yang berisi bahan kunci rahasia yang sebenarnya, dienkripsi sehingga Keystore dapat menyimpannya tetapi tidak menggunakannya atau mengungkapkannya.

keymasterd adalah server HIDL yang menyediakan akses ke TA Keymaster. (Nama ini tidak terstandarisasi dan untuk tujuan konseptual.)

TA Keymaster (aplikasi tepercaya) adalah perangkat lunak yang berjalan dalam konteks yang aman, paling sering di TrustZone pada ARM SoC, yang menyediakan semua operasi Keystore yang aman, memiliki akses ke bahan kunci mentah, memvalidasi semua kondisi kontrol akses pada kunci , dll.

LockSettingsService adalah komponen sistem Android yang bertanggung jawab untuk otentikasi pengguna, baik kata sandi maupun sidik jari. Ini bukan bagian dari Keystore, tetapi relevan karena banyak operasi kunci Keystore memerlukan otentikasi pengguna. LockSettingsService berinteraksi dengan TA Gatekeeper dan Fingerprint TA untuk mendapatkan token otentikasi, yang diberikannya ke daemon keystore, dan yang pada akhirnya dikonsumsi oleh aplikasi TA Keymaster.

TA Gatekeeper (aplikasi tepercaya) adalah komponen lain yang berjalan dalam konteks aman, yang bertanggung jawab untuk mengautentikasi kata sandi pengguna dan menghasilkan token otentikasi yang digunakan untuk membuktikan kepada TA Keymaster bahwa otentikasi dilakukan untuk pengguna tertentu pada titik waktu tertentu.

TA Sidik Jari (aplikasi tepercaya) adalah komponen lain yang berjalan dalam konteks aman yang bertanggung jawab untuk mengautentikasi sidik jari pengguna dan menghasilkan token otentikasi yang digunakan untuk membuktikan kepada TA Keymaster bahwa otentikasi dilakukan untuk pengguna tertentu pada titik waktu tertentu.

Arsitektur

Android Keystore API dan Keymaster HAL yang mendasarinya menyediakan satu set primitif kriptografis dasar namun memadai untuk memungkinkan implementasi protokol menggunakan kunci yang dikendalikan akses, yang didukung perangkat keras.

Keymaster HAL adalah pustaka yang disediakan secara dinamis dan disediakan oleh OEM yang digunakan oleh layanan Keystore untuk menyediakan layanan kriptografi yang didukung perangkat keras. Agar semuanya aman, implementasi HAL tidak melakukan operasi sensitif apa pun di ruang pengguna, atau bahkan di ruang kernel. Operasi sensitif didelegasikan ke prosesor yang aman yang dicapai melalui beberapa antarmuka kernel. Arsitektur yang dihasilkan terlihat seperti ini:

Akses ke Keymaster

Gambar 1. Akses ke Keymaster

Di dalam perangkat Android, "klien" dari Keymaster HAL terdiri dari beberapa lapisan (misalnya aplikasi, kerangka kerja, daemon Keystore), tetapi itu dapat diabaikan untuk keperluan dokumen ini. Ini berarti bahwa HAL API yang dijelaskan Keymaster adalah level rendah, digunakan oleh komponen platform internal, dan tidak terpapar ke pengembang aplikasi. API tingkat lebih tinggi dijelaskan di situs Pengembang Android .

Tujuan dari Hym Keymaster bukan untuk mengimplementasikan algoritma yang sensitif terhadap keamanan tetapi hanya untuk permintaan marshal dan unmarshal ke dunia yang aman. Format kawat ditentukan oleh implementasi.

Kompatibilitas dengan versi sebelumnya

HAL Keymaster 1 sepenuhnya tidak kompatibel dengan HAL yang dirilis sebelumnya, misalnya Keymaster 0.2 dan 0.3. Untuk memfasilitasi interoperabilitas pada perangkat yang menjalankan Android 5.0 dan sebelumnya yang diluncurkan dengan Keymaster HAL yang lebih lama, Keystore menyediakan adaptor yang mengimplementasikan Keymaster 1 HAL dengan panggilan ke perpustakaan perangkat keras yang ada. Hasilnya tidak dapat menyediakan berbagai fungsionalitas di HAL Keymaster 1. Secara khusus, ini hanya mendukung algoritma RSA dan ECDSA, dan semua penegakan otorisasi utama dilakukan oleh adaptor, di dunia yang tidak aman.

Keymaster 2 selanjutnya menyederhanakan antarmuka HAL dengan menghapus metode get_supported_* dan memungkinkan metode finish() menerima input. Ini mengurangi jumlah perjalanan bolak-balik ke TEE dalam kasus di mana input tersedia sekaligus, dan menyederhanakan implementasi dekripsi AEAD.

Di Android 8.0, Keymaster 3 beralih dari HAL struktur C gaya lama ke antarmuka C ++ HAL yang dihasilkan dari definisi dalam Hardware Interface Definition Language (HIDL). Implementasi HAL gaya baru dibuat dengan IKeymasterDevice kelas IKeymasterDevice dihasilkan dan mengimplementasikan metode virtual murni. Sebagai bagian dari perubahan, banyak tipe argumen telah berubah, meskipun tipe dan metode memiliki korespondensi satu-ke-satu dengan tipe lama dan metode struct HAL.

Gambaran umum HIDL

Bahasa Definisi Antarmuka Perangkat Keras (HIDL) menyediakan mekanisme independen-bahasa implementasi untuk menentukan antarmuka perangkat keras. Perkakas HIDL saat ini mendukung pembuatan antarmuka C ++ dan Java. Diharapkan bahwa sebagian besar pelaksana Lingkungan Eksekusi Tepercaya (TEE) akan menemukan alat C ++ lebih nyaman, jadi dokumen ini hanya membahas representasi C ++.

Antarmuka HIDL terdiri dari serangkaian metode, dinyatakan sebagai:

  methodName( INPUT ARGUMENTS ) generates ( RESULT ARGUMENTS );

Ada berbagai jenis yang telah ditentukan, dan HAL dapat menentukan jenis enumerasi dan struktur baru. Untuk detail lebih lanjut tentang HIDL, lihat bagian Referensi .

Contoh metode dari Keymaster 3 IKeymasterDevice.hal adalah:

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

Ini setara dengan yang berikut dari 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);

Dalam versi HIDL, argumen dev dihapus, karena itu implisit. Argumen params bukan lagi struct yang berisi pointer yang mereferensikan array objek key_parameter_t , tetapi vec (vektor) yang berisi objek KeyParameter . Nilai-nilai kembali tercantum dalam klausa " generates ", termasuk vektor nilai uint8_t untuk gumpalan kunci.

Metode virtual C ++ yang dihasilkan oleh kompiler HIDL adalah:

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

Di mana generate_cb adalah penunjuk fungsi yang didefinisikan sebagai:

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

Artinya, generate_cb adalah fungsi yang mengambil nilai kembali yang tercantum dalam klausa menghasilkan. Kelas implementasi HAL menimpa metode generateKey ini dan memanggil pointer fungsi generate_cb untuk mengembalikan hasil operasi ke pemanggil. Perhatikan panggilan fungsi pointer sinkron . Pemanggil memanggil generateKey dan generateKey memanggil pointer fungsi yang disediakan, yang mengeksekusi sampai selesai, mengembalikan kontrol ke implementasi generateKey , yang kemudian kembali ke pemanggil.

Untuk contoh terperinci, lihat implementasi default di hardware/interfaces/keymaster/3.0/default/KeymasterDevice.cpp . Implementasi default menyediakan kompatibilitas ke belakang untuk perangkat dengan HALS keymaster0 gaya lama, keymaster1, atau keymaster2.