Bezpieczny sposób przechowywania kluczy prywatnych w aplikacji na Androida

Dec 21 2020

Jaki byłby najbardziej odpowiedni sposób przechowywania kluczy prywatnych do podpisywania kodów kreskowych w aplikacji na Androida? Prawdopodobnie większość ekspertów tutaj powie - po prostu nie rób tego, bo to niebezpieczne ...

Chciałbym jednak zrozumieć poziom „niepewności” i zagrożeń dla proponowanych rozwiązań.

PS Commodity Smartphones do założenia.

PS możemy niezbyt często wymieniać klucze. Interfejs API zaplecza aplikacji można zaprojektować według potrzeb. Jednak stałe połączenie z Internetem i warianty logowania po stronie serwera nie są możliwe.

Odpowiedzi

28 defalt Dec 21 2020 at 22:40

Wszystkie urządzenia z systemem Android 7+ są wyposażone w Trusted Execution Environment (TEE) jako obowiązkowy wymóg licencjonowania aplikacji Google. Jest to magazyn kluczy wspierany sprzętowo, który zapewnia izolowaną pamięć masową i przetwarzanie danych dla kryptograficznych obiektów blob. W układach SoC Qualcomm Snapdragon i Samsung Exynos TEE jest oparty na ARM Trustzone . Niektóre urządzenia, takie jak Pixel i iPhone, mają własny dyskretny TEE (chip Google Titan M i chip T2 firmy Apple), który nazywa się strongbox . Dyskretne TEE są bardziej izolowane niż ARM Trustzone i niezależne od używanego SoC.

Możesz użyć interfejsów API dostawcy magazynu kluczy systemu Android do

  • generować klucze prywatne

  • generować tajne klucze

  • podpisać i zweryfikować dane

  • importuj zaszyfrowane klucze

  • uwierzytelnij użytkownika w celu użycia klucza

  • Weryfikuj pary kluczy z zabezpieczeniem sprzętowym za pomocą atestacji klucza

Każdy klucz przechowywany w magazynie kluczy może mieć ustawione następujące parametry:

  • alias - służy do identyfikacji klucza.
  • rozmiar klucza (API 23).
  • cel - szyfrowanie / deszyfrowanie (API 23).
  • tryb szyfrowania, algorytm i wypełnienie (API 23).
  • czy klucz powinien zostać uwierzytelniony w magazynie kluczy przed użyciem? (API 23).
  • czas, przez jaki klucz może być używany po pomyślnym uwierzytelnieniu (API 23).
  • czy klucz powinien zostać unieważniony przy nowej rejestracji odcisku palca? (API 24)
  • czy magazyn kluczy powinien wymagać odblokowania ekranu przed wykonaniem operacji kryptograficznych? (API 28)
  • czy klucz powinien być chroniony sprzętowym modułem bezpieczeństwa StrongBox? (API 28)

Możesz go również użyć do szyfrowania tokenów uwierzytelniających do logowania, przechowywania haseł i szyfrowania klucza, który szyfruje duże poufne dane Twojej aplikacji.


„czy klucz powinien być chroniony przez sprzętowy moduł bezpieczeństwa StrongBox? (API 28)” wydaje się być bardzo ważny z punktu widzenia ogólnego poziomu bezpieczeństwa.

W przypadku Androida 9+ aplikacje mogą ustawić preferencje dotyczące przechowywania kluczy w sejfie, dzwoniąc setIsStrongBoxBacked(true). Jeśli zgłosi, StrongBoxUnavailableExceptionaplikacje powinny wrócić do magazynu kluczy wspieranego sprzętowo. Strongbox jest odporny na krytyczne luki kanału bocznego w procesorze SoC, które mogą wpływać na magazyn kluczy wspierany sprzętowo. Bezpieczeństwo magazynu kluczy wspieranego sprzętowo spada na producenta chipów SoC: „dziura” w mobilnym sejfie Qualcomm Secure World wyciekła poufne dane .

Najlepsze praktyki dotyczące bezpieczeństwa sprzętu zalecają StrongBox Keymaster . Moduł zawiera:

  • Własny procesor
  • Bezpieczne przechowywanie
  • Prawdziwy generator liczb losowych.
  • Dodatkowe mechanizmy przeciwdziałające manipulowaniu pakietami i nieautoryzowanemu ładowaniu aplikacji.

System plików kluczy Android

Jak bezpieczne jest uwierzytelnianie Android Keystore? (Nieaktualne, opublikowane przed wydaniem Androida 10)