Zasadniczo nie trzeba używać więcej niż jednego algorytmu mieszającego.
Co musisz zrobić, to:
Używaj soli: sól nie jest używana tylko po to, aby twoje hasło było bardziej bezpieczne , służy do powstrzymania ataku tęczowego stołu. W ten sposób ktoś będzie miał cięższą pracę, próbując wstępnie obliczyć skrót dla haseł przechowywanych w systemie.
Używaj wielu interakcji: zamiast wykonywać tylko SHA (hasło + sól), wykonaj SHA (SHA (SHA (SHA (SHA (... SHA (hasło + sól)))))). Lub reprezentować w inny sposób:
hash = sha(password + salt)
for i=1 , i=5000, i++ {
hash = sha(hash + salt);
}
I wreszcie wybierz dobrą funkcję haszującą. SHA, MD5 itp. Nie są dobre, ponieważ są zbyt szybkie . Ponieważ chcesz używać skrótu do ochrony, lepiej użyj wolniejszych skrótów. Spójrz na Bcrypt , PBKDF2 lub Scrypt , na przykład.
edytuj : po spostrzeżeniach spróbujmy zobaczyć kilka punktów (przepraszam, długie wyjaśnienie, aby dojść do końca, ponieważ może to pomóc innym w poszukiwaniu podobnych odpowiedzi):
Jeśli twój system jest bezpieczny, tak jakby nikt nigdy nie uzyskał dostępu do przechowywanego hasła, nie potrzebujesz hasha. Hasło byłoby tajne, nikt go nie dostanie.
Ale nikt nie może zagwarantować, że baza danych z hasłami zostanie skradziona. Kradnij bazę danych, mam wszystkie hasła. Ok, twój system i Twoja firma poniosą wszystkie tego konsekwencje. Możemy więc spróbować uniknąć wycieku tego hasła.
UWAGA, że w tym momencie nie martwimy się atakami online. W przypadku jednego ataku online najlepszym rozwiązaniem jest spowolnienie po złych hasłach, zablokowanie konta po kilku próbach itp. W tym przypadku nie ma znaczenia, w jaki sposób szyfrujesz, hash, przechowujesz itp. Hasło. Atak online polega na spowolnieniu wprowadzania hasła .
Wróćmy do don't let them take my plain passwords
problemu. Odpowiedź jest prosta: nie przechowuj ich jako zwykłego tekstu. Ok, rozumiem.
Jak tego uniknąć?
Zaszyfruj hasło (?). Ale, jak wiesz, jeśli go zaszyfrujesz, możesz go odszyfrować z powrotem, jeśli masz odpowiedni klucz. I skończysz z problemem „gdzie ukryć” klucz. Hum, nic dobrego, skoro dostali twoją bazę danych, mogą zdobyć twój klucz. Ok, nie używajmy tego.
Kolejne podejście: przekształćmy hasło w coś innego, czego nie można cofnąć, i zapisz je. Aby sprawdzić, czy podane hasło jest prawidłowe, ponownie wykonujemy ten sam proces i sprawdzamy, czy dwie transformowane wartości są zgodne. Jeśli się zgadzają = podano dobre hasło.
Ok, jak dotąd tak dobrze. Użyjmy skrótu MD5 w haśle. Ale ... jeśli ktoś ma naszą zapisaną wartość skrótu hasła, może mieć dużą moc komputera, aby obliczyć skrót MD5 każdego możliwego hasła (brutalna siła), aby mógł znaleźć oryginalne hasło. Lub, co najgorsze, może przechowywać wszystkie MD5 ze wszystkich kombinacji znaków i łatwo znaleźć hasło. Więc wykonaj wiele iteracji, HASH (HASH (HASH ())), aby było trudniej, ponieważ zajmie to więcej czasu.
Ale nawet to można obejść, tęczowy stół został stworzony właśnie w celu przyspieszenia tego rodzaju ochrony.
Użyjmy więc soli. W ten sposób przy każdej interakcji sól jest ponownie używana. Osoba próbująca zaatakować twoje hasła będzie musiała wygenerować tęczową tabelę, biorąc pod uwagę, że sól jest dodawana za każdym razem. A kiedy wygeneruje tęczową tabelę, ponieważ została wygenerowana z jedną solą, będzie musiał ponownie obliczyć dla drugiej soli, więc będzie musiał poświęcić trochę czasu na każde hasło (= każda sól). Sól nie doda „więcej złożoności” do hasła, po prostu sprawi, że atakujący będzie tracił czas na generowanie tęczowej tabeli, jeśli użyjesz jednej soli dla każdego hasła, tabela od jednej soli jest bezużyteczna do innego hasła.
A użycie więcej niż jednego skrótu pomoże tutaj? Nie. Osoba generująca konkretny atak tęczy będzie w stanie go wygenerować za pomocą jednego lub więcej skrótów.
A użycie więcej niż jednego skrótu może doprowadzić do jednego problemu: jest tak bezpieczny, jak najsłabszy skrót, którego używasz. Jeśli ktoś znajdzie kolizje w jednym algorytmie mieszającym, to ten skrót zostanie wykorzystany w dowolnym momencie procesu iteracji do złamania hasła. Tak więc nic nie zyskujesz, stosując więcej algorytmów mieszających, lepiej wybrać tylko jeden dobry algo. i użyj go. A jeśli kiedykolwiek usłyszysz, że został uszkodzony, zastanów się, jak to zmienisz w swojej aplikacji.
I po co używać bcrypt lub czegoś podobnego (mówisz, że go używasz): ponieważ atakujący będzie musiał spędzić więcej czasu na generowaniu tabel. Dlatego użycie MD5 + czekać (3 sekundy) nie pomaga: atak i tak będzie offline, więc osoba atakująca może wygenerować tabele bez (3 sekund opóźnienia).