Özellikler

Bu sayfada, temel KeyMint (veya Keymaster) uygulaması tarafından sağlanan Android Keystore'un kriptografik özellikleri hakkında bilgiler yer alır.

Temel şifreleme işlemleri

Anahtar mağazası aşağıdaki işlem kategorilerini sağlar:

  • Anahtar oluşturma işlemi sonucunda yalnızca güvenli ortamın erişebildiği özel veya gizli anahtar materyali elde edilir. İstemciler aşağıdaki yöntemlerle anahtar oluşturabilir:
    • Yeni anahtar oluşturma
    • Şifrelenmemiş anahtar materyalinin içe aktarılması
    • Şifrelenmiş anahtar materyalini içe aktarma
  • Anahtar tasdiki: Asimetrik anahtar oluşturma işlemi, anahtar çiftinin ortak anahtar bölümünü barındıran bir sertifika oluşturur. Bu sertifika isteğe bağlı olarak anahtarın meta verileri ve cihazın durumu hakkında da bilgi içerir. Bu bilgilerin tümü, güvenilir bir köke geri dönen bir anahtar zinciri tarafından imzalanır.
  • Şifreleme işlemleri:
    • Simetrik şifreleme ve şifre çözme (AES, 3DES)
    • Asimetrik şifre çözme (RSA)
    • Asimetrik imzalama (ECDSA, RSA)
    • Simetrik imzalama ve doğrulama (HMAC)
    • Asimetrik anahtar anlaşması (ECDH)

Keystore ve KeyMint'in, asimetrik anahtarlar için ortak anahtar işlemlerini işlemediğini unutmayın.

Amaç, mod ve dolgu gibi protokol öğeleri ile erişim denetimi kısıtlamaları, anahtarlar oluşturulurken veya içe aktarılırken belirtilir ve anahtara kalıcı olarak bağlanır. Böylece anahtarın başka bir şekilde kullanılamamasını sağlar.

KeyMint uygulaması tarafından desteklenmesi gereken temel öğeler ve modlar, IKeyMintDevice HAL arayüzü spesifikasyonunda açıklanmaktadır.

Temel KeyMint uygulaması, anahtar oluşturma ve rastgele dolgu veya başlatma vektörleri (IV'ler) oluşturmayı desteklemek için rastgele sayı oluşturma işlemi yapmalıdır. Android sistemi, bunu desteklemek için KeyMint uygulamasına düzenli olarak ek entropi sağlar.

Anahtar erişim denetimi

Cihazdan hiçbir zaman çıkarılamayan donanım tabanlı anahtarlar, bir saldırgan bunları istediği zaman kullanabiliyorsa fazla güvenlik sağlamaz (ancak çıkarılabilen anahtarlardan daha güvenlidir). Bu nedenle, anahtar deposunun erişim denetimlerini uygulaması çok önemlidir.

Erişim denetimleri, etiket/değer çiftlerinin "yetkilendirme listesi" olarak tanımlanır. Yetkilendirme etiketleri 32 bit tam sayılardır ve değerler çeşitli türlerdedir. Bazı etiketler, birden fazla değer belirtmek için tekrarlanabilir. Bir etiketin tekrarlanıp tekrarlanamayacağı KeyMint (eski adıyla Keymaster) HAL arayüzünde belirtilir.

Desteklenen etiket değerleri Tag.aidl dosyasında tanımlanır ve her biri, ilişkili değerin türünü (ör. tam sayı veya bayt) ve birden fazla desteklenen değer belirtmek için tekrarlanıp tekrarlanmayacağını belirten bir TagType ile ilişkilendirilir.

KeyMint bir anahtar oluşturduğunda, arayan anahtar için bir yetkilendirme listesi belirtir. Bu liste, ek kısıtlamalar eklemek için Keystore ve KeyMint tarafından değiştirilir ve temel KeyMint uygulaması, nihai yetkilendirme listesini döndürülen anahtar kümesine kodlar. Kodlanmış yetkilendirme listesi, anahtar kümesine kriptografik olarak bağlanır. Böylece, yetkilendirme listesini değiştirmeye yönelik tüm girişimler (sıralama dahil) kriptografik işlemler için kullanılamayan geçersiz bir anahtar kümesiyle sonuçlanır.

Donanım ve yazılım yaptırımı

Tüm güvenli donanım uygulamaları aynı özellikleri içermez. KeyMint, çeşitli yaklaşımları desteklemek için sırasıyla güvenli ve güvenli olmayan erişim denetimi yaptırımı ya da donanım ve yazılım yaptırımı arasında ayrım yapar.

Bu, KeyMint API'de KeyCharacteristics türündeki securityLevel alanıyla gösterilir. Güvenli donanım, yetkilendirmeleri KeyCharacteristics'e yerleştirmekten sorumludur. Bu işlem, donanımın zorunlu kılmasına bağlı olarak uygun güvenlik düzeyinde gerçekleştirilir. Bu bilgiler, asimetrik anahtarların doğrulama kayıtlarında da gösterilir: SecurityLevel::TRUSTED_ENVIRONMENT veya SecurityLevel::STRONGBOX için anahtar özellikleri hardwareEnforced listesinde, SecurityLevel::SOFTWARE veya SecurityLevel::KEYSTORE için özellikler ise softwareEnforced listesinde gösterilir.

Örneğin, bir anahtarın kullanılabileceği tarih ve saat aralığıyla ilgili kısıtlamalar, tarih ve saat bilgilerine güvenilir erişimi olmadığı için güvenli ortam tarafından genellikle zorunlu kılınmaz. Sonuç olarak, Tag::ORIGINATION_EXPIRE_DATETIME gibi yetkilendirmeler Android'de Keystore tarafından zorunlu kılınmakta ve SecurityLevel::KEYSTORE değerine sahiptir.

Anahtarların ve yetkilendirmelerinin donanım destekli olup olmadığını belirleme hakkında daha fazla bilgi için Anahtar doğrulaması başlıklı makaleyi inceleyin.

Şifreleme mesajı oluşturma yetkileri

İlişkili anahtarı kullanan işlemlerin kriptografik özelliklerini tanımlamak için aşağıdaki etiketler kullanılır:

  • Tag::ALGORITHM
  • Tag::KEY_SIZE
  • Tag::BLOCK_MODE
  • Tag::PADDING
  • Tag::CALLER_NONCE
  • Tag::DIGEST
  • Tag::MGF_DIGEST

Aşağıdaki etiketler tekrarlanabilir. Yani tek bir anahtarla birden fazla değer ilişkilendirilebilir:

  • Tag::BLOCK_MODE
  • Tag::PADDING
  • Tag::DIGEST
  • Tag::MGF_DIGEST

Kullanılacak değer, işlem sırasında belirtilir.

Amaç

Anahtarlar, Tag::PURPOSE etiketiyle bir veya daha fazla yetkilendirme girişi olarak ifade edilen ve nasıl kullanılabileceklerini tanımlayan ilişkili bir amaç grubuna sahiptir. Amaç, KeyPurpose.aidl bölümünde tanımlanır.

Bazı amaç değeri kombinasyonlarının güvenlik sorunları oluşturduğunu unutmayın. Örneğin, hem şifreleme hem de imzalama için kullanılabilen bir RSA anahtarı, sistemi rastgele verilerin şifresini çözmeye ikna edebilen bir saldırganın imza oluşturmasına olanak tanır.

Anahtar içe aktarma

KeyMint aşağıdakilerin içe aktarılmasını destekler:

  • DER kodlamalı PKCS#8 biçiminde asimetrik anahtar çiftleri (şifre tabanlı şifreleme olmadan)
  • Ham bayt olarak simetrik anahtarlar

İçe aktarılan anahtarların güvenli şekilde oluşturulan anahtarlardan ayırt edilebilmesi için Tag::ORIGIN, uygun anahtar yetkilendirme listesine dahil edilir. Örneğin, güvenli donanımda oluşturulan bir anahtar için KeyOrigin::GENERATED değerine sahip Tag::ORIGIN, anahtar özelliklerinin hw_enforced listesinde bulunur. Güvenli donanıma aktarılan bir anahtar için ise KeyOrigin::IMPORTED değeri bulunur.

Kullanıcı kimlik doğrulaması

Güvenli KeyMint uygulamaları kullanıcı kimlik doğrulamasını uygulamaz ancak bunu yapan diğer güvenilir uygulamalara bağlıdır. Bu uygulamaların uyguladığı arayüz için Gatekeeper sayfasına bakın.

Kullanıcı kimlik doğrulama şartları iki etiket grubu aracılığıyla belirtilir. İlk grup, hangi kimlik doğrulama yöntemlerinin anahtarın kullanılmasına izin verdiğini belirtir:

  • Tag::USER_SECURE_ID, anahtarın kullanımını açmak için güvenli kimlik doğrulama jetonunda sağlanan güvenli kullanıcı kimliğini belirten 64 bitlik bir sayısal değere sahiptir. Tekrarlanan anahtar, değerlerden herhangi biri güvenli bir kimlik doğrulama jetonunda sağlanırsa kullanılabilir.

İkinci grup, kullanıcının kimliğinin doğrulanıp doğrulanmaması gerektiğini ve ne zaman doğrulanması gerektiğini belirtir. Bu etiketlerden hiçbiri mevcut değilse ancak Tag::USER_SECURE_ID varsa anahtarın her kullanımı için kimlik doğrulaması gerekir.

  • Tag::NO_AUTHENTICATION_REQUIRED, anahtara erişim hâlâ sahip uygulamayla (ve erişim izni verdiği uygulamalarla) kısıtlı olsa da kullanıcı kimlik doğrulamasının gerekmediğini gösterir.
  • Tag::AUTH_TIMEOUT, anahtar kullanımına yetki vermek için kullanıcı kimlik doğrulamasının ne kadar yeni olması gerektiğini saniye cinsinden belirten bir sayısal değerdir. Zaman aşımları yeniden başlatma işlemlerini etkilemez. Yeniden başlatma işleminden sonra tüm kimlik doğrulamaları geçersiz kılınır. Zaman aşımı, kimlik doğrulamanın her önyükleme işleminde bir kez gerekli olduğunu belirtmek için büyük bir değere ayarlanabilir (2^32 saniye yaklaşık 136 yıldır; Android cihazların bundan daha sık yeniden başlatıldığı varsayılır).

Kilidi açık bir cihaz kullanılmasını zorunlu kıl

Tag::UNLOCKED_DEVICE_REQUIRED içeren anahtarlar yalnızca cihazın kilidi açıkken kullanılabilir. Ayrıntılı anlamlar için KeyProtection.Builder#setUnlockedDeviceRequired(boolean) başlıklı makaleyi inceleyin.

UNLOCKED_DEVICE_REQUIRED, KeyMint tarafından değil, Keystore tarafından uygulanır. Ancak Android 12 ve sonraki sürümlerde Anahtar Deposu, cihaz kilitliyken Anahtar Deposu'nun güvenliği ihlal edilse bile çoğu durumda UNLOCKED_DEVICE_REQUIRED anahtarlarının kullanılamamasını sağlamak için cihaz kilitliyken UNLOCKED_DEVICE_REQUIRED anahtarlarını kriptografik olarak korur.

Anahtar Kasası, bu amaca ulaşmak için tüm UNLOCKED_DEVICE_REQUIRED anahtarlarını veritabanında depolamadan önce "süper şifreler" ve mümkün olduğunda cihaz kilitliyken süper şifreleme anahtarlarını (süper anahtarlar) yalnızca başarılı bir cihaz kilidi açma işlemiyle kurtarılabilecek şekilde korur. ("Süper şifreleme" terimi, bu şifreleme katmanı KeyMint'in tüm anahtarlara zaten uyguladığı şifreleme katmanına ek olarak uygulandığı için kullanılır.)

Her kullanıcı (profiller dahil) UNLOCKED_DEVICE_REQUIRED ile ilişkili iki süper anahtara sahiptir:

  • UnlockedDeviceRequired simetrik süper anahtarı. Bu, bir AES‑256‑GCM anahtarıdır. Cihazın kilidi kullanıcı için açıkken içe aktarılan veya oluşturulan UNLOCKED_DEVICE_REQUIRED anahtarlarını şifreler.
  • UnlockedDeviceRequired asimetrik süper anahtarı. Bu bir ECDH P‑521 anahtar çiftidir. Cihaz kilitliyken kullanıcı için içe aktarılan veya oluşturulan UNLOCKED_DEVICE_REQUIRED anahtarları şifreler. Bu asimetrik anahtarla şifrelenen anahtarlar, ilk kullanımda (yalnızca cihazın kilidi açıkken gerçekleşebilir) simetrik anahtarla yeniden şifrelenir.

Anahtar Deposu, bu süper anahtarları kullanıcı oluşturulurken oluşturur ve kullanıcının sentetik şifresiyle şifrelenmiş olarak veritabanında depolar. Bu sayede PIN, desen veya şifre eşdeğeri kullanılarak kurtarılabilir.

Anahtar deposu, bu süper anahtarları bellekte önbelleğe alarak UNLOCKED_DEVICE_REQUIRED anahtarlarıyla çalışmasını sağlar. Ancak bu anahtarların gizli kısımlarını yalnızca cihazın kilidi kullanıcı için açıkken önbelleğe almaya çalışır. Cihaz kullanıcı için kilitlendiğinde Keystore, mümkünse bu süper anahtarların gizli bölümlerinin önbelleğe alınmış kopyasını sıfırlar. Daha açık belirtmek gerekirse, cihaz kullanıcı için kilitlendiğinde Keystore, kullanıcının UnlockedDeviceRequired süper anahtarları için üç koruma seviyesinden birini seçip uygular:

  • Kullanıcı yalnızca PIN, desen veya şifreyi etkinleştirdiyse Keystore, önbelleğe alınmış süper anahtarlarının gizli kısımlarını sıfırlar. Bu sayede süper anahtarlar yalnızca veritabanındaki şifrelenmiş kopya üzerinden kurtarılabilir. Bu kopyanın şifresi ise yalnızca PIN, desen veya şifre eşdeğeri ile çözülebilir.
  • Kullanıcının yalnızca 3. sınıf ("güçlü") biyometrisi varsa ve PIN, desen veya şifre etkinse Anahtar Deposu, PIN, desen veya şifre eşdeğerine alternatif olarak süper anahtarların kullanıcının kayıtlı 3. sınıf biyometrilerinden (genellikle parmak izi) herhangi biri tarafından kurtarılabilmesini sağlar. Bunu yapmak için yeni bir AES-256-GCM anahtarı oluşturur, süper anahtarların gizli kısımlarını bu anahtarla şifreler, AES-256-GCM anahtarını KeyMint'e biyometriyle bağlı bir anahtar olarak aktarır (bu anahtar için son 15 saniye içinde biyometri kimlik doğrulamasının başarılı olması gerekir) ve tüm bu anahtarların şifrelenmemiş kopyalarını sıfıra getirir.
  • Kullanıcının 1. sınıf ("kolaylık") biyometrik, 2. sınıf ("zayıf") biyometrik veya etkin kilit açma güven aracısı varsa Keystore, süper anahtarları açık metinde önbelleğe alır. Bu durumda, UNLOCKED_DEVICE_REQUIRED anahtarları için kriptografik güvenlik sağlanmaz. Kullanıcılar bu kilit açma yöntemlerini etkinleştirmeyerek bu daha az güvenli yedek yöntemden kaçınabilir. Bu kategorilere giren en yaygın kilit açma yöntemleri, birçok cihazda yüz tanıma kilidi ve eşlenen akıllı saatle kilit açmadır.

Cihazın kilidi kullanıcı için açıldığında Keystore, mümkünse kullanıcının UnlockedDeviceRequired süper anahtarlarını kurtarır. PIN, desen veya şifre eşdeğeri kilit açma işleminde, bu anahtarların veritabanında depolanan kopyasının şifresini çözer. Aksi takdirde, bu anahtarların biyometrik bağlı bir anahtarla şifrelenmiş bir kopyasının kaydedilip kaydedilmediğini kontrol eder ve kaydedilmişse şifresini çözmeye çalışır. Bu işlem yalnızca kullanıcının son 15 saniye içinde KeyMint tarafından zorunlu kılınan (Keystore tarafından değil) 3. sınıf bir biyometriyle kimliğini başarıyla doğrulaması durumunda başarılı olur.

İstemci bağlama

İstemci bağlama, bir anahtarın belirli bir istemci uygulamasıyla ilişkilendirilmesidir ve isteğe bağlı bir istemci kimliği ve bazı isteğe bağlı istemci verileri (sırasıyla Tag::APPLICATION_ID ve Tag::APPLICATION_DATA) aracılığıyla yapılır. Anahtar mağazası bu değerleri opak blob'lar olarak ele alır ve yalnızca anahtar oluşturma/içe aktarma sırasında sunulan blob'ların her kullanım için sunulmasını ve bayt bayt aynı olmasını sağlar. İstemci bağlama verileri KeyMint tarafından döndürülmez. Arayanın anahtarı kullanabilmesi için bu kodu bilmesi gerekir.

Bu özellik uygulamalara gösterilmez.

Son Geçerlilik Tarihi

Anahtar mağazası, anahtar kullanımını tarihe göre kısıtlamayı destekler. Anahtar geçerlilik başlangıcı ve anahtar geçerlilik bitiş tarihi bir anahtarla ilişkilendirilebilir. Mevcut tarih/saat geçerli aralık dışındaysa Keystore anahtar işlemlerini gerçekleştirmeyi reddeder. Anahtar geçerlilik aralığı, Tag::ACTIVE_DATETIME, Tag::ORIGINATION_EXPIRE_DATETIME ve Tag::USAGE_EXPIRE_DATETIME etiketleriyle belirtilir. "Oluşturma" ile "kullanım" arasındaki fark, anahtarın yeni bir şifrelenmiş metin/imza/vb. "oluşturmak" için mi yoksa mevcut bir şifrelenmiş metni/imzayı/vb. "kullanmak" için mi kullanıldığına bağlıdır. Bu ayrımın uygulamalara gösterilmediğini unutmayın.

Tag::ACTIVE_DATETIME, Tag::ORIGINATION_EXPIRE_DATETIME ve Tag::USAGE_EXPIRE_DATETIME etiketleri isteğe bağlıdır. Etiketler yoksa söz konusu anahtarın, iletilerin şifresini çözmek/doğrulamak için her zaman kullanılabileceği varsayılır.

Duvar saati zamanı güvenli olmayan dünya tarafından sağlandığından, süre sonu ile ilgili etiketler yazılım tarafından zorunlu kılınan listede yer alır.

Güven kökü bağlama

Anahtar mağazası, anahtarların bir güven köküne bağlanmasını gerektirir. Güven kökü, tercihen önyükleme yükleyici tarafından başlatma sırasında KeyMint güvenli donanımına sağlanan bir bit dizesidir. Bu bit dizesi, KeyMint tarafından yönetilen her anahtara kriptografik olarak bağlıdır.

Güven kökü, önyükleme resmindeki imzayı ve cihazın kilit durumunu doğrulamak için kullanılan ortak anahtarın karmasından oluşur. Herkese açık anahtar, farklı bir sistem görüntüsünün kullanılmasına izin verecek şekilde değiştirilirse veya kilit durumu değiştirilirse önceki güven kökü geri yüklenmediği ve bu anahtarla imzalanan bir sistem başlatılmadığı sürece önceki sistem tarafından oluşturulan KeyMint korumalı anahtarların hiçbiri kullanılamaz. Amaç, saldırgan tarafından yüklenen bir işletim sisteminin KeyMint anahtarlarını kullanmasını imkansız hale getirerek yazılımla zorunlu kılınan anahtar erişim denetimlerinin değerini artırmaktır.

Rastgele sayı üreteci için yeniden tohumlama

Güvenli donanım, anahtar materyali ve başlatma vektörleri (IV'ler) için rastgele sayılar oluşturduğundan ve donanım rastgele sayı oluşturucuları her zaman tam olarak güvenilir olmayabileceğinden KeyMint HAL, Keystore'un oluşturulan rastgele sayılara karıştırılan ek entropi sağlamasına olanak tanıyan bir arayüz sağlar.

Birincil tohum kaynağı olarak donanım rastgele sayı oluşturucu kullanın. Harici API üzerinden sağlanan başlangıç verileri, sayı oluşturmak için kullanılan tek rastgelelik kaynağı olamaz. Ayrıca, kullanılan karıştırma işleminin, başlangıç kaynaklarından herhangi biri tahmin edilemezse rastgele çıktının tahmin edilemez olmasını sağlaması gerekir.