/ / Zabezpieczenie hasłem - bezpieczeństwo, hasła, sha

Zabezpieczenie hasłem - bezpieczeństwo, hasła, sha

Obecnie używam określonego schematu zabezpieczania haseł i myślę, że mam pewne punkty do poprawy. Implementacja jest w Javie, więc wolę używać SHA-2 512 jako formy szyfrowania.

Obecnie mam model klient-serwer, więc te rzeczy mogą się zdarzyć:

  • Klient chce się zalogować, wysyła swoje hasło za jednym razem normalnym szyfrowaniem SHA-2 512 przez sieć.
  • Serwer ma hasła przechowywane wbaza danych jak na przykład SHA-2_512 (SHA-2_512 (hasło) + sól), z wewnętrznym SHA-2_512 (hasło) będącym „zaszyfrowanym” hasłem otrzymywanym przez sieć.
  • Sprawdzanie hasła odbywa się po stronie serwera i nie ma możliwości, aby cokolwiek wyciekło z serwera, jedyną możliwą luką byłoby, gdyby ktoś mógł odczytać pamięć RAM.

Mam następujące pytania:

  • Atakujący zazwyczaj tworzy ataki kolizyjnegdy chcesz zhakować hasło. Jak jednak wystarczają ataki kolizyjne? Jeśli hasło ma być używane dla innych aplikacji, takich jak Outlook.com, Facebook lub cokolwiek innego (które prawdopodobnie używają innej soli, ponieważ nie mają nic wspólnego z moimi aplikacjami), to w jaki sposób wystarczy atak kolizyjny? Nie potrzebujesz prawdziwego hasła?

  • Czy SHA-2 512 już używa iteracji? A nawet jeśli tak, to czy powinienem zmienić moje metody szyfrowania, aby automatycznie korzystać z wielu iteracji oraz ile iteracji jest preferowanych? Przeczytałem również o użyciu losowej liczby iteracji (w zakresie), w jaki sposób mogę zapisać czynnik losowy deterministycznie?

  • Czy powinienem przechowywać tajemnice systemowe dla każdej iteracji w kodzie serwera? Widzieć http://blog.mozilla.org/webappsec/2011/05/10/sha-512-w-per-user-salts-is-not-enough/ . Mógłbym przechowywać tablicę, która trzymałabystatyczny sekret dla każdej iteracji, z n-tą sekretną istotą dla n-tej iteracji. Nikt nie może znać tajemnic, są one obliczane raz (domyślam się, że szyfruję jakiś losowy ciąg), a następnie w zasadzie są przechowywane w pamięci RAM serwera.

  • Obecnie wysyłam wpisane hasło zklient na serwer jako SHA-2_512 (hasło), czy ten proces powinien zostać ulepszony, a jeśli tak, to w jaki sposób? Nie mogę używać soli, ponieważ klient nie ma dostępnej soli.

Pozdrowienia.

Odpowiedzi:

5 dla odpowiedzi № 1

TLDR: Musisz wysłać hasło za pomocą szyfrowanego kanału, takiego jak TLS. Rozważ użycie bcrypt do mieszania hasłem.

SHA-2 512 nie jest algorytmem szyfrującym, jest toalgorytm skrótu wiadomości. Algorytm szyfrowania wymaga klucza i wiadomości do zaszyfrowania. Tworzy tekst zaszyfrowany. Ważne jest to, że algorytm szyfrowania ma algorytm deszyfrowania.

ciphertext = E(key, plaintext);
plaintext = D(key, ciphertext);

Skrót wiadomości przyjmuje fragment tekstu jawnego itworzy skrót wiadomości. Nie ma odpowiedniego mechanizmu odwrotnego, aby wykonać skrót wiadomości i pobrać oryginalną wiadomość. Nie ma również tajnego klucza.

digest = hash(plaintext);

Jeśli atakujący jest w stanie uzyskać dostęp do bazy danych za pomocą skrótów, atakujący może odzyskać oryginalne hasło za pomocą brutalnego wymuszania, próbując wielu zgadnięć z algorytmem mieszania.

digest1 = hash(guess1);
digest2 = hash(guess2);    //repeat with lots of guesses

Po pierwsze, wysyłanie skrótu przez sieć to nie bezpieczne. Należy go wysłać za pośrednictwem pewnego bezpiecznego mechanizmu komunikacyjnego, takiego jak SSL. Jeśli atakujący może przechwycić hash nad komunikacją, może być w stanie wypracować hasło orignal.

ZA kolizja hash to nie to samo, co brutalne wymuszanie hasła. Kolizja mieszania jest spowodowana, gdy dwie różne wiadomości generują ten sam skrót wiadomości.

digest1 = hash(plaintext1);
digest2 = hash(plaintext2);
if ( ( plaintext1 != plaintext2 ) && ( digest1 == digest2 ) )
// hash collision

SHA-512 nie ma zaprojektowanych iteracjizapobiegać brutalnemu zmuszaniu. Zestaw algorytmów SHA jest zaprojektowany tak, aby był wydajny. Powodem dodawania iteracji podczas haszowania haseł jest zwiększenie czasu potrzebnego na wymuszenie hasła. Pomysł polegający na ponoszeniu uzasadnionej próby logowania i wykonaniu 100 iteracji jest niewielki w porównaniu z atakującym, który ma miliony haseł, z których każde wymaga 100 iteracji. Dodanie kolejnych iteracji pomaga zmniejszyć wpływ lepszych prędkości procesora (co ułatwi atakującemu szybsze wykonywanie kolejnych iteracji).

Powinieneś wykonać liczbę iteracji akonfigurowalny limit przechowywany dla każdego użytkownika. Przechowujesz więc hash, sól i liczbę iteracji dla każdego użytkownika. Oznacza to, że w przyszłości można zwiększyć liczbę iteracji, aby uwzględnić zwiększoną moc sprzętu.

Wysyłanie SHA-2 512 w postaci zwykłego tekstu nie jest bezpieczne. Powinieneś wysłać go w zaszyfrowanym kanale, takim jak SSL.

Powiedziawszy to wszystko, SHA-2 nie został zaprojektowanyalgorytm mieszania haseł. Jest przeznaczony do sprawdzania poprawności wiadomości i ma być wydajny. Rozważ użycie specjalnie skonstruowanego algorytmu mieszania haseł. Jednym z przykładów jest bcrypt. Został zaprojektowany tak, aby był trudny do obliczeń i miał wbudowaną sól i iteracje.