2014-09-22 11 views
6

Obecnie pracuję nad aplikacją Android, która jest oparta na architekturze klient-serwer. Dla bezpieczeństwa danych używam pary kluczy Public-Private do szyfrowania danych i podpisywania. Używam AndroidKeyStore do przechowywania pary kluczy. Poniżej znajduje się kod, aby wygenerować parę kluczy:AndroidKeyStore wymazane po zmianie hasła urządzenia

KeyPairGeneratorSpec spec = new KeyPairGeneratorSpec.Builder(
     mContext) 
     .setAlias(mPrivateKeyAlias) 
     .setSubject(new X500Principal("CN=" + mPrivateKeyAlias)) 
     .setSerialNumber(
       BigInteger.valueOf(System.currentTimeMillis())) 
     .setStartDate(start.getTime()) 
     .setEndDate(end.getTime()).setKeySize(2048).build(); 

KeyPairGenerator kpGenerator = KeyPairGenerator.getInstance(
     "RSA", 
     "AndroidKeyStore"); 

kpGenerator.initialize(spec); 
// Key Pair will be saved in AndroidKeyStore 
KeyPair pair = kpGenerator.generateKeyPair(); 

Po wykonaniu tego kodu, kluczy releated plików (CERT i PKEY pliki) zostaną wygenerowane w '/ USER_0/data/misc/kluczy /' katalogu. Szyfruję dane wrażliwe na aplikacje, takie jak auth-token, i zapisuję je we wspólnym utworze ze względów bezpieczeństwa.

Ale teraz, gdy użytkownik zmienia hasło lub pin urządzenia, pliki magazynu kluczy są usuwane jako klucz główny używany do szyfrowania magazynu kluczy jest generowany przy użyciu poświadczeń urządzenia.

Teraz, aby rozwiązać ten problem, próbowałem zachować parę kluczy Public-Private w pamięci RAM i po zmianie hasła. Od onPasswordChanged (kontekście Context, Intent intent) sposób DeviceAdminReceiver, jestem wykonywania poniżej kodu:

KeyStore keyStore = KeyStore 
     .getInstance("AndroidKeyStore"); 
keyStore.load(null); 
keyStore.setKeyEntry(mPrivateKeyAlias, mPrivateKey.getPrivateKey(), 
     null, new Certificate[] { mPrivateKey.getCertificate() }); 

Ale po tym kodzie tylko CERT plik zostanie utworzony w '/data/misc/keystore/user_0/' katalogu i podczas deszyfrowania przy użyciu klucza prywatnego, dając jakiś nieprawidłowy podpis błąd.

Udostępniam również mój klucz publiczny z serwerem, zaszyfrowane dane kluczem prywatnym, więc utworzenie nowej pary kluczy nie byłoby lepszym rozwiązaniem.

Jak mogę zachować parę publicznych kluczy prywatnych po zmianie hasła urządzenia? Jeśli nie ma żadnej pracy, jakie jest dokładne użycie AndroidKeyStore? Gdzie mogę go użyć?

+0

Hej. Właśnie napisałem post na temat tego materiału http://systemdotrun.blogspot.co.uk/2015/02/android-security-forgetful-keystore.html – Dori

+1

@ Łącze Dori jest martwe, oto aktualizacja url http://doridori.github.io/android-security-the-forgetful-keystore/#sthash.dBNZUIC0.dpbs – Tom

+0

Thx :) Piszę szybki przegląd 'KeyStore' obecnie również https: // github .com/doridori/Android-Security-Reference/blob/master/api/keystore.md – Dori

Odpowiedz

4

Ten problem został rozwiązany przez Google w wersji Android 5.0 (Lollipop). Ale w poprzednich wersjach Androida będziesz musiał żyć z tym problemem. :(

Powiązane problemy