Bezpieczeństwo Android SharedPreference

118

Zastanawiam się nad zabezpieczeniem wspólnych preferencji.

Czy można uzyskać dostęp do wspólnych preferencji, nawet jeśli zostały utworzone w MODE_PRIV (0)?
Czy można wyświetlić listę wszystkich dostępnych wspólnych preferencji, a następnie pobrać wszystkie ustawienia z innych aplikacji?
Czy sharedpreferences to dobre miejsce na umieszczenie poufnych danych, takich jak hasło lub token uwierzytelniania?

Dzięki

Marek Sebera
źródło
Warto zobaczyć, z ładnymi odpowiedziami. Wspólne preferencje wiele mówią o stylu programowania dewelopera.
Vishwa Ratna

Odpowiedzi:

232

Współdzielone preferencje są przechowywane jako plik w systemie plików na urządzeniu. Są one domyślnie przechowywane w katalogu danych aplikacji z ustawionymi uprawnieniami systemu plików, które zezwalają tylko na UID, z którym działa określona aplikacja, aby uzyskać do nich dostęp. Są więc prywatne, ponieważ uprawnienia do plików Linuksa ograniczają do nich dostęp, tak samo jak w każdym systemie Linux / Unix.

Każdy, kto ma dostęp do urządzenia na poziomie administratora, będzie mógł je zobaczyć, ponieważ root ma dostęp do wszystkiego w systemie plików. Ponadto każda aplikacja działająca z tym samym UID co aplikacja tworząca będzie mogła uzyskać do nich dostęp (zwykle nie jest to wykonywane i musisz wykonać określone działanie, aby dwie aplikacje działały z tym samym UID, więc prawdopodobnie nie jest to duży sprawa). Wreszcie, jeśli ktoś byłby w stanie zamontować system plików twojego urządzenia bez korzystania z zainstalowanego systemu operacyjnego Android, mógłby również ominąć uprawnienia ograniczające dostęp.

Jeśli obawiasz się takiego dostępu do swoich preferencji (lub jakichkolwiek danych zapisanych przez Twoją aplikację), zechcesz to zaszyfrować. Jeśli tak cię to obchodzi, będziesz musiał dokładnie dowiedzieć się, ile ochrony jest konieczne dla poziomu ryzyka, który widzisz. Bardzo obszerna dyskusja na ten temat znajduje się w dokumencie Application Security for the Android Platform , opublikowanym właśnie w grudniu 2011 r. (Zastrzeżenie: jestem autorem tej książki).

Thamaraiselvam
źródło
2
Czy jest jakaś oficjalna dokumentacja, która o tym mówi? Czy masz jakieś referencje?
clu
26

SharedPreferences to nic innego jak pliki XML w twoim telefonie / data / data / folder, więc każda aplikacja lub użytkownik z uprawnieniami administratora na urządzeniu zrootowanym może uzyskać dostęp do twoich SharedPreferences, nawet jeśli zostały utworzone za pomocą MODE_PRIV

Nadal istnieje sposób, aby chronić go przed wszystkimi ... Sprawdź ten link. Tutaj możesz przechowywać dane wstępnie z szyfrowaniem, klasa jest oczywista i bardzo łatwa w użyciu.

https://github.com/sveinungkb/encrypted-userprefs

Jak powiedzieli inni, każdy może uzyskać do niego dostęp, ale w tym przypadku nikt nie może odczytać zawartych w nim danych, ponieważ są one zaszyfrowane. Więc jego secure.For najwyższą bezpieczeństwa moja propozycja będzie wygenerować klucz używany do szyfrowania w czasie wykonywania zamiast ciężko kodowania. Można to zrobić na wiele sposobów :)

Jazz Haque
źródło
8
jak więc zapisać wygenerowany klucz?
Olayinka
3
@Olayinka Bezpieczniej byłoby zaszyfrować to innym kluczem i zapisać w pliku SharedPref. Ale co w takim razie zrobić z drugim kluczem? Poważnie jednak, najlepszym scenariuszem byłoby wysłanie zaszyfrowanego klucza i identyfikatora UID urządzenia do serwera za pomocą protokołu SSL w celu ich przechowywania i pobierania w razie potrzeby. Wymagałoby to łączności, ale pozwoliłoby na umieszczenie urządzenia na czarnej liście i nagle wszystkie dane zostałyby usunięte. Bez stałego połączenia z Internetem każda próba szyfrowania danych nie jest w 100% bezpieczna.
Paulo Avelar
Użyłem powyższego rozwiązania ... działa 9 na 10 razy ... ale otrzymuję błąd: 1e06b065: Funkcje szyfru: EVP_DecryptFinal_ex: BAD_DECRYPT "czasami ... Czy ktoś ma pomysł?
Raj Trivedi
3
@PauloAvelar Używaj Android KeyStore do długoterminowego przechowywania i pobierania kluczy kryptograficznych. Klucze nie są przechowywane w aplikacji, więc nie można ich złamać. Dostarczona biblioteka go nie używa. Zapisuje sekret w kodzie, więc nie jest bezpieczny.
apex39
13

Zwykle nie, inne aplikacje nie mogą uzyskać do nich dostępu, jednak należy pamiętać, że SharedPreferences są przechowywane jako pliki XML w /data/data/katalogu, co zasadniczo oznacza, że każda aplikacja z uprawnieniami superużytkownika na urządzeniu zrootowanym może uzyskać dostęp do twoich plików SharedPreference, nawet jeśli były utworzone za pomocąMODE_PRIV

aviraldg
źródło
3

Czy można uzyskać dostęp do wspólnych preferencji, nawet jeśli zostały utworzone w MODE_PRIV (0)?

Kodem nr. Ale możesz pobrać plik aplikacji, jeśli masz uprawnienia superużytkownika.

Czy można wyświetlić listę wszystkich dostępnych wspólnych preferencji, a następnie pobrać wszystkie ustawienia z innych aplikacji?

Jeśli jesteś superużytkownikiem (zrootowanymi urządzeniami), możesz pobrać wszystkie prywatne pliki aplikacji.

Czy sharedpreferences to dobre miejsce na umieszczenie poufnych danych, takich jak hasło lub token uwierzytelniania?

Nie. Można go łatwo zhakować. Jeśli chcesz umieścić jakiekolwiek poufne dane w udostępnionym pliku preferencji, możesz je zaszyfrować i zapisać. Możesz przechowywać swój klucz szyfrowania w NDK / serwerze.

Rajiv Ranjan
źródło
Jak można go łatwo zhakować?
John Sardinha
Tak, formularz zapytania @Jo
Cuong Vo