Android: Zapisujesz nazwę użytkownika i hasło?

178

Jeśli chcę przechowywać nazwę użytkownika i hasło, które mają być używane w aplikacji na Androida, jaki jest najlepszy sposób, aby to zrobić? Czy odbywa się to za pośrednictwem ekranu preferencji (ale co, jeśli użytkownik to przegapi?), Czy wyskakuje okno dialogowe i pyta użytkownika o poświadczenia? Jeśli tak, muszę zachować stan aplikacji. Jak bym to zrobił?

Legenda
źródło
4
stackoverflow.com/a/786588/1166727 Sprawdź, co na ten temat ma do powiedzenia @RetoMeier (Tech Lead for Android Development w Google).
tony gil
1
Jeśli szukasz najbezpieczniejszego sposobu przechowywania danych uwierzytelniających, przeczytaj tę odpowiedź stackoverflow.com/a/20560574/730807
Durai Amuthan.H
3
@ Legend, jak rozwiązałeś problem?
Erum,
@ Legend, czy możesz rzucić trochę światła na zapisywanie pwd w ustawieniach wstępnych po zaszyfrowaniu ... ponieważ chcę, aby moja aplikacja działała bez internetu, więc jak mogę uzyskać klucz ... (bo nie mogę przechowywać klucza na urządzeniu)
eRaisedToX
Możesz użyć magazynu kluczy dla Api +18. developer.android.com/training/articles/keystore
Golnar

Odpowiedzi:

115

Większość aplikacji na Androida i iPhone'a, które widziałem, używa początkowego ekranu lub okna dialogowego, aby poprosić o poświadczenia. Myślę, że częste ponowne wprowadzanie nazwy / hasła jest uciążliwe dla użytkownika, więc przechowywanie tych informacji ma sens z punktu widzenia użyteczności.

Rada z ( przewodnika dla programistów Androida ):

Ogólnie zalecamy zminimalizowanie częstotliwości pytań o dane uwierzytelniające użytkownika - aby ataki phishingowe były bardziej widoczne i miały mniejsze szanse powodzenia. Zamiast tego użyj tokena autoryzacyjnego i odśwież go.

O ile to możliwe, nazwa użytkownika i hasło nie powinny być przechowywane na urządzeniu. Zamiast tego należy przeprowadzić wstępne uwierzytelnianie przy użyciu nazwy użytkownika i hasła podanego przez użytkownika, a następnie użyć krótkotrwałego tokenu autoryzacji specyficznego dla usługi.

Korzystanie z AccountManger to najlepsza opcja przechowywania poświadczeń. SampleSyncAdapter stanowi przykład, jak go używać.

Jeśli z jakiegoś powodu nie masz takiej możliwości, możesz wrócić do utrwalania poświadczeń, korzystając z mechanizmu Preferencji . Inne aplikacje nie będą miały dostępu do twoich preferencji, więc informacje użytkownika nie są łatwo ujawniane.

Eric Levine
źródło
40
Powiedziałbym, że utrwalanie informacji o haśle zgodnie z preferencjami jest ryzykowne. Na telefonach z dostępem do roota można uzyskać dostęp do pliku preferencji aplikacji. Możesz przynajmniej zaciemnić hasło.
Jayesh
51
Jeśli ktoś ma Twój telefon i jest w stanie go zrootować, nie jesteś w stanie zrobić zbyt wiele, aby zapewnić bezpieczeństwo danych. Nie jest złym pomysłem zaciemnianie hasła, ale tak naprawdę nie zapewnia o wiele większej ochrony. Co ważniejsze, w systemie operacyjnym jest już wbudowanych wiele warstw zabezpieczeń. Oczywiście nie chcesz zrobić nic głupiego, aby obejść te środki. Prawdopodobnie lepiej jest użyć systemu takiego jak OAuth i przechowywać token na urządzeniu zamiast nazwy użytkownika i hasła.
Eric Levine
4
Jeśli użyjesz AccountManager(zgodnie z moją odpowiedzią, a @ Miguel jest okrężną drogą) i ktoś zdobędzie twój telefon GSM, będzie musiał nadal używać twojej karty SIM, aby mieć dostęp do twoich kont, ponieważ spowoduje to unieważnienie przechowywanych poświadczeń kiedy zmienia się karta SIM.
Jon O
3
Czyszczenie konta przy zmianie SIP zostało usunięte już dawno temu, ponieważ nie ma to sensu, zwłaszcza dla osób, które mają więcej niż jedną kartę SIM. Lepszą strategią w przypadku kradzieży telefonu jest przejście na stronę konta Google i odebranie dostępu do określonego urządzenia.
Nikolay Elenkov
2
„Korzystanie z Menedżera kont to najlepsza opcja przechowywania poświadczeń”. Czemu?
Luc,
9

Należy użyć menedżera kont Androida . Jest przeznaczony specjalnie do tego scenariusza. Jest to trochę uciążliwe, ale jedną z rzeczy, które robi, jest unieważnienie lokalnych poświadczeń, jeśli karta SIM ulegnie zmianie, więc jeśli ktoś przesunie Twój telefon i wrzuci do niego nową kartę SIM, Twoje poświadczenia nie zostaną naruszone.

Daje to również użytkownikowi szybki i łatwy sposób uzyskiwania dostępu (i potencjalnego usuwania) przechowywanych poświadczeń dla dowolnego konta, które ma na urządzeniu, z jednego miejsca.

SampleSyncAdapter (jak wspomniany @Miguel) to przykład, który korzysta z przechowywanych poświadczeń konta.

Jon O
źródło
3
Gdzie jest udokumentowane, że AccountManager „unieważni lokalne poświadczenia w przypadku zmiany karty SIM”?
Eric Levine
Nie tego jestem świadomy. Jednak jest to coś, w co uwierzyłem / zaakceptowałem / zrozumiałem, po tym, jak niektórzy użytkownicy mojej aplikacji mieli problemy z uwierzytelnianiem po wymianie karty SIM.
Jon O,
1
Nie widzę tego w kodzie JavaDocs lub AccountManager. Brzmi jak dobra funkcja, po prostu fajnie byłoby to zweryfikować i zrozumieć szczegóły.
Eric Levine
2
Według @NikolayElenkov funkcja unieważnienia przy zmianie karty SIM została usunięta.
ThomasW
2
@ThomasW czy masz na to cytat? Byłoby wspaniale otrzymać jakąś ostateczną odpowiedź.
Jon O,
8

Myślę, że najlepszym sposobem zabezpieczenia swoich danych uwierzytelniających jest najpierw pomyśleć o zapisaniu hasła z szyfrowaniem w pliku account.db, który nie byłby łatwo dostępny na urządzeniach nierootowanych, aw przypadku zrootowanego urządzenia haker musi potrzebować klucza do odszyfrowania to.

Inną opcją jest wykonanie całego uwierzytelniania, tak jak działa Gmail. po pierwszym uwierzytelnieniu na serwerze Gmail. masz token autoryzacji, który będzie używany w przypadku twojego hasła. ten token byłby przechowywany w postaci zwykłego tekstu. ten token może być fałszywy w przypadku zmiany hasła z serwera.

ostatnia opcja, którą polecam włączyć uwierzytelnianie dwuetapowe i utworzyć hasło specyficzne dla urządzenia dla swojego urządzenia. Po utracie urządzenia wystarczy je wyłączyć.

Riz
źródło
2
Czy możesz opublikować źródło, które mówi, że accounts.db jest zaszyfrowane? A może mówisz, że określone hasło powinno być zaszyfrowane?
Michał K
1
@Riz, gdzie wtedy przechowywać klucz do szyfrowania ... ponieważ moja aplikacja działa bez Internetu, więc nie mogę jej pobrać z sieci
eRaisedToX
2

Dzięki nowemu sprzętowi do obsługi linii papilarnych (Android 6.0) i interfejsowi API możesz to zrobić tak, jak w tej przykładowej aplikacji na githubie.

Zlatko
źródło
8
Przywoływany przykładowy projekt tworzy klucz w Android Key Store i używa go do utworzenia szyfru do zaszyfrowania hasła. Zaszyfrowane hasło i szyfr są przechowywane jako ciągi kodowane algorytmem base64 we wspólnych preferencjach. Po pomyślnym uwierzytelnieniu odcisków palców tajny klucz jest pobierany z Android Key Store i używany z odszyfrowanym szyfrowaniem do odszyfrowania odkodowanego hasła.
mjwheat
@mjwheat jest to bardzo pomocne, aby zrozumieć, co dzieje się w przykładzie. Dzięki! Jedna mała literówka: „... aby odszyfrować zakodowane hasło”.
muetzenflo
2

Są one uporządkowane według stopnia trudności, aby złamać ukryte informacje .

  1. Przechowuj w postaci zwykłego tekstu

  2. Przechowuj zaszyfrowane przy użyciu klucza symetrycznego

  3. Korzystanie z Android Keystore

  4. Przechowuj zaszyfrowane za pomocą kluczy asymetrycznych

źródło: gdzie jest najlepsze miejsce do przechowywania hasła w Twojej aplikacji na Androida

Sam magazyn kluczy jest szyfrowany przy użyciu własnego kodu PIN / hasła blokady ekranu, dlatego gdy ekran urządzenia jest zablokowany, magazyn kluczy jest niedostępny. Pamiętaj o tym, jeśli masz usługę w tle, która może potrzebować dostępu do kluczy tajnych aplikacji.

źródło: Proste używanie Android Keystore do przechowywania haseł i innych poufnych informacji

Dmytro Melnychuk
źródło