2013-01-21 16 views
10

Powiel możliwe:
Secure hash and salt for PHP passwordsNazwa użytkownika, hasło, solenie, szyfrowanie, hasz - jak to wszystko działa?

Iv'e przeczytać wiele stanowisk zarówno w stackoverflow i innych witryn internetowych mówiących o bezpieczeństwie internetowym. Takie jak solenie szyfrujące itp. I nie wiem, jak to zrobić, więc proste wyjaśnienie byłoby naprawdę pomocne.

Oto, co wiem do tej pory. Użytkownik loguje typy swojej nazwy użytkownika i hasła. Wejście następnie przechodzi przez proces. Powiedzmy, że nazwa użytkownika i hasło są połączone, jak na przykład:

$username = (USERS USERNAME INPUT); 
$password = (USERS PASSWORD INPUT); 
$userinput = $username . $password; 

Następnie dodajemy trochę soli.

$salt1 = "13$13aVc!kd"; 
$salt2 = "4kr$!vlmeoc"; 

$salted = $salt1 . $userinput . $salt2; 

Następnie szyfrujemy.

$encrypted = encrypt($salted); 

Następnie sprawdzić w bazie danych, a jeżeli jego prawo użytkownik zostanie zalogowany.

To jak to działa dobrze? Ale Iv'e czytał o ataku brutalnej siły. Zgaduje wartości wejściowe w prawo? Zgodnie z powyższą procedurą. Czy nie pokazuje, że atakujący musi jedynie uzyskać poprawne informacje o $ userinput? Nie musi odgadywać, że długi zaszyfrowany ciąg znaków jest poprawny?

Uwaga: Powiedzmy, że w tej sytuacji nie ma captcha, nie ma limitu prób, nie ma blokady, nic poza powyższym.

Uwaga: Bądź łagodny Nadal uczę się.

+1

Dlatego użytkownicy powinni używać silnego hasła zamiast „12345” brute force, ale jest to możliwe w swoim scenariuszu .. – Deadlock

+0

więc sól i szyfrowanie jest bezużyteczny? –

+0

Sortuj, ale zaksięgowane daty, jeśli zostaną porwane, nie będą użyteczne dla porywacza, ponieważ będą w zaszyfrowanym ciągu i nie można ich cofnąć, dopóki nie będzie miał wartości soli. – Deadlock

Odpowiedz

7

Jeśli wykluczysz captcha, spróbuj limity, lokaje i tak dalej ... to tak. Musisz tylko brutalnie wymusić ciąg zwykłego tekstu.

Jednak zajmuje to czas - co najmniej jest ograniczona przez szybkość odpowiedzi serwera na żądania logowania. Nawet jeśli deweloper nie doda żadnych środków, aby zapobiec brutalnemu forsowaniu, sam serwer może tak szybko przechodzić proces szyfrowania i weryfikacji i może obsłużyć tylko tyle równoległych żądań.

Powiedział, że to dlatego ważne jest, aby

  • Jako użytkownik używać hasła silne, trudne do brute-force
  • Jako deweloper, posiadają odpowiednie środki w celu zapobieżenia brute-wymuszanie swoje logowanie proces

Hashing i solenie haseł nie jest ochrona przed ludźmi, którzy brute force naturalny proces logowania (są jeszcze inne rzeczy, które chronią przed tym). Zamiast tego mają chronić przed potencjalnym zagrożeniem związanym z przechowywaniem haseł (np. Ktoś wyrzuca zawartość bazy danych).

Zarówno mieszania i solenie służą do zmniejszenia prędkości w której ktoś z dostępem do zapisanych haseł można odzyskać ciąg zwykły tekst, że muszą być w stanie przejść przez naturalny proces logowania (witryny lub inne witryny, zważywszy, że hasła są często udostępniane między lokacjami) bez potykania się o środki bezpieczeństwa wymuszające nadużycia.

+0

@ user1429811 Jeśli chcesz przeczytać więcej, mam cały wpis na blogu na ten temat tutaj - http://codingkilledthecat.wordpress.com/2012/09/04/some-best-practices-for-web-app -poświadczenie/ – Amber

2

Pomysł haszowania i solenia jest bardziej po to, aby uniemożliwić komuś przejęcie haseł użytkownika, jeśli sama baza danych została naruszona. Jeśli hasła są przechowywane jako solone i mieszane, atakujący nie może ich użyć do uzyskania dostępu do konta użytkownika w innej witrynie.

1

Szyfrowanie hasła to szyfrowanie jednokierunkowe (a raczej jego przypuszczenie, że znajduje się w bezpiecznej witrynie). To znaczy, że bierzesz hasło i tworzysz skrót. Na przykład bcrypt jest standardem, który można zaakceptować.

Jeśli jest to jednokierunkowe szyfrowanie, wiele osób zastanawia się, w jaki sposób może sprawdzić hasło. Ale po prostu hash hasłem, które użytkownik przesyła i porównuje go z tym, co zostało zapisane w bazie danych. W ten sposób, jeśli twoja baza danych zostanie skradziona, osoba atakująca musi pracować dużo ciężej.

Problem z hashowaniem hasłem jest łatwo wymuszony lub z nałożoną tęczą. Możesz google table rainbow, aby dowiedzieć się więcej na ten temat. Ale w gruncie rzeczy jest to sposób na zamianę tych skrótów z powrotem na hasła.

Wprowadź solenie. Solenie polega na dodawaniu losowych danych do każdego hasła. To atutuje tęczowymi tabelami. Znaczenie skompromitowanej bazy danych będzie oznaczać brutalną siłę. Którego używasz systemu hashowego, takiego jak bcrypt, zajmuje dużo czasu i wysiłku dla atakowanych.

Powiedziawszy to wszystko. Najlepiej nie wymyślać koła. Po prostu użyj znanego dobrego systemu autoryzacji, jeśli możesz.

0

Zobacz moją odpowiedź here

I należy wygenerować unikalne sole dla każdego wpisu podczas tworzenia skrótu.

0

Jednym z problemów z atakami typu brute force jest użycie szybkiego szyfrowania, takiego jak SHA1 lub MD5. Te funkcje są budowane, aby szybko uruchomić hasło za pomocą algorytmu. Zamiast tego możesz użyć metody Blowfish, która nie jest ekspertem, ale długa historia wymaga więcej obliczeń dla zwróconej wartości niż SHA1 lub MD5. Oznacza to, że może zająć 5 lat, aby brutalnie wymusić hasło, zaszyfrowane z Blowfish z powodu czasu obliczeń.

Kolejnym przykładem jest wykonany z SHA1 i MD5, więc jest podatny na Bruteforce ataków, jednak część soli powinno być OK, aby użyć:

$salt = md5(microtime().uniqueid()); 

wyjście to unikalna sól 32 charecter, które będą razem z hasłem.

$passwod = $_POST['password']; 
$hashed_password = sha1($password.$salt); 

Teraz należy przechowywać zarówno hasło, jak i sól w bazie danych. A kiedy sprawdzasz hasło wejściowe użytkownika, dostajesz sól i mieszankę.

$temp_pass = $_POST['temp_pass']; 
$salt = //from database; 
$database_pass = //hashed pass from database; 

$hashed_temp_pass = sha1($temp_pass.$salt); 

if(hashed_temp_pass == $database_pass){ 
//Welcome user! 
} 
else{ 
//go away 
} 
Powiązane problemy