Google 致力于为黑人社区推动种族平等。查看具体举措
Bu sayfa, Cloud Translation API ile çevrilmiştir.
Switch to English

Donanım destekli Anahtar Deposu

Çip üzerindeki bir sistemde (SoC) güvenilir bir yürütme ortamının kullanılabilirliği, Android cihazlara Android işletim sistemine, platform hizmetlerine ve hatta üçüncü taraf uygulamalara donanım destekli, güçlü güvenlik hizmetleri sağlama fırsatı sunar. Android'e özgü uzantıları arayan geliştiriciler, android.security.keystore adresine gitmelidir.

Android 6.0'dan önce, Android zaten Keymaster Donanım Soyutlama Katmanı'nın (HAL) 0.2 ve 0.3 sürümleri tarafından sağlanan basit, donanım destekli bir kripto hizmetleri API'sine sahipti. Anahtar deposu, dijital imzalama ve doğrulama işlemlerinin yanı sıra asimetrik imzalama anahtar çiftlerinin oluşturulması ve içe aktarılmasını sağladı. Bu zaten birçok cihazda uygulanmaktadır, ancak yalnızca bir imza API'siyle kolayca gerçekleştirilemeyen birçok güvenlik hedefi vardır. Android 6.0'daki Keystore, daha geniş bir özellik yelpazesi sağlamak için Keystore API'yi genişletir.

Android 6.0'da, Anahtar Deposu simetrik şifreleme temelleri , AES ve HMAC ile donanım destekli anahtarlar için bir erişim kontrol sistemi ekledi. Erişim denetimleri, anahtar oluşturma sırasında belirlenir ve anahtarın kullanım ömrü boyunca uygulanır. Anahtarlar, yalnızca kullanıcı kimlik doğrulamasından sonra ve yalnızca belirli amaçlar için veya belirtilen şifreleme parametreleriyle kullanılabilir olacak şekilde sınırlandırılabilir. Daha fazla bilgi için Yetkilendirme Etiketleri ve İşlevler sayfalarına bakın.

Android 6.0'daki Keystore, kriptografik ilkellerin aralığını genişletmenin yanı sıra şunları ekler:

  • Anahtarların kötüye kullanılması nedeniyle güvenlik tehlikesi riskini azaltmak için anahtar kullanımının sınırlandırılmasına izin veren bir kullanım kontrol şeması
  • Anahtarların belirli kullanıcılar, istemciler ve tanımlı bir zaman aralığı için kısıtlanmasını sağlamak için bir erişim kontrol şeması

Android 7.0'da Keymaster 2, anahtar onayı ve sürüm bağlama için destek ekledi. Anahtar doğrulama , anahtarın güvenli donanımdaki varlığını ve yapılandırmasını uzaktan doğrulanabilir kılmak için anahtarın ve erişim kontrollerinin ayrıntılı bir açıklamasını içeren genel anahtar sertifikaları sağlar.

Sürüm bağlama , anahtarları işletim sistemine ve yama düzeyi sürümüne bağlar. Bu, sistemin eski bir sürümünde veya TEE yazılımında bir zayıflık keşfeden bir saldırganın, bir cihazı savunmasız sürüme geri almasını ve daha yeni sürümle oluşturulan anahtarları kullanmasını sağlar. Ayrıca, daha yeni bir sürüme veya yama düzeyine yükseltilmiş bir cihazda belirli bir sürüme ve yama düzeyine sahip bir anahtar kullanıldığında, kullanılmadan önce anahtar yükseltilir ve anahtarın önceki sürümü geçersiz kılınır. Cihaz yükseltilirken, tuşlar cihazla birlikte "kilitlenir", ancak cihazın önceki bir sürüme döndürülmesi tuşların kullanılamaz hale gelmesine neden olur.

Android 8.0'da Keymaster 3, eski tarz C yapısı Donanım Soyutlama Katmanından (HAL) yeni Donanım Arayüzü Tanımlama Dili'ndeki (HIDL) bir tanımdan oluşturulan C ++ HAL arayüzüne geçiş yaptı. Değişikliğin bir parçası olarak, türlerin ve yöntemlerin eski türlerle ve HAL yapı yöntemleriyle bire bir uyuşmasına rağmen, argüman türlerinin çoğu değişti. Daha fazla ayrıntı için İşlevler sayfasına bakın.

Bu arayüz revizyonuna ek olarak, Android 8.0, Keymaster 2'nin doğrulama özelliğini kimlik doğrulamasını destekleyecek şekilde genişletir. Kimlik doğrulaması, aygıt seri numarası, ürün adı ve telefon kimliği (IMEI / MEID) gibi donanım tanımlayıcılarını güçlü bir şekilde doğrulamak için sınırlı ve isteğe bağlı bir mekanizma sağlar. Bu eklemeyi uygulamak için, ASN.1 onay şemasını kimlik doğrulaması eklemek için değiştirin. Keymaster uygulamaları, ilgili veri öğelerini almak için güvenli bir yol bulmanın yanı sıra, özelliği güvenli ve kalıcı olarak devre dışı bırakmak için bir mekanizma tanımlamalıdır.

Android 9'da güncellemeler şunları içerir:

  • Keymaster 4'e güncelleme
  • Gömülü Güvenli Öğeler için destek
  • Güvenli anahtar içe aktarma desteği
  • 3DES şifreleme desteği
  • Boot.img ve system.img'nin bağımsız güncellemelere izin vermek için ayrı ayrı sürümleri ayarlaması için sürüm bağlamadaki değişiklikler

Sözlük

Aşağıda, Keystore bileşenlerine ve bunların ilişkilerine hızlı bir genel bakış yer almaktadır.

AndroidKeystore , anahtar deposu işlevlerine erişmek için uygulamalar tarafından kullanılan Android Framework API ve bileşendir. Standart Java Şifreleme Mimarisi API'lerinin bir uzantısı olarak uygulanır ve uygulamanın kendi işlem alanında çalışan Java kodundan oluşur. AndroidKeystore , Anahtar deposu davranışına yönelik uygulama isteklerini anahtar deposu arka plan programına AndroidKeystore yerine getirir.

Anahtar deposu arka plan programı , bir Binder API aracılığıyla tüm Anahtar deposu işlevlerine erişim sağlayan bir Android sistem arka plan programıdır. Anahtar bloblarını depolamaktan sorumludur, anahtar blobları, anahtar bloblarını depolamak için şifrelenir, böylece anahtar deposu onu saklayabilir ama kullanamaz veya açığa çıkaramaz.

keymasterd , Keymaster TA'ya erişim sağlayan bir HIDL sunucusudur. (Bu ad standart değildir ve kavramsal amaçlar içindir.)

Keymaster TA (güvenilir uygulama), güvenli bir bağlamda çalışan, çoğunlukla bir ARM SoC üzerindeki TrustZone'da çalışan, tüm güvenli Keystore işlemlerini sağlayan, ham anahtar materyaline erişebilen, anahtarlar üzerindeki tüm erişim kontrol koşullarını doğrulayan yazılımdır. , vb.

LockSettingsService , hem parola hem de parmak izi olmak üzere kullanıcı kimlik doğrulamasından sorumlu Android sistem bileşenidir. Anahtar Deposunun bir parçası değildir, ancak birçok Anahtar Deposu anahtar işlemi kullanıcı kimlik doğrulaması gerektirdiğinden ilgilidir. LockSettingsService , anahtar deposu arka plan programına sağladığı ve nihayetinde Keymaster TA uygulaması tarafından tüketilen kimlik doğrulama belirteçlerini elde etmek için Gatekeeper TA ve Fingerprint TA ile etkileşime girer.

Gatekeeper TA (güvenilir uygulama), kullanıcı şifrelerinin doğrulanmasından ve Keymaster TA'ya belirli bir zamanda belirli bir kullanıcı için bir kimlik doğrulamasının yapıldığını kanıtlamak için kullanılan kimlik doğrulama belirteçlerinin oluşturulmasından sorumlu olan güvenli bağlamda çalışan başka bir bileşendir.

Parmak izi TA (güvenilir uygulama), Keymaster TA'ya belirli bir zamanda belirli bir kullanıcı için bir kimlik doğrulaması yapıldığını kanıtlamak için kullanılan kullanıcı parmak izlerinin doğrulanmasından ve kimlik doğrulama belirteçlerinin oluşturulmasından sorumlu olan güvenli bağlamda çalışan başka bir bileşendir.

Mimari

Android Anahtar Deposu API'si ve temeldeki Keymaster HAL, erişim kontrollü, donanım destekli anahtarlar kullanılarak protokollerin uygulanmasına izin vermek için temel ancak yeterli bir kriptografik ilkeler kümesi sağlar.

Keymaster HAL, donanım destekli şifreleme hizmetleri sağlamak için Anahtar Deposu hizmeti tarafından kullanılan, OEM tarafından sağlanan, dinamik olarak yüklenebilir bir kitaplıktır. İşleri güvende tutmak için, HAL uygulamaları kullanıcı alanında veya hatta çekirdek alanında herhangi bir hassas işlem gerçekleştirmez. Hassas işlemler, bazı çekirdek arabirimleriyle ulaşılan güvenli bir işlemciye devredilir. Ortaya çıkan mimari şuna benzer:

Keymaster'a erişim

Şekil 1. Keymaster'a Erişim

Bir Android cihaz içinde, Keymaster HAL'ın "istemcisi" birden çok katmandan (örn. Uygulama, çerçeve, Keystore arka plan programı) oluşur, ancak bu, bu belgenin amaçları doğrultusunda göz ardı edilebilir. Bu, açıklanan Keymaster HAL API'sinin düşük seviyeli olduğu, platformun dahili bileşenleri tarafından kullanıldığı ve uygulama geliştiricilere açık olmadığı anlamına gelir. Üst düzey API, Android Geliştirici sitesinde açıklanmıştır .

Keymaster HAL'ın amacı, güvenliğe duyarlı algoritmaları uygulamak değil, yalnızca istekleri güvenli dünyaya sıralamak ve unmarshal'ı kaldırmaktır. Kablo biçimi uygulama tanımlıdır.

Önceki sürümlerle uyumluluk

Keymaster 1 HAL, daha önce yayımlanan HAL'lerle, örneğin Keymaster 0.2 ve 0.3 ile tamamen uyumsuzdur. Anahtar deposu, eski Keymaster HAL'lerle başlatılan Android 5.0 ve önceki sürümleri çalıştıran cihazlarda birlikte çalışabilirliği kolaylaştırmak için, Keymaster 1 HAL'i mevcut donanım kitaplığına yapılan çağrılarla uygulayan bir adaptör sağlar. Sonuç, Keymaster 1 HAL'de tüm işlevselliği sağlayamaz. Özellikle, yalnızca RSA ve ECDSA algoritmalarını destekler ve tüm anahtar yetkilendirme uygulaması, güvenli olmayan dünyada adaptör tarafından gerçekleştirilir.

Keymaster 2, get_supported_* yöntemlerini kaldırarak ve finish() yönteminin girişi kabul etmesine izin vererek HAL arayüzünü daha da basitleştirdi. Bu, girişin aynı anda mevcut olduğu durumlarda TEE'ye gidiş dönüş sayısını azaltır ve AEAD şifre çözme uygulamasını basitleştirir.

Android 8.0'da Keymaster 3, eski tarz C yapısı HAL'den yeni Donanım Arayüzü Tanımlama Dili'ndeki (HIDL) bir tanımdan oluşturulan C ++ HAL arayüzüne geçiş yaptı. Oluşturulan IKeymasterDevice sınıfının alt sınıflara IKeymasterDevice ve saf sanal yöntemlerin uygulanmasıyla yeni bir stil HAL uygulaması oluşturulur. Değişikliğin bir parçası olarak, türlerin ve yöntemlerin eski türler ve HAL yapı yöntemleriyle bire bir eşleşmesine rağmen, argüman türlerinin çoğu değişmiştir.

HIDL'ye genel bakış

Donanım Arayüzü Tanımlama Dili (HIDL), donanım arayüzlerini belirlemek için dilden bağımsız bir uygulama mekanizması sağlar. HIDL araçları şu anda C ++ ve Java arayüzlerinin oluşturulmasını desteklemektedir. Çoğu Güvenilir Yürütme Ortamı (TEE) uygulayıcısının C ++ araçlarını daha uygun bulması beklenir, bu nedenle bu belge yalnızca C ++ temsilini tartışır.

HIDL arayüzleri şu şekilde ifade edilen bir dizi yöntemden oluşur:

  methodName(INPUT ARGUMENTS) generates (RESULT ARGUMENTS);

Önceden tanımlanmış çeşitli türler vardır ve HAL'ler yeni numaralandırılmış ve yapı türlerini tanımlayabilir. HIDL hakkında daha fazla ayrıntı için, Referans bölümüne bakın .

IKeymasterDevice.hal 3 IKeymasterDevice.hal örnek bir yöntem şudur:

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

Bu, keymaster2 HAL'den aşağıdakilere eşdeğerdir:

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 sürümünde, dev bağımsız değişkeni, örtük olduğu için kaldırılır. params argüman artık bir dizi referans işaretçi ihtiva eden bir yapı olan key_parameter_t nesneler, ancak vec ihtiva eden (vektör) KeyParameter nesneleri. Dönüş değerleri, anahtar uint8_t için uint8_t değerlerinin bir vektörü dahil olmak üzere " generates " yan tümcesinde listelenir.

HIDL derleyicisi tarafından oluşturulan C ++ sanal yöntemi:

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

Burada generate_cb bir işlev işaretçisi olarak tanımlanır:

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

Yani, generate_cb , generate yan tümcesinde listelenen dönüş değerlerini alan bir işlevdir. HAL uygulama sınıfı, bu generateKey yöntemini geçersiz kılar ve işlemin sonucunu çağırana döndürmek için generate_cb işlev işaretçisini çağırır. İşlev işaretçisi çağrısının eşzamanlı olduğuna dikkat edin. Çağıran, generateKey çağırır ve generateKey , tamamlanana kadar çalıştıran, denetimi generateKey uygulamasına döndüren ve ardından çağırana geri dönen sağlanan işlev işaretçisini çağırır.

Ayrıntılı bir örnek için, hardware/interfaces/keymaster/3.0/default/KeymasterDevice.cpp varsayılan uygulamaya bakın. Varsayılan uygulama, eski stil keymaster0, keymaster1 veya keymaster2 HALS'ye sahip cihazlar için geriye dönük uyumluluk sağlar.