Na wolności mamy tabelę użytkowników. Tabela użytkowników to zwykle
ID | nazwa użytkownika | sól | zaszyfrowane_hasło | horridly_insecure_reset_key =================================================== ========================== 1 | użytkownik1 | foo | 09b6d39aa22fcb8698687e1af09a3af9 | NULL2 | użytkownik2 | bar | 6c07c60f4b02c644ea1037575eb40005 | NULL3 | użytkownik3 | baz | 09b6d39aa22fcb8698687e1af09a3af9 | reset
Wtedy metoda uwierzytelniania będzie wyglądać mniej więcej tak:
def authentication (user, password) u = User.find (user: user) return u. encrypted_password == encrypt (hasło + u.salt) end
Posiadanie soli na użytkownika zapewnia, że nawet jeśli znane jest hasło użytkownika 1, nie można znaleźć hasła użytkownika 2 lub użytkownik3 bez ich soli.
Aby upewnić się, że nie możesz rozwiązać problemu, masz zestaw zaszyfrowanych haseł i wypróbowując kilka zaszyfrowanych haseł.
W ten sposób każdy atak na użytkownik musi być uruchomiony od zera.
Nawet jeśli napastnik ma listę użytkowników i soli, nadal musi dokonać włamania do każdego użytkownika, aby sprawdzić, czy ma pasujące hasło. Gdybyś miał pulę soli lub jedną statyczną sól, mógłbym wiedzieć, że hasło użytkownika 1 to hasło, a następnie po prostu znaleźć wszystkie zaszyfrowane hasła, które pasują. Więc w ten sposób przynajmniej trochę je spowalnia.
Teraz, gdy patrzymy na sole, chcemy ograniczyć ponowne użycie soli. Dwie identyczne sole ułatwią napastnikom. Jeśli dwie osoby mają tę samą sól i to samo hasło, złamanie jednego użytkownika spowoduje złamanie drugiego.
Powiedzmy, że używamy tylko tych trzech soli. Mamy 3000 użytkowników. oznacza to, że 1000 osób ma tę samą sól. Jeśli 1% z nich ma hasło „hasło”, wówczas wszystkie te osoby mogą zostać złamane w tym samym czasie. 10 kont zostaje zhakowanych jednocześnie. Ponieważ znamy te trzy sole. To bardzo łatwy odcinek, aby zaatakować 30 osób jednocześnie.
Teraz, jeśli każda sól jest wyjątkowa. Wiemy, że hasło użytkownika 1 to hasło, ale to nic nie da. Nadal złamałeś tylko 1 użytkownika. Nadal musisz zrobić „czy hasło + sól = zaszyfrowane hasło” dla wszystkich pozostałych 2999 użytkowników.
Naprawdę ważna uwaga.
Bezpieczeństwo poprzez zaciemnienie to nie bezpieczeństwo. To nie znaczy, że powinieneś publikować tabelę użytkowników w Google, bo to głupie. Jednak mierząc poziom bezpieczeństwa, należy założyć, że osoba atakująca ma wszystko. Nie możesz powiedzieć: „Ale oni nie będą znali soli aplikacji, ponieważ nie mają kodu źródłowego”. Bo mogli. Nie oznacza rozdawania soli, po prostu oznacza, że nie jest to prawdziwe zabezpieczenie. Załóżmy, że mają nazwę użytkownika i sól, a następnie spróbuj utrudnić im uzyskanie hasła.
BARDZO WAŻNA UWAGA
użyty tutaj kod i tabela są około 9 000 razy zbyt proste do rzeczywistego użycia. Hasło nie jest zaszyfrowane, sole są zbyt krótkie, metoda jest trochę za uproszczona, w skrócie robienie czegoś takiego na produkcji nie jest czymś, co należy uznać za bezpieczne. Wybrałem te przyczyny, które są proste dla celów demonstracyjnych, a nie dlatego, że są bezpieczne.