Ogólnie SharedPreferences są najlepszym rozwiązaniem do przechowywania preferencji, więc ogólnie polecam takie podejście do zapisywania ustawień aplikacji i użytkownika.
Jedynym przedmiotem zainteresowania jest to, co oszczędzasz. Hasła są zawsze trudne do przechowywania i szczególnie ostrożnie przechowuję je jako czysty tekst. Architektura Androida polega na tym, że współdzielone preferencje aplikacji są w piaskownicy, aby uniemożliwić innym aplikacjom dostęp do wartości, co zapewnia pewne bezpieczeństwo, ale fizyczny dostęp do telefonu może potencjalnie umożliwić dostęp do tych wartości.
Jeśli to możliwe, rozważę zmodyfikowanie serwera, aby używał wynegocjowanego tokena do zapewniania dostępu, coś w rodzaju OAuth . Alternatywnie może być konieczne zbudowanie jakiegoś sklepu kryptograficznego, choć nie jest to trywialne. Przynajmniej upewnij się, że szyfrujesz hasło przed zapisaniem go na dysku.
MODE_PRIVATE
z SharedPreferences jest równoważne robieniu tego samego z plikiem utworzonym w pamięci wewnętrznej, pod względem skuteczności zaciemniania lokalnie przechowywanych danych?Zgadzam się z Reto i fiXedd. Obiektywnie rzecz biorąc, nie ma sensu inwestowanie znacznego czasu i wysiłku w szyfrowanie haseł we współdzielonych preferencjach, ponieważ osoba atakująca, która ma dostęp do pliku preferencji, prawdopodobnie również ma dostęp do pliku binarnego aplikacji, a zatem kluczy do odszyfrowania hasło.
Niemniej jednak wydaje się, że istnieje inicjatywa reklamowa polegająca na identyfikacji aplikacji mobilnych, które przechowują hasła w postaci jawnego tekstu w SharedPreferences i rzucają niekorzystne światło na te aplikacje. Zobacz przykłady na http://blogs.wsj.com/digits/2011/06/08/some-top-apps-put-data-at-risk/ i http://viaforensics.com/appwatchdog .
Chociaż potrzebujemy więcej uwagi poświęconej bezpieczeństwu w ogólności, argumentowałbym, że tego rodzaju uwaga w tej konkretnej sprawie w rzeczywistości nie zwiększa znacząco naszego ogólnego bezpieczeństwa. Jednak postrzeganie jest takie, jakie jest, oto rozwiązanie do szyfrowania danych umieszczanych w SharedPreferences.
Po prostu zawiń w nim swój własny obiekt SharedPreferences, a wszystkie dane, które odczytasz / zapiszesz, zostaną automatycznie zaszyfrowane i odszyfrowane. na przykład.
Oto kod klasy:
źródło
Najprostszym sposobem na zapisanie jednej preferencji w Aktywności na Androida jest zrobienie czegoś takiego:
Jeśli martwisz się o ich bezpieczeństwo, zawsze możesz zaszyfrować hasło przed jego zapisaniem.
źródło
Korzystając z fragmentu udostępnionego przez Richarda, możesz zaszyfrować hasło przed jego zapisaniem. Interfejs API preferencji nie zapewnia jednak łatwego sposobu przechwytywania i szyfrowania wartości - możesz zablokować zapisywanie go za pomocą detektora OnPreferenceChange, i teoretycznie możesz go zmodyfikować za pomocą preferenceChangeListener, ale to powoduje nieskończoną pętlę.
Wcześniej zasugerowałem dodanie „ukrytej” preferencji, aby to osiągnąć. To zdecydowanie nie jest najlepszy sposób. Przedstawię dwie inne opcje, które uważam za bardziej opłacalne.
Po pierwsze, najprostszy, znajduje się w preferenceChangeListener, możesz pobrać wprowadzoną wartość, zaszyfrować ją, a następnie zapisać w alternatywnym pliku preferencji:
Drugi sposób, i tak, jak wolę teraz, to utworzenie własnych preferencji, rozszerzenie EditTextPreference, @ Zastąpienie metod
setText()
igetText()
, abysetText()
szyfrować hasło igetText()
zwracać wartość null.źródło
W porządku; minęło trochę czasu, odkąd odpowiedź jest trochę mieszana, ale oto kilka typowych odpowiedzi. Badałem to jak szalone i ciężko było znaleźć dobrą odpowiedź
Metoda MODE_PRIVATE jest ogólnie uważana za bezpieczną, jeśli założymy, że użytkownik nie zrootował urządzenia. Twoje dane są przechowywane jako zwykły tekst w części systemu plików, do której dostęp ma tylko oryginalny program. Ułatwia to chwytanie hasła za pomocą innej aplikacji na zrootowanym urządzeniu. Z drugiej strony, czy chcesz obsługiwać zrootowane urządzenia?
AES to wciąż najlepsze szyfrowanie, jakie możesz zrobić. Pamiętaj, aby to sprawdzić, jeśli zaczynasz nową implementację, jeśli minęło trochę czasu, odkąd to opublikowałem. Największym problemem jest „Co zrobić z kluczem szyfrującym?”
Teraz jesteśmy w temacie „Co zrobić z kluczem?” część. To jest najtrudniejsza część. Zdobycie klucza okazuje się nie takie złe. Możesz użyć funkcji wyprowadzania klucza, aby wziąć hasło i uczynić z niego całkiem bezpieczny klucz. Wchodzisz w takie problemy, jak „ile przebiegów robisz z PKFDF2?”, Ale to już inny temat
Najlepiej jest przechowywać klucz AES poza urządzeniem. Musisz jednak znaleźć dobry sposób na odzyskanie klucza z serwera w sposób bezpieczny, niezawodny i bezpieczny
Masz jakąś sekwencję logowania (nawet oryginalną sekwencję logowania dla dostępu zdalnego). Możesz wykonać dwa uruchomienia generatora kluczy na tym samym haśle. Działa to tak, że klucz uzyskuje się dwa razy z nową solą i nowym bezpiecznym wektorem inicjującym. Przechowujesz jedno z wygenerowanych haseł na urządzeniu i używasz drugiego hasła jako klucza AES.
Po zalogowaniu wyprowadzasz klucz z lokalnego loginu i porównujesz go z zapisanym kluczem. Gdy to zrobisz, użyjesz klucza # 2 dla AES.
Możesz zrobić wiele ich odmian. Na przykład zamiast pełnej sekwencji logowania możesz zrobić szybki kod PIN (wyprowadzony). Szybki kod PIN może nie być tak bezpieczny jak pełna sekwencja logowania, ale jest wielokrotnie bezpieczniejszy niż zwykły tekst
źródło
Wiem, że to trochę nekromancja, ale powinieneś użyć Android AccountManager . Jest specjalnie zaprojektowany dla tego scenariusza. Jest to trochę uciążliwe, ale jedną z rzeczy, które robi, jest unieważnianie lokalnych poświadczeń, jeśli karta SIM się zmieni, więc jeśli ktoś przesunie twój telefon i wrzuci nową kartę SIM, twoje poświadczenia nie zostaną naruszone.
Daje to również użytkownikowi szybki i łatwy sposób na dostęp (i potencjalne usunięcie) przechowywanych poświadczeń dla dowolnego konta, które mają na urządzeniu, wszystko z jednego miejsca.
SampleSyncAdapter to przykład, który wykorzystuje zapisane poświadczenia konta.
źródło
Wrzucę kapelusz na ring, żeby porozmawiać o zabezpieczeniu haseł w ogóle na Androidzie. Na Androidzie binarne urządzenie należy uznać za zagrożone - to samo dotyczy każdej aplikacji końcowej, która jest pod bezpośrednią kontrolą użytkownika. Pod względem koncepcyjnym haker mógłby użyć niezbędnego dostępu do pliku binarnego, aby go zdekompilować i wykorzenić zaszyfrowane hasła itp.
Jako takie są dwie sugestie, które chciałbym tam przedstawić, jeśli bezpieczeństwo jest dla Ciebie najważniejsze:
1) Nie przechowuj aktualnego hasła. Zapisz przyznany token dostępu i użyj tokena dostępu oraz podpisu telefonu do uwierzytelnienia sesji po stronie serwera. Zaletą tego jest to, że możesz sprawić, by token miał ograniczony czas trwania, nie naruszasz oryginalnego hasła i masz dobrą sygnaturę, której możesz użyć do późniejszej korelacji z ruchem (na przykład w celu sprawdzenia prób włamania i unieważnienia token czyniący go bezużytecznym).
2) Wykorzystaj uwierzytelnianie 2-czynnikowe. Może to być bardziej irytujące i nachalne, ale w niektórych sytuacjach związanych z przestrzeganiem przepisów jest to nieuniknione.
źródło
Możesz także sprawdzić tę małą bibliotekę, zawierającą wspomnianą funkcjonalność.
https://github.com/kovmarci86/android-secure-preferences
Jest podobny do niektórych innych podejść tutaj. Nadzieja pomaga :)
źródło
To jest dodatkowa odpowiedź dla przybywających tutaj na podstawie tytułu pytania (tak jak ja) i nie muszą zajmować się kwestiami bezpieczeństwa związanymi z zapisywaniem haseł.
Jak korzystać z Preferencji współdzielonych
Ustawienia użytkownika są zazwyczaj zapisywane lokalnie w systemie Android przy użyciu
SharedPreferences
pary klucz-wartość.String
Klawisz służy do zapisywania lub wyszukiwania powiązanej wartości.Napisz do wspólnych preferencji
Użyj
apply()
zamiast,commit()
aby zapisać w tle, a nie natychmiast.Czytaj z preferencji wspólnych
Wartość domyślna jest używana, jeśli klucz nie zostanie znaleziony.
Notatki
Zamiast używać lokalnego klucza String w wielu miejscach, tak jak ja powyżej, lepiej byłoby użyć stałej w jednym miejscu. Na górze swojej aktywności ustawień możesz użyć czegoś takiego:
Kiedyś
int
w moim przykładzie, ale można również użyćputString()
,putBoolean()
,getString()
,getBoolean()
, itd.źródło
Ta odpowiedź oparta jest na sugerowanym podejściu Marka. Tworzona jest niestandardowa wersja klasy EditTextPreference, która konwertuje tam iz powrotem między zwykłym tekstem widocznym w widoku a zaszyfrowaną wersją hasła przechowywaną w pamięci preferencji.
Jak zauważyło większość, którzy odpowiedzieli na ten wątek, nie jest to bardzo bezpieczna technika, chociaż stopień bezpieczeństwa zależy częściowo od użytego kodu szyfrowania / deszyfrowania. Ale jest to dość proste i wygodne i udaremni najbardziej zwyczajne węszenie.
Oto kod niestandardowej klasy EditTextPreference:
To pokazuje, jak można z niego korzystać - jest to plik „items”, który steruje wyświetlaniem preferencji. Uwaga: zawiera trzy zwykłe widoki EditTextPreference i jeden niestandardowy widok EditPasswordPreference.
Co do faktycznego szyfrowania / deszyfrowania, pozostaje to ćwiczenie dla czytelnika. Obecnie używam kodu na podstawie tego artykułu http://zenu.wordpress.com/2011/09/21/aes-128bit-cross-platform-java-and-c-encryption-compatibility/ , chociaż z różnymi wartościami dla klucza i wektora inicjalizacji.
źródło
Przede wszystkim uważam, że dane użytkownika nie powinny być przechowywane na telefonie, a jeśli trzeba je przechowywać w telefonie, należy je zaszyfrować w prywatnych aplikacjach. Priorytetem aplikacji powinno być bezpieczeństwo poświadczeń użytkowników.
Wrażliwe dane powinny być przechowywane bezpiecznie lub wcale. W przypadku zainfekowania zagubionego urządzenia lub złośliwego oprogramowania dane przechowywane w sposób niepewny mogą zostać naruszone.
źródło
Używam Android KeyStore do szyfrowania hasła za pomocą RSA w trybie EBC, a następnie zapisuję je w Preferencjach współdzielonych.
Kiedy chcę odzyskać hasło, czytam zaszyfrowane hasło z SharedPreferences i odszyfrowuję je za pomocą magazynu kluczy.
Za pomocą tej metody generujesz publiczną / prywatną parę kluczy, w której prywatny jest bezpiecznie przechowywany i zarządzany przez system Android.
Oto link, jak to zrobić: Android KeyStore Tutorial
źródło
wspólne preferencje to najprostszy sposób na przechowywanie danych naszej aplikacji. ale możliwe jest, że każdy może wyczyścić nasze wspólne dane preferencji za pośrednictwem menedżera aplikacji. więc nie sądzę, że jest to całkowicie bezpieczne dla naszej aplikacji.
źródło
musisz użyć sqlite, apit bezpieczeństwa do przechowywania haseł. oto najlepszy przykład, w którym przechowywane są hasła, - passwordsafe. tutaj jest link do źródła i objaśnienia - http://code.google.com/p/android-passwordsafe/
źródło