Pytanie:
Dlaczego w dwuetapowych formularzach logowania jest to nazwa logowania, a nie hasło, które jest zadawane jako pierwsze?
Out of Band
2015-09-09 19:15:47 UTC
view on stackexchange narkive permalink

Istnieje kilka formularzy logowania (np. Google) w Internecie, w których najpierw podaje się nazwę logowania, a po przesłaniu należy podać hasło.

Jedną z zalet tego jest Przypuszczam, że serwer może pobrać obraz, który tylko zna, i wyświetlić go użytkownikowi, aby udaremnić proste próby phishingu.

Moje pytanie brzmi: dlaczego nikt nie robi tego na odwrót - najpierw poproś o hasło, a następnie nazwę logowania.

Widzę oczywistą odpowiedź (że hasło może nie być unikalne i dlatego serwer nie wiedziałby, czyje-obrazy antyphishingowe mają wyświetlać), ale to mnie nie przekonuje. Natychmiastowe wyłączenie kont, które korzystają ze wspólnych haseł lub przynajmniej zmuszenie użytkowników do zmiany ich haseł na unikalny ciąg przy następnym logowaniu, może być sposobem obejścia tego problemu, a na marginesie rozwiązałoby to zjawisko haseł „123456”.

Inną kwestią, którą widzę, jest to, że w scenariuszu phishingu, w którym użytkownik wprowadza prawidłowe hasło, a następnie zauważa, że ​​wyświetlane są mu niewłaściwe obrazy, już podał swoje hasło i jedyne, co pozostaje do zrobienia dla phishera, to zidentyfikowanie, kto to jest do którego należy hasło.

Chciałbym wiedzieć, czy sekwencja logowania-następnie-hasła wynika głównie z konwencji lub rozważań dotyczących interfejsu użytkownika, czy też istnieją inne problemy z bezpieczeństwem związane z odwróceniem kolejności, o którą należy prosić najpierw hasło (oprócz dwóch, o których wspomniałem).

Wymuszanie unikalnych haseł wiąże się z krytycznym problemem dotyczącym bezpieczeństwa: kiedy go uruchomię, będę wiedział, że istnieje co najmniej jedno konto, które używa tego samego hasła, które próbowałem. Nazwy kont zwykle nie są uważane za tajne, więc mogę teraz wypróbować to hasło dla wszystkich kont, o których wiem.
Komentarze nie służą do rozszerzonej dyskusji; ta rozmowa została [przeniesiona do czatu] (http://chat.stackexchange.com/rooms/29031/discussion-on-question-by-pascal-schuppli-on-two-step-login-forms-why-is- to).
„Podał już swoje hasło i jedyne, co pozostaje do zrobienia dla phishera, to zidentyfikowanie, do kogo należy to hasło” - Co nie jest takie trudne, jeśli wyobrażasz sobie, że wiadomość phishingowa była skryptem, który powiadamia serwer o tym, który odbiorca e-maila został otwarty połączenie. Wtedy jest duża szansa, że ​​w przypadku np. Google nazwa użytkownika jest właśnie tym adresem e-mail, na który osoba otrzymała pocztę, czyli od tego momentu są też dostępne informacje.
Innym problemem związanym z unikalnymi hasłami jest wrażenia użytkownika. W małym systemie z 20 użytkownikami może to zadziałać, ale wyobraź sobie, że próbujesz utworzyć unikalne hasło do Gmaila. Znalezienie unikalnej nazwy użytkownika jest wystarczająco trudne. W tym momencie równie dobrze możesz automatycznie przypisać hasła i po prostu założyć, że w ciągu kilku sekund będzie to na karteczce.
** Dlatego nie powinieneś pić i zadawać pytań online. **
Osiem odpowiedzi:
Thomas Pornin
2015-09-09 19:28:47 UTC
view on stackexchange narkive permalink

Samo hasło niekoniecznie jest weryfikowalne. W szczególności, jeśli serwer działa poprawnie, nie przechowuje samych haseł, ale dane wyjściowe funkcji mieszania haseł obliczone na podstawie hasła. Funkcja mieszania haseł (w przeciwieństwie do zwykłej funkcji skrótu) zawiera kilka dodatkowych funkcji, w tym sól (z bardzo dobrych powodów związanych z bezpieczeństwem). Weryfikacja hasła wymaga wtedy znajomości odpowiedniej soli. Ponieważ sól jest specyficzna dla instancji (chodzi o to, że różni użytkownicy mają swoje własne sole), wymagana jest tożsamość użytkownika (tożsamość użytkownika jest używana jako klucz indeksujący dla soli).

SilverlightFox
2015-09-09 19:37:10 UTC
view on stackexchange narkive permalink

Po pierwsze, serwer nie wiedziałby, gdyby samo hasło pasowało do jakichkolwiek kont.

W bezpiecznym systemie hasła są zaszyfrowane, a następnie zaszyfrowane.

W uproszczonej wersji demonstracyjnej, przypuśćmy, że miałem trzech użytkowników:

  Nazwa użytkownika Hasłobob foobaralice foobarmaggie foobar  

Po ustawieniu tych haseł dodawana jest sól i generowany jest skrót:

  Nazwa Salt Wartość do mieszania hash resultbob ABCDEF ABCDEFfoobar 778f9aab91717e420e447d7e4cdd84f1alice 123456 123456foobar 17e9191daecc5b8be26779209769b275maggie ZXCVBN ZXCVBNfoobar 527cb07b112559cf9c1aff19d28074fa  

Jak widać, celem soli jest to, że nie ma dwóch haseł są przechowywane tak samo, nawet jeśli hasło może się zgadzać. Jest to ważny krok bezpieczeństwa, który należy podjąć, aby zapobiec używaniu tęczowych tablic na wyodrębnionej liście haseł.

Uniemożliwia to określenie, na które konto jest logowane na podstawie samego hasła, ponieważ sól do użycie nie jest znane. Dzieje się tak, ponieważ nazwa użytkownika jest używana jako klucz do wyszukiwania, a bez podania tego do serwera hasła wprowadzonego w kroku pierwszym nie można dopasować bez sprawdzania każdego skrótu w tabeli użytkowników, dopóki nie zostanie znalezione dopasowanie. W prawidłowo skonfigurowanym systemie byłoby to zbyt wolne, ponieważ używasz powolnego algorytmu (patrz przypis).

Ponadto byłby to ogromny wyciek informacji o bezpieczeństwie, gdyby system powiedział, że Twoje hasło jest używany przez inną osobę.

Powyższy przykład służy wyłącznie do celów ilustracyjnych i używa MD5. Nigdy nie używaj MD5 do haszowania haseł - użyj bcrypt, scrypt lub pbkdf2.

Czekaj, co? Sól do użycia * jest * znana, jest tam przechowywana tuż obok skrótu hasła ...
Nazwa użytkownika jest używana jako klucz do wyszukiwania, którego skrótu użyć. OP pytał, dlaczego system nie może najpierw poprosić o hasło - powodem jest to, że system nie wiedziałby, na podstawie której soli ma haszować wprowadzone hasło bez nazwy użytkownika do wyszukania.
Nikt jednak nie powiedział, że hasło musi zostać zaszyfrowane przed uzyskaniem nazwy użytkownika ... Pytanie dotyczyło front-endu, a nie back-endu questino.
„ponieważ sól, której należy użyć, nie jest znana”. -> Na wypadek, gdyby było to przyczyną zamieszania, problem polega na tym, że nie znasz odpowiedniej soli do hasła, dla którego obliczasz skrót. Teoretycznie możesz przejść przez każde konto i obliczyć skrót na podstawie soli i hasła. Jednak byłoby to zbyt wolne, aby było praktyczne, jeśli masz więcej niż kilku użytkowników.
@underscore_d: Przegapiłeś kluczową część mojego komentarza.
@Mehrdad Więc tak zrobiłem! Przepraszam. Skasuję teraz mój głupi komentarz.
Black
2015-09-10 02:07:43 UTC
view on stackexchange narkive permalink

Czy nie pytasz po prostu „Czy jest jakiś powód, dla którego nie mamy publicznych haseł i prywatnych nazw użytkowników?”

Oba są po prostu ciągami tekstowymi. Twój pomysł na wymuszanie unikalnych haseł polega tak naprawdę na tym, że nazwy użytkowników są niepowtarzalne. Etykieta, którą zastosujesz do pola tekstowego, nie ma znaczenia. Ciąg, który jest prywatny, nazywamy hasłem, a unikalny nazwą użytkownika lub identyfikatorem użytkownika, ponieważ jest unikalny.

Pod względem bezpieczeństwa i patrząc na to w normalnej kolejności Login / Hasło : Jeśli chcesz, aby oba były unikalne, otworzyłbyś atak na bazę danych, ponieważ każde sprawdzane hasło byłoby sprawdzane pod kątem każdego użytkownika w bazie danych ponieważ wymagałeś, aby Twoje hasła były unikalne . Więc jedno i drugie nie działa. Obie wartości nieunikatowe nie działają, ponieważ nie wiesz, do którego konta uzyskiwany jest dostęp. Pozostaje więc tylko jeden unikalny ciąg. Jeśli tworzysz pojedynczy unikalny ciąg tekstowy, równie dobrze możesz uczynić go publicznym fragmentem danych i najpierw to sprawdzić (i nazywamy te dane Login / ID / Nazwa użytkownika).

@PascalSchuppli Mówi, że nawet jeśli nie miałeś zamiaru zamieniać znaczeń haseł i nazw użytkowników, nie ma sposobu na zaimplementowanie tego systemu w sposób, w którym _nie_ zamieniasz ich znaczenia. Jeśli hasło jest pierwsze, musi być niesolone. Jeśli jest niesolona, ​​znajduje się w pliku gdzieś w postaci zwykłego tekstu. Jeśli jest to zwykły tekst, potrzebujesz informacji, której _ nie jest_, a Twoim jedynym kandydatem w tej chwili byłaby nazwa użytkownika. Więc musiałbyś posolić nazwę użytkownika hasłem i ...
przechowuj hash solonej nazwy użytkownika. _Wówczas_ system byłby bezpieczny. Ale jednocześnie całkowicie odwróciłbyś definicje hasła i nazwy użytkownika.
@PascalSchuppli Twoje hasła tracą entropię, ponieważ atakujący uzyskuje równoległą przewagę w systemie. Jeśli stworzono 1 milion haseł, czyli 1 milion mniej, musisz sprawdzić, nawet w przypadku, gdy system zacznie „działać”. To jak losowe generowanie hasła, ale wyrzucanie go, jeśli nie jest to słowo. Ten system nie jest bezpieczny. I jak już zostało powiedziane, jeśli nie sprawisz, że to „działa” (jeśli istnieje metoda sprawdzenia więcej niż jednego użytkownika niż raz, np. Formularz zmiany hasła, zarejestruj się), otrzymasz po 1 milionie tych zredukowanych kontroli entropii kiedy wysyłasz zapytanie.
@PascalSchuppli * "nazwy użytkownika są łatwe do odgadnięcia, nawet jeśli nie są znane publicznie z założenia" * Oczywiście nigdy nie spotkałeś systemu, który używa (co prawda okropnej) konwencji: "Twoja nazwa użytkownika to h0j7k # X1P% 3. Twoje domyślne hasło to twoje nazwisko. " Istnieją (chociaż nie mam pojęcia, dlaczego).
Keavon
2015-09-10 04:10:25 UTC
view on stackexchange narkive permalink

Wyobraźmy sobie analogię ...

Jestem posłańcem wysłanym przez mojego króla, aby dostarczyć wiadomość do pewnego zamku w Dolinie Zamków. Wiem, jak wygląda zamek, do którego chcę się udać, i otrzymałem hasło, aby powiedzieć strażnikowi, żebym mógł wejść do zamku.

Mam dwie możliwości, jak to zrobić:

  1. Jak można się bez wątpienia spodziewać, konwencjonalnym sposobem na to jest pojechanie do zamku, do którego zostałem wysłany, a następnie podanie hasła dostępu. Najpierw jest to użycie moje informacje publiczne (zamek, widoczne dla każdego, kto chce go obejrzeć), aby zalogować się przy użyciu moich prywatnych informacji (hasła).

  2. Ale jest odwrotny sposób, aby Zrób to. Mogę wziąć klakson i wykrzyczeć moje hasło po całej dolinie, aby publiczność mogła go słuchać. Ponieważ zamek, który zamierzam odwiedzić, usłyszał moje hasło (wraz ze wszystkimi innymi zamkami i potencjalnie nikczemnymi mieszkańcami doliny), zamek, który odwiedzam, powinien wiedzieć, że mnie oczekuje.

    Następnie kontynuuję konno do właściwego zamku i przejedź przez otwarty most zwodzony. Ale wpuściliby każdego przez ten otwarty most zwodzony! Teraz, gdy moje prywatne informacje zostały udostępnione światu, każdy może jeździć między zamkami i wejść do tego z otwartą bramą.

    Jeśli mnie tu nie ma, żeby krzyczeć to w róg, mieszkańcy doliny mogli stać na szczycie wzgórza z własnym rogiem, wykrzykując bełkot przez dolinę, aż usłyszą łoskot otwieranego mostu zwodzonego; wiedząc, że odgadli poprawnie hasło, muszą po prostu jeździć między zamkami, aż znajdą otwarte.

Pierwsza opcja jest taka, jak zwykle się to robi. Nie ma powodu, aby zmieniać tę konwencję. Alternatywa jest możliwa, ale udostępniając najpierw swoje prywatne informacje, znacznie ułatwiasz odgadnięcie hasła wszystkich naraz przed uwierzytelnieniem za pomocą informacji publicznych, tj. Jazdy do każdego zamku lub wypróbowania wszystkich publicznie nazwy kont. Przy tysiącach zamków w tej dolinie lub kontach na stronie internetowej jest całkiem prawdopodobne, że ktoś odgadnie łatwe hasło, a wtedy o wiele łatwiej będzie po prostu dopasować je do jednego z kilku tysięcy zamków lub nazw kont publicznych.

Analogia A +, przeczytałabym ponownie
Kolejność, w jakiej informacje są gromadzone, nie ma znaczenia dla tego, czy informacje mogą być szyfrowane, czy nie. Ostatnie zdanie odpowiedzi rekompensuje to jednak, ponieważ to / może / pozwala na łatwiejsze ataki mechanizmu zachęty zapewnia natychmiastową informację zwrotną o nieprawidłowym haśle przed monitem o podanie nazwy użytkownika. Ale to jest drugi problem.
Doryx
2015-09-10 09:00:55 UTC
view on stackexchange narkive permalink

Firma Google nie wymaga podania adresu e-mail w pierwszej kolejności ze względów bezpieczeństwa. Musisz wpisać swój adres e-mail / nazwę użytkownika, więc jeśli logujesz się do domeny służbowej lub edukacyjnej, która chce mieć własną stronę docelową dla logowania jednokrotnego / SAML

To dobra uwaga (przeglądanie internetu robi to samo). Może jednak istnieć drugorzędny powód zabezpieczenia / zmniejszenia obciążenia / ograniczenia szybkości sondowania kont.
Może tak jest w przypadku Google, ale w wielu systemach ** ze względów bezpieczeństwa najpierw podaje się nazwę użytkownika: [wzajemne uwierzytelnianie] (https://en.wikipedia.org/wiki/Mutual_authentication).
dannysauer
2015-09-10 17:28:25 UTC
view on stackexchange narkive permalink

Jeśli najpierw poprosisz o hasło, musisz w pewnym stanie zachować wartość „sekret”, czekając na nazwę użytkownika. W przypadku aplikacji internetowej zazwyczaj trzeba w jakiś sposób zrobić to miejsce, aby nowy proces mógł odczytać wartość, ponieważ nazwa użytkownika pojawiłaby się przy drugim żądaniu. Zwiększa to szansę na ujawnienie ciągu hasła, zarówno pod względem czasu, jak i sposobów dostępu do danych.

Pytając najpierw o nazwę użytkownika, weryfikacja hasła za pomocą zasolonego haszowania (lub nie) może już mieć dostęp do wszystkiego, co jest niezbędne do natychmiastowej weryfikacji hasła, a system musi mieć dostęp do samego hasła tylko przez minimalny czas. Generalnie najlepiej jest mieć dostęp do poufnych danych przez jak najkrótszy czas.

I taka jest konwencja. Pytając najpierw o hasło, w końcu przeszkolisz użytkowników, jak przypadkowo wpisują swoje hasło w polach nazwy użytkownika w innym miejscu, co prawdopodobnie skutkuje ujawnieniem ich w dziennikach.

Nie rób tego. :)

Plus jeden do wpisywania haseł w polach nazwy użytkownika. Naprawdę wielkie nie, nie
I jeszcze jeden za wspomnienie o najwyraźniej często pomijanym fakcie, że pierwsze przyjęcie (artysty znanego wcześniej jako) `` hasła '' nie wymaga, aby było ono całkowicie niesolone, ponieważ można je później zasolić, ale opóźnienie czasowe stanowi kolejną lukę w zabezpieczeniach (raczej dziwne, a nawet po prostu zamiana definicji) pomysł.
Ombongi Moraa
2015-09-10 16:07:41 UTC
view on stackexchange narkive permalink

Aby dodać; o mechanizmie identyfikacji vs uwierzytelniania / weryfikacji decyduje się podczas tworzenia aplikacji. Identyfikacja to 1: wiele , weryfikacja / uwierzytelnienie to 1: 1

  1: 1 - dopasowanie do jednego wstępnie wybranego zestawu wyników; 1: wiele - pasuje do wszystkich wyników w bazie danych  

Nazwy użytkowników, takie jak Gmail, są unikalne. Nie jest to obowiązkowe dla wszystkich aplikacji, ale z pewnością ułatwia życie algorytmowi weryfikacji w przeciwieństwie do algorytmu identyfikacji.

Weź pod uwagę popularną nazwę użytkownika, a następnie hasło uwierzytelniania dla Gmaila:

  1. wprowadź nazwę użytkownika;

    gmail dopasowuje unikalną nazwę użytkownika do wszystkich innych unikalnych nazw użytkowników; Tak, dopasuj, wprowadź hasło; Brak dopasowania, brak dostępu.

  2. Wpisz hasło.

    Gmail dopasowuje po prostu 1 nazwę użytkownika do 1 hasła przechowywanego w dowolnym formacie; Brak dopasowania, uwierzytelnianie nie powiodło się. Tak, dopasuj, uzyskaj dostęp do swojej poczty.

Całkiem proste IMHO.

Po drugiej stronie, identyfikacja (1: wiele), proces dopasowywania z gmail wyglądałoby tak:

  1. wprowadź hasło; i jak jasno wskazał @SilverlightFox, wiele kont może mieć to samo hasło.

      algorytm dopasowania dopasowuje hasło do WSZYSTKICH nazw użytkowników zarejestrowanych w bazie danych Gmaila.  

    Zbyt konserwatywny zestaw wyników może zawierać 10 nazw użytkowników.

  2. Wpisz nazwę użytkownika;

To, czy nazwy użytkowników są unikalne, czy mogą być takie same, zadecyduje o dłuższym czasie procesu uwierzytelniania i liczbie znalezionych dopasowań. Jeśli pasuje więcej niż 1, będziemy musieli wdrożyć 3-etapowe uwierzytelnianie logowania.

Dwuetapowe uwierzytelnianie ułatwia życie programistom i algorytmowi.

jhash
2015-09-28 23:44:10 UTC
view on stackexchange narkive permalink

W przypadku Google i większości konfiguracji podzielonego uwierzytelniania, system zasadniczo używa identyfikatora użytkownika do zidentyfikowania związanego z nim ryzyka i określenia odpowiedniego procesu logowania, który powinien przeprowadzić dla użytkownika.

W przypadku W większości tych sytuacji identyfikator użytkownika wprowadzony przez osobę jest tylko jednym z rozważanych danych wejściowych. Wraz z nim wiele innych informacji (np. Adres IP, z którego uzyskujesz dostęp, urządzenie, z którego korzysta użytkownik - jest generowany i przekazywany podpis urządzenia wraz z identyfikatorem użytkownika) jest przekazywanych do silnika określania ryzyka (w większości banków ale nie zawsze mogą być używane), co może sugerować proces logowania. Oprócz tego system sprawdza politykę logowania powiązaną z użytkownikiem (tj. Czy ma na przykład włączoną wieloskładnikową). Opierając się na ostatecznym ustaleniu, w większości przypadków możesz otrzymać prosty ekran hasła, ale w niektórych przypadkach możesz zostać poproszony o przejście do wielu procesów uwierzytelniania (np. OTP przez telefon itp.).



To pytanie i odpowiedź zostało automatycznie przetłumaczone z języka angielskiego.Oryginalna treść jest dostępna na stackexchange, za co dziękujemy za licencję cc by-sa 3.0, w ramach której jest rozpowszechniana.
Loading...