Jak wdrożyć bezpieczną historię haseł

23

Hasła nie należy przechowywać w postaci zwykłego tekstu z oczywistych względów bezpieczeństwa: musisz przechowywać skróty, a także należy ostrożnie generować skrót, aby uniknąć ataków na tęczową tablicę.

Zwykle jednak wymagane jest przechowywanie ostatnich n haseł i wymuszanie minimalnej złożoności i minimalnej zmiany między różnymi hasłami (aby uniemożliwić użytkownikowi korzystanie z sekwencji takiej jak Hasło_1, Hasło_2, ..., Hasło_ n ). Byłoby to trywialne w przypadku haseł tekstowych, ale jak możesz to zrobić, przechowując tylko skróty?

Innymi słowy: jak można wdrożyć bezpieczny mechanizm historii haseł?

Wizard79
źródło
2
Powiązane: security.stackexchange.com/questions/4704/… (i BTW ta strona może być lepszą lokalizacją dla tego pytania). Jeśli chodzi o „minimalną zmianę”, nie mogę wymyślić żadnej alternatywy dla wygenerowania wszystkich opcji, które można by zakwalifikować jako „minimalną zmianę” (która może być DUŻO w zależności od twojej definicji!) I porównania skrótów. Jaka jest definicja „minimalnej zmiany”?
Kevin Vermeer
7
Przechowywanie najnowszych n haseł oznacza tylko, że użytkownik wybierze sekwencję od 1 do n + 1 .
Joachim Sauer
11
Jestem bardzo sceptyczny, że taka polityka haseł poprawia bezpieczeństwo; IMHO, zwiększa szanse, że ludzie uciekną się do trzymania swojego hasła na karteczce. Link do Kevina to dobra dyskusja. @KevinVermeer - faktycznie można zmierzyć wielkość zmiany jako odległość Levenshteina ( en.wikipedia.org/wiki/Levenshtein_distance ), znaną również jako „odległość edycji”.
Nathan Long,
5
Jeśli twoje bezpieczeństwo jest tak surowe, równie dobrze możesz wygenerować losowe hasło dla użytkownika, zmusić go do korzystania z niego i zmieniać je w regularnych odstępach czasu. W ten sposób masz całkowitą kontrolę nad ich hasłem.
Reactgular,
2
@nathan: Przechowywanie haseł na karteczkach jest w rzeczywistości bezpieczne. Nie można zaatakować hasła, jeśli nie masz fizycznego dostępu do karteczki - eliminując około 99% zagrożeń. Umieść tę notatkę w portfelu lub torebce, a po prostu musisz ją nękać, aby ją zdobyć - co oznacza, że ​​naruszenie bezpieczeństwa zostało zidentyfikowane i można je złagodzić.
mattnz

Odpowiedzi:

22

Przechowuj skróty i weryfikuj wprowadzone hasło względem przechowywanych skrótów, w ten sam sposób, w jaki weryfikujesz hasło podczas logowania. Aby wygenerować „minimalne” zmiany, musisz wygenerować „alternatywne” hasło z podanego na podstawie wzorców numerycznych.

Przy logowaniu weryfikujesz już wprowadzone hasło w haszu, nie ma potrzeby przechowywania hasła w postaci zwykłego tekstu. Ta sama sztuczka działa, jeśli chodzi o zmianę hasła, wystarczy sprawdzić wprowadzone hasła i wygenerowane hasła „minimalnej zmiany” względem historycznych skrótów. Jeśli nowe hasło jest zadowalające, przenieś bieżący skrót hasła do zestawu historycznego i zastąp go nowym skrótem dla nowego hasła.

Martijn Pieters
źródło
Tak więc, jeśli użytkownik wprowadzi hasło6 , powinienem wykryć część liczbową i spróbować na przykład hasła4 , hasła5 , hasła7 itd. Czy to jest poprawne?
Wizard79
4
@Lorenzo: Poprawnie. Generowanie alternatyw może być tak złożone, jak chcesz, po prostu upewnij się, że znajdziesz właściwy kompromis między złożonością a ryzykiem (nie pozwól użytkownikom czekać 5 minut, sprawdzając wszystkie możliwości z zniknięciem prawdopodobieństwa bycia ryzykiem).
Martijn Pieters
Nie jestem pewien, czy sugerowanie dodawania numeru na końcu jest dobrą propozycją dla użytkowników - to tylko trochę przewidywalne. I robi się wykładniczo bardziej, jeśli każesz użytkownikom to zrobić.
Wyatt Barnett
2
@WyattBarnett: Nikt nie mówi użytkownikom, aby to zrobili. Chodzi o to, aby wykryć użytkowników i uniemożliwić użycie hasła „przyrostowego”.
Martijn Pieters
Ach, całkowicie źle coś tu odczytałem. Przepraszam.
Wyatt Barnett
28

Gdy użytkownik zmieni swoje hasło, poproś go o podanie poprzedniego hasła. Masz teraz dostęp do dwóch haseł zwykłego tekstu, nawet jeśli nie przechowujesz haseł zwykłego tekstu w bazie danych.

Wykonaj dowolną weryfikację tych dwóch haseł. Nie zapobiegnie to naprzemiennemu korzystaniu przez użytkownika z dwóch haseł (z sufiksem - możesz zapobiec bezpośredniej naprzemienności według sugestii w innych odpowiedziach), ale zapobiegnie to bardziej rażącym przypadkom.

Brian
źródło
Jest to z pewnością sprytne obejście, jeśli nie masz wymogu testowania n wcześniejszych haseł, jednak sugestia wygenerowania alternatyw na czas jest lepsza. Ale generowanie alternatyw dla obu haseł jest jeszcze lepsze!
Wizard79,
2
@Lorenzo: Chodzi o to, że wykonujesz bezpośredni test na n poprzednich haseł i silniejszy test na ostatnie hasło. To kompromis.
Brian
Tak. Jeśli ich bieżące hasło to potatoSalad1i chcą je zaktualizować potatoSalad2, oznacza to, że zmiana jest zbyt mała, ponieważ w tym momencie masz oba hasła w postaci zwykłego tekstu. Ale dalej: masz tylko skróty, a natura skrótów polega na tym, że nie możesz stwierdzić, czy dwa skróty miały podobny lub zupełnie inny zwykły tekst jako dane wejściowe.
Nathan Long
7

aby dodać do odpowiedzi @ martijnPieter, minimalną zmianę można wprowadzić, wykonując krótką brutalną siłę w oparciu o nowe i poprzednie hasła (które oboje macie dostępne)

na przykład możesz iterować po wszystkich hasłach o odległości hamowania 1 lub 2 od nowego hasła i sprawdzić, czy pasuje do starego hasła

ale możesz zauważyć, że może to zmniejszyć zaufanie użytkowników do haszowania haseł (ponieważ zasadniczo mówisz, że możesz odzyskać poprzednie hasło, aby odrzucić nowe hasło)

maniak zapadkowy
źródło
Ale istnieje wiele sekwencji o większych odległościach Hamminga, takich jak luty 2012 r. -> marzec 2012 r. Lub pt. 09–28–12 -> wt. 11–27–12 (daty), hasło_Alpha -> hasło_Beta, hasło_1111 -> hasło_2222, hasło_wer, hasło_uiui, Podaj, _op [] lub Jedenaście -> Dwanaście (alternatywne systemy liczenia) lub FrankSmith -> FredJones -> FriarTuck lub gniew -> zwierzę -> jabłko (nazwy w katalogu firmy lub słowa w słowniku), że osoba atakująca za pomocą poprzednie hasło (hasła) łatwo odgadnąć, ale wygenerowanie przez algorytm bardzo trudnego czasu.
Kevin Vermeer
@KevinVermeer następnie weź pod uwagę generatory odmian w tobie i zaakceptuj, że nigdy nie dostaniesz wszystkiego
grzechotka
+1 do zmniejszenia zaufania. Kiedy widzę coś, co mówi mi, że moje hasło jest zbyt podobne do tego, którego użyłem trzy miesiące temu, od razu zastanawiam się, czy przechowują je w sposób odwracalny ... czy mają wspaniałego programistę. Sceptycyzm zwykle wygrywa.
Tim Post
5

To naprawdę bardziej dodatek do sprytnej odpowiedzi @ Briana. Czapki z głów również dla @Martijn Pieters za dodanie szczegółowych informacji o tym, jak brutalnie wymusić stare hasła w oparciu o bieżące, oraz dla maniaka @ratchet dla „dystansu hamującego”. Nie usuwam mojej odpowiedzi, ponieważ uważam, że stanowi ona ciekawe tło do tworzenia kopii zapasowych.

Najnowocześniejsze przechowywanie haseł wymaga użycia wielu rund silnego jednokierunkowego skrótu kryptograficznego (SHA-512 +) z unikalną solą (128 bitów +) dla każdego użytkownika. Ale nie kusz się, aby przechowywać dodatkowe informacje o każdym haśle. Im więcej informacji o każdym haśle będziesz przechowywać, tym bardziej podważasz bezpieczeństwo swojego algorytmu mieszającego.

Przykład

Zastanów się, jak łatwo można wymusić hasło, jeśli wiesz, że:

  • Ma 7 znaków
  • Znaki 3-5 są dużymi literami (4 to małe)
  • 1 i 7 są liczbami
  • 6 to symbol

Klawiatura amerykańska ma 95 znaków do wydrukowania, więc znajomość hasła o długości 7 znaków daje 95 ^ 7 = 69 883 729 610 000 = permutacje 7x10 ^ 13. Gdyby było naprawdę losowe, złamanie tego na pojedynczym procesorze 3Ghz zająłoby rok. Ale:

  • Jest tylko 26 wielkich i 26 małych liter
  • Jest tylko 10 cyfr dających 100 możliwości dla tych dwóch liczb
  • Jest tylko 32 symboli

Tak (poprawione dzięki @Hellion):

         26^4 (charcters 2-5 are known upper or lower-case)
        x 100 (characters 1 & 7 are digits)
        x  32 (character 6 is a symbol)
         ====
1,462,323,200 possible passwords.

To 50 000 razy łatwiejsze do złamania! Przechowywanie dobrych informacji w celu uniknięcia podobnych haseł w tym przypadku zabrało Ci złamanie 7-znakowego hasła z roku do kilku godzin. Dekodowanie wszystkich haseł na potężnym komputerze wieloprocesorowym z dobrą kartą wideo i odrobiną cierpliwości jest teraz bardzo wykonalne. Mam nadzieję, że ten prosty przykład pokazuje, że im bardziej sensownie możesz porównać podobne hasła, tym mniej bezpieczne będzie twoje haszowanie.

Znaczenie silnego mieszania

Bazy danych z hasłami są regularnie kradzione, z niesamowitymi włamaniami do wiadomości co miesiąc. Heck, w zeszłym miesiącu stan SC stracił numery ubezpieczenia społecznego wszystkich - ups! Ile jeszcze tych naruszeń jest objętych ochroną?

Myśl końcowa

Najbardziej przerażające jest dla mnie to, że ludzie wybierają to samo lub podobne hasło do wielu witryn, aby włamanie się do jednego umożliwiło atakującemu dostęp do nich wszystkich. Chciałbym zobaczyć sprawdzoną metodę zapobiegania tej sytuacji, choć uważam, że zapobieganie najczęstszym złym hasłom pomógłoby bardziej niż zapobieganie ponownemu użyciu przez użytkownika złego hasła w tej samej witrynie. Najlepsze, co mogę zasugerować, to ogólna polityka firmy dotycząca korzystania z bezpiecznego menedżera haseł, który generuje losowe hasła dla każdego z użytkowników i przechowuje je bezpiecznie.

GlenPeterson
źródło
1
drobna nit: możliwości hasła są wciąż multiplikatywne, więc jest to (26 ^ 4) * 100 * 32 = 1462323200. Jeśli założymy, że złamanie możliwości (95 ^ 7) zajmuje rok, to złamanie tej mniejszej liczby zajmie około 11 minut.
Hellion
@Hellion - Ups! Dzięki za zwrócenie na to uwagi. Poprawiłem to.
GlenPeterson
1

Po pierwsze, możesz przechowywać skróty dla ostatnich „n” poprzednich haseł, abyś mógł sprawdzić, czy ich nowe hasło powiela poprzednie hasło. Masz również zwykły tekst aktualnego hasła (ponieważ zalogowali się lub podali Ci je w celu uwierzytelnienia żądania zmiany hasła), a także nowe hasło, dzięki czemu możesz sprawdzić minimalne zmiany między tymi dwoma hasłami.

Jeśli (dla Ciebie) bardzo ważne jest bezpośrednie porównanie tych dwóch haseł z poprzednimi hasłami „n”, musisz je zapisać (zaszyfrowane), aby móc je później odzyskać.

Chociaż może to być postrzegane jako luka w zabezpieczeniach, można zaimplementować metody szyfrowania w celu zapewnienia wystarczającego bezpieczeństwa.

  1. Przechowuj każde hasło (zaszyfrowane) dla ostatnich „n” haseł.
  2. Przechowuj datę i godzinę utworzenia ostatniego hasła.
  3. Przechowuj skrót najnowszego hasła.
  4. Zaszyfruj wszystkie hasła, używając skrótu (solonego) bieżącego hasła, znacznika czasu utworzenia hasła i być może czegoś w rodzaju numeru konta lub adresu e-mail.
  5. Odszyfruj i ponownie zaszyfruj wszystkie hasła za każdym razem, gdy tworzone jest nowe hasło.

Następnie za każdym razem, gdy hasło zostanie zmienione, możesz odszyfrować wszystkie stare hasła i wykonać wszystkie testy minimalnej zmiany.

Teraz, jeśli ktoś zna hasło tej osoby i zna wszystkie pozostałe niezbędne szczegóły, może odszyfrować te informacje dla tej jednej osoby. Ale jeśli mają już hasło tej osoby, mogą już zalogować się jako ta osoba i uzyskać dostęp do konta tej osoby.

Ponadto w przypadku starych haseł może nie być konieczne przechowywanie ich w czystym tekście. Można je przechowywać w jakiś zaciemniony sposób. Lub przechowywane jako alfabetyczna lista znaków w haśle.

Nie twierdzę, że jest to zalecana rzecz do zrobienia w ogólnym przypadku, ale zakładając, że zadanie, które opisałeś, jest wymagane w twoim przypadku, jest to jeden ze sposobów na wykonanie tego z pewnymi środkami bezpieczeństwa.

Kevin Fegan
źródło
Ta odpowiedź zawiera kilka okropnych sugestii dotyczących bezpieczeństwa. Nie powinniśmy mieć możliwości łatwego odszyfrowania haseł ani przechowywania ich w „zaciemniony sposób” zamiast silnego szyfrowania.
user45623,