Jak hasło Gmaila jest przechowywane w Androidzie - i gdzie?

37

Rozejrzałem się i nie znalazłem informacji o tym, w jaki sposób Android przechowuje hasła na urządzeniu. Zwłaszcza hasła do Gmaila. Chcę się dowiedzieć, jak Android szyfruje i przechowuje hasła? Jakiego klucza używa i gdzie jest przechowywany ten klucz oraz jakiego algorytmu szyfrowania używa.

asudhak
źródło
1
Dlaczego przechowywane hasło powinno być szyfrowane kluczem? Oznaczałoby to tylko, że należy wprowadzić klucz za każdym razem, gdy hasło jest wymagane, a następnie po prostu nie można zapisać hasła i wprowadzić go za każdym razem.
Flow
Klucz może być specyficzny dla urządzenia, uzyskany z IMEI telefonu lub czegoś takiego. Co oznacza, że ​​oprogramowanie może uzyskać klucz bez konieczności wpisywania go przez użytkownika za każdym razem.
asudhak
1
Co uniemożliwia uruchomienie jakiegokolwiek innego oprogramowania w telefonie w celu uzyskania klucza? To podejście nie dodaje żadnej dodatkowej warstwy bezpieczeństwa
Flow

Odpowiedzi:

36

Oficjalna aplikacja Gmaila nie przechowuje hasła na twoim urządzeniu. Twoje hasło jest w 100% bezpieczne, jeśli korzystasz z tej aplikacji.

Oto jak to działa: hasło jest używane tylko przez serwery uwierzytelniające Google. Po pierwszym udanym uwierzytelnieniu plik Auth Tokenjest pobierany na urządzenie, które jest przechowywane w accounts.dbpliku jako zwykły tekst. Przy wszystkich kolejnych logowaniach Auth Tokenjest to używane, a NIE oryginalne hasło.
Tak więc, jeśli twoje urządzenie zostanie skradzione, wszystko, co każdy może uzyskać, to Auth Tokenstaje się nieważne po zmianie hasła. Będziesz więc absolutnie dowodzony.
Aby uzyskać najwyższe bezpieczeństwo, zalecamy włączenie 2-Factor Authenticationi utworzenie Device Specific Passwordurządzenia. Po utracie urządzenia wystarczy go wyłączyć. Nie musisz nawet zmieniać głównego hasła.

Uwaga: to wszystko nie jest prawdą, jeśli używasz zewnętrznych aplikacji e-mail do Gmaila. Podstawowa aplikacja e-mail, poczta K-9 itp. Protokół IMAP lub POP wymaga oryginalnego hasła do uwierzytelnienia użytkowników za każdym razem. Tak więc proste hasło musi być dostępne w aplikacji e-mail przed wysłaniem go na serwer. Dlatego większość aplikacji pocztowych przechowuje hasła w postaci zwykłego tekstu (haszowanie / szyfrowanie jest bezużyteczne, ponieważ klucz haszujący / szyfrujący musi być przechowywany lokalnie). W takim przypadku zalecam włączenie 2-Factor Authenticationi utworzenie Device Specific Passwordurządzenia. Po utracie urządzenia wystarczy go wyłączyć.

Aktualizacja: Z
technicznego punktu widzenia możliwe jest lokalne przechowywanie haseł w postaci zaszyfrowanej / mieszanej bez lokalnego przechowywania klucza szyfrowania / klucza mieszającego w postaci zwykłego tekstu. Dzięki @JFSebastian za wskazanie tego. Niestety taka implementacja dla Androida nie jest jeszcze dostępna. Począwszy od ICS, Android zapewnia KeyChain API, za pomocą którego aplikacja może przechowywać hasło lokalnie w bezpiecznej formie. Aplikacje korzystające z KeyChain API są rzadkie, ale używa ich standardowa aplikacja e-mailowa (dzięki @wawa za tę informację). Twoje hasło będzie więc bezpieczne w podstawowej aplikacji e-mail, dopóki ekran będzie zablokowany. Pamiętaj, że KeyChain nie jest bezpieczny, jeśli urządzenie jest zrootowane i nie jest dostępne na urządzeniach wcześniejszych niż ICS.

Android Quesito
źródło
6
@JF Sebastian: nawet zakładając, że całkowicie ufasz stronie trzeciej, która przechowuje twoje hasła, były one tylko nieznacznie bardziej bezpieczne niż przechowywanie hasła w samym urządzeniu. Urządzenie nadal musi być w stanie odzyskać zwykły tekst hasła z pamięci w chmurze, a urządzenie nadal musi buforować hasło lokalnie, ponieważ nie trzeba ponownie podłączać klucza sprzętowego za każdym razem, gdy wejdziesz do tunelu lub obszarów z słaby odbiór. Najgorsze w bezpieczeństwie jest zapewnienie fałszywego poczucia bezpieczeństwa.
Lie Ryan,
4
@JFSebastian: Podsumowując, jedynym naprawdę bezpiecznym sposobem uwierzytelnienia jest zrobienie tego, co Google zrobił z aplikacją Gmail, tj. Użycie niestandardowego schematu uwierzytelniania z tokenem uwierzytelnienia. Nawet jeśli komuś udało się ukraść token uwierzytelniania, możesz zdalnie unieważnić token i nie musisz zmieniać hasła, ponieważ zwykły tekst hasła nigdy nie został naruszony. Innym bezpiecznym sposobem jest użycie klucza bez sesji; cóż, wiesz, co się stanie, gdy to zrobisz, użytkownicy po prostu zostawią klucz sprzętowy na stałe.
Lie Ryan,
5
@JFSebastian: Myślę, że nie rozumiesz sedna sprawy. Szyfrowanie hasła nie jest bezpieczniejsze niż przechowywanie go w postaci zwykłego tekstu, nawet o jeden bit. Każdy atakujący, któremu uda się skopiować account.db, może również skopiować wraz z nim klucz deszyfrujący; jedyne, co daje ci szyfrowanie, to fałszywe poczucie bezpieczeństwa , które jest gorsze niż brak bezpieczeństwa. Tak, istnieją rozwiązania, które są znacznie lepsze niż przechowywanie hasła w postaci zwykłego tekstu, ale wszystkie wymagają zmian w protokole e-mail, więc musimy żyć z tym, co obecnie mamy. Lub zrób to poprawnie w niestandardowy sposób, jak Gmail.
Lie Ryan,
3
@JFSebastian Apple pęku kluczy lub usługa dostarczana przez jądro Linuksa nie jest bezpieczniejszą opcją. Hasło nadal pozostaje w pamięci, a jeśli brelok jest odblokowany nawet niezaszyfrowany. Prawdopodobnie jest to tylko nieco trudniejsze do uzyskania jako plik .db tylko do odczytu katalogu głównego. Google wdrożyło najlepsze możliwe praktyczne rozwiązanie za pomocą tokena uwierzytelniającego, który można unieważnić w przypadku naruszenia bezpieczeństwa urządzenia. Kolejną bezpieczniejszą opcją byłoby wprowadzenie hasła za każdym razem lub po prostu unikanie korzystania z poczty e-mail.
Flow
4
@LieRyan Począwszy od ICS, standardowa aplikacja poczty e-mail faktycznie używa interfejsu API KeyStore, a nie zwykłego tekstu. android-developers.blogspot.com/2012/03/…
Wesley Wiser
12

Hasła Androida używane we wbudowanej aplikacji Email są przechowywane jako zwykły tekst w bazie danych SQLite. Jest to sprzeczne z aplikacją Gmaila , która korzysta z tokenów uwierzytelniania zgodnie z opisem w odpowiedzi Sachina Sekhara .

W przypadku Jelly Bean lokalizacja bazy danych to:

/data/system/users/0/accounts.db

Powyższa lokalizacja różni się w zależności od wersji Androida

Ta lokalizacja na niezrootowanym urządzeniu jest chroniona i chroniona przez system operacyjny.
Na zrootowanych urządzeniach użytkownicy już technicznie złamali swoje zabezpieczenia, a nawet gdyby nie był to zwykły tekst, odszyfrowanie byłoby trywialne, ponieważ klucz musi istnieć gdzieś na urządzeniu, aby to zrobić.

Członek zespołu programistów Androida opublikował wyjaśnienie, które do dziś obowiązuje:

Teraz w odniesieniu do tej szczególnej troski. Pierwszą rzeczą do wyjaśnienia jest to, że aplikacja e-mail obsługuje cztery protokoły - POP3, IMAP, SMTP i Exchange ActiveSync - i z nielicznymi, bardzo ograniczonymi wyjątkami, wszystkie te są starszymi protokołami, które wymagają od klienta przedstawienia hasła do serwera na każdym połączeniu. Te protokoły wymagają od nas przechowywania hasła tak długo, jak długo chcesz korzystać z konta na urządzeniu. Nowsze protokoły tego nie robią - dlatego niektóre artykuły kontrastują na przykład z Gmailem. Nowsze protokoły pozwalają klientowi jednorazowo użyć hasła do wygenerowania tokena, zapisania tokena i odrzucenia hasła.

Zachęcam do zapoznania się z artykułem, do którego prowadzi komentarz nr 38 , który jest dobrze napisany i zawiera wiele informacji. Zapewnia to bardzo dobre tło różnic między „zaciemniającymi” hasłami i czyniącymi je „bezpiecznymi”. Zwykłe zasłanianie hasła (np. Base64) lub szyfrowanie go kluczem przechowywanym w innym miejscu nie zwiększy bezpieczeństwa Twojego hasła ani danych. Atakujący nadal będzie mógł go odzyskać.

(W szczególności zgłoszono pewne twierdzenia, że ​​niektóre inne klienty poczty e-mail nie przechowują hasła w postaci jawnego tekstu. Nawet jeśli jest to prawda, nie oznacza to, że hasło jest bezpieczniejsze. Prosty test: czy można uruchomić urządzenie i zacznie otrzymywać wiadomości e-mail na skonfigurowanych kontach, a następnie hasła nie będą naprawdę bezpieczne. Są zaciemnione lub zaszyfrowane innym kluczem przechowywanym w innym miejscu).

Dodatkowo, ponieważ wydaje się, że ten problem przeszkadza wielu użytkownikom Androida, możesz również śledzić tę dyskusję w Slashdot - dane hasła do Androida przechowywane jako zwykły tekst .

Zuul
źródło
Łał. To mnie zadziwia. Nie wiedziałem, że jest przechowywany jako zwykły tekst. Zapomnij zrootowany lub nierootowany. Jeśli urządzenie zostanie skradzione, pozbawiona skrupułów osoba może łatwo uzyskać twoje poświadczenia, nawet jeśli zablokujesz telefon kluczem zabezpieczającym. Biorąc pod uwagę ten fakt, czy znasz również wszelkie mechanizmy szyfrowania całego dysku.
asudhak
1
Cokolwiek to jest, są czymś, co można wykorzystać do uzyskania dostępu do konta. Ale @SachinShekhar accounts.dbplik jest chroniony przed odczytem przez konta inne niż system.
Wyzard
1
Zuul, doceniam twój wysiłek włożony w odpowiedzi, ale myślę, że ta odpowiedź jest bardzo myląca. Jeśli przejdziesz ponownie cytowany cytat, aplikacja Gmail nie przechowuje hasła. --edit check @SachinShekhar też odpowiedź.
roxan
2
@asudhak Jeśli jakakolwiek aplikacja korzysta z oryginalnego hasła, nie ma sposobu na jego ochronę. Haker może zdekodować zakodowany ciąg z account.db po znalezieniu klucza szyfrującego / mieszającego, który musi być przechowywany lokalnie, ponieważ aplikacja e-mail potrzebowałaby tego klucza do skompilowania oryginalnego hasła przed wysłaniem go na serwer.
Android Quesito,
2
@roxan Nie mogłem znaleźć niczego, co wskazywałoby, że hasło nie jest przechowywane przez aplikację Gmail. Czy możesz podać wycenę lub link?
Flow