Po pierwsze, kilka ważnych terminów:
Haszowanie - czynność polegająca na pobraniu łańcucha i utworzeniu sekwencji znaków, których nie można przywrócić do oryginalnego ciągu.
Szyfrowanie symetryczne - (zwykle określane po prostu jako „szyfrowanie”) - czynność polegająca na pobraniu ciągu znaków i utworzeniu sekwencji znaków, które można odszyfrować do oryginalnego ciągu przy użyciu tego samego klucza szyfrowania, który go zaszyfrował.
Rainbow Table - tabela przeglądowa zawierająca wszystkie odmiany znaków zahaszowanych w określonym algorytmie haszującym.
Sól - znany losowy ciąg dołączany do oryginalnego ciągu przed jego zhaszowaniem.
W przypadku .NET Framework Bcrypt nie ma jeszcze zweryfikowanej implementacji referencyjnej. Jest to ważne, ponieważ nie ma możliwości sprawdzenia, czy istniejąca implementacja ma poważne wady. Możesz pobrać implementację BCrypt dla .NET tutaj . Nie wiem wystarczająco dużo o kryptografii, aby powiedzieć, czy jest to dobra czy zła implementacja. Kryptografia to bardzo głęboka dziedzina. Nie próbuj budować własnego algorytmu szyfrowania . Poważnie.
Jeśli zamierzasz wdrożyć własne zabezpieczenie hasłem (westchnienie), musisz zrobić kilka rzeczy:
- Użyj stosunkowo bezpiecznego algorytmu mieszania .
- Podsól każde hasło, zanim zostanie zaszyfrowane.
- Użyj unikalnej i długiej soli dla każdego hasła i przechowuj sól z hasłem.
- Wymagaj silnych haseł .
Niestety, nawet jeśli to wszystko zrobisz, zdeterminowany haker nadal mógłby potencjalnie odgadnąć hasła, zajęłoby mu to naprawdę dużo czasu. To twój główny wróg: czas .
Algorytm bcrypt działa, ponieważ trwa pięć rzędów wielkości dłużej niż hash hasła MD5 ; (i nadal znacznie dłużej niż AES lub SHA-512). Zmusza to hakera do spędzenia dużo więcej czasu na utworzeniu tęczowej tabeli do wyszukiwania haseł, co znacznie zmniejsza prawdopodobieństwo, że Twoje hasła będą narażone na włamanie.
Jeśli solisz i haszujesz swoje hasła, a każda sól jest inna, potencjalny haker musiałby stworzyć tęczową tabelę dla każdej odmiany soli , aby mieć tęczową tabelę dla jednego solonego + zaszyfrowanego hasła. Oznacza to, że jeśli masz 1 milion użytkowników, haker musi wygenerować 1 milion tęczowych tabel. Jeśli używasz tej samej soli dla każdego użytkownika, haker musi wygenerować tylko 1 tęczową tabelę, aby pomyślnie zhakować Twój system.
Jeśli nie solisz swoich haseł, atakujący musi tylko pobrać istniejącą tabelę Rainbow dla każdej implementacji (AES, SHA-512, MD5) i sprawdzić, czy jedna z nich pasuje do skrótu. To już zostało zrobione , napastnik nie musi samodzielnie obliczać tych tabel Rainbow .
Nawet mając to wszystko, musisz stosować dobre praktyki bezpieczeństwa . Jeśli uda im się z powodzeniem użyć innego wektora ataku (XSS, SQL Injection, CSRF itp . ) W Twojej witrynie, dobre bezpieczeństwo hasła nie ma znaczenia. Brzmi to jak kontrowersyjne stwierdzenie, ale pomyśl o tym: jeśli uda mi się uzyskać wszystkie informacje o użytkowniku za pomocą ataku SQL injection lub nakłonić użytkowników do przesłania mi plików cookie za pośrednictwem XSS, to nie ma znaczenia, jak dobre jest Twoje hasło bezpieczeństwo jest .
Inne zasoby:
- Jeff Atwood: Uproszczone szyfrowanie .NET (świetne do przeglądu haszowania)
- Jeff Atwood: Właśnie się zalogowałem jako ty
- Jeff Atwood: Prawdopodobnie niepoprawnie przechowujesz hasła
- Jeff Atwood: Speed Hashing
Uwaga: proszę polecić inne dobre zasoby. Musiałem przeczytać tuzin artykułów dziesiątek autorów, ale niewielu pisze na ten temat tak wyraźnie, jak Jeff. Edytuj artykuły w miarę ich wyszukiwania.