Obecnie mówi się, że MD5 jest częściowo niebezpieczny. Biorąc to pod uwagę, chciałbym wiedzieć, którego mechanizmu użyć do ochrony hasłem.
To pytanie: czy „podwójne hashowanie” jest mniej bezpieczne niż jednorazowe hashowanie? sugeruje, że wielokrotne mieszanie może być dobrym pomysłem, podczas gdy jak wdrożyć ochronę hasłem dla poszczególnych plików? sugeruje użycie soli.
Używam PHP. Chcę bezpiecznego i szybkiego systemu szyfrowania hasła. Hashowanie hasła milion razy może być bezpieczniejsze, ale także wolniejsze. Jak osiągnąć równowagę między prędkością a bezpieczeństwem? Ponadto wolałbym, aby wynik miał stałą liczbę znaków.
- Mechanizm mieszający musi być dostępny w języku PHP
- To musi być bezpieczne
- Może używać soli (w tym przypadku, czy wszystkie sole są równie dobre? Czy jest jakiś sposób na wytworzenie dobrych soli?)
Ponadto, czy powinienem przechowywać dwa pola w bazie danych (na przykład jedno przy użyciu MD5, a drugie przy użyciu SHA)? Czy sprawiłoby to, że byłoby bezpieczniej lub mniej?
W przypadku, gdy nie byłem wystarczająco jasny, chcę wiedzieć, które funkcje haszujące mają być używane i jak wybrać dobrą sól, aby mieć bezpieczny i szybki mechanizm ochrony hasłem.
Powiązane pytania, które nie do końca obejmują moje pytanie:
Jaka jest różnica między SHA i MD5 w PHP
Proste szyfrowanie haseł
Bezpieczne metody przechowywania kluczy, haseł do asp.net
Jak zaimplementowałbyś solone hasła w Tomcat 5.5
Odpowiedzi:
TL; DR
Nie
\0
, które mogą poważnie osłabić bezpieczeństwo).Dos
Po co w ogóle hasła hash?
Cel mieszania haseł jest prosty: zapobieganie złośliwemu dostępowi do kont użytkowników poprzez naruszenie bazy danych. Tak więc celem mieszania haseł jest zniechęcenie hakera lub crackera, który kosztuje go zbyt wiele czasu lub pieniędzy, aby obliczyć hasła w postaci zwykłego tekstu. A czas / koszt to najlepsze środki odstraszające w twoim arsenale.
Innym powodem, dla którego chcesz mieć dobry, solidny hash na kontach użytkowników, jest dać ci wystarczająco dużo czasu na zmianę wszystkich haseł w systemie. Jeśli baza danych zostanie naruszona, będziesz potrzebować wystarczająco dużo czasu na przynajmniej zablokować system, jeśli nie, zmień każde hasło w bazie danych.
Jeremiah Grossman, dyrektor techniczny Whitehat Security, stwierdził na blogu White Hat Security po niedawnym odzyskaniu hasła, które wymagało brutalnego złamania jego ochrony hasłem:
(Podkreśl moje.)
Co właściwie czyni dobre hasło?
Entropia . (Nie to, że w pełni popieram punkt widzenia Randalla.)
Krótko mówiąc, entropia określa, ile zmian zawiera hasło. Gdy hasło składa się tylko z małych liter rzymskich, to tylko 26 znaków. To nie jest duża różnorodność. Hasła alfanumeryczne są lepsze i mają 36 znaków. Jednak uwzględnienie wielkich i małych liter z symbolami to około 96 znaków. To o wiele lepsze niż tylko litery. Jednym z problemów jest to, że aby nasze hasła były niezapomniane, wstawiamy wzory - co zmniejsza entropię. Ups!
Entropia hasła jest przybliżona łatwo . Korzystanie z pełnego zakresu znaków ascii (około 96 znaków pisanych na maszynie) daje entropię 6,6 na znak, co przy 8 znakach dla hasła jest wciąż zbyt niskie (52,679 bitów entropii) dla przyszłego bezpieczeństwa. Ale dobrą wiadomością jest: dłuższe hasła i hasła ze znakami Unicode, naprawdę zwiększają entropię hasła i utrudniają złamanie.
Dłuższa dyskusja na temat entropii hasła na stronie Crypto StackExchange . Dobra wyszukiwarka Google również przyniesie wiele wyników.
W komentarzach rozmawiałem z @popnoodles, który zauważył, że egzekwowanie polityki haseł o długości X z X wieloma literami, cyframi, symbolami itp. Może faktycznie zmniejszyć entropię, czyniąc schemat haseł bardziej przewidywalnym. Zgadzam się. Losowość, tak prawdziwie losowa, jak to tylko możliwe, jest zawsze najbezpieczniejszym, ale najmniej pamiętnym rozwiązaniem.
O ile mogłem powiedzieć, tworzenie najlepszego hasła na świecie to Catch-22. Albo nie jest niezapomniany, zbyt przewidywalny, zbyt krótki, zbyt wiele znaków Unicode (trudne do wpisania na urządzeniu z systemem Windows / Mobile), zbyt długi itp. Żadne hasło nie jest wystarczająco dobre do naszych celów, więc musimy je chronić, tak jakby były w Fort Knox.
Najlepsze praktyki
Bcrypt i scrypt są obecne najlepsze praktyki. Scrypt będzie lepszy od bcrypt w czasie, ale nie widziałem przyjęcia go jako standardu przez Linux / Unix lub przez serwery WWW i nie opublikowano jeszcze szczegółowych recenzji jego algorytmu. Jednak przyszłość algorytmu wygląda obiecująco. Jeśli pracujesz z Ruby, istnieje klejnot scrypt , który ci pomoże, a Node.js ma teraz swój własny pakiet scrypt . Można użyć Scrypt w PHP albo poprzez Scrypt przedłużenia lub Libsodium rozszerzenia (oba są dostępne w PECL).
Gorąco polecam przeczytanie dokumentacji funkcji kryptograficznej, jeśli chcesz zrozumieć, jak korzystać z bcrypt, lub znaleźć dobre opakowanie lub użyć czegoś takiego jak PHPASS, aby uzyskać bardziej starszą implementację. Polecam minimum 12 rund bcrypt, jeśli nie 15 do 18.
Zmieniłem zdanie na temat korzystania z bcrypt, kiedy dowiedziałem się, że bcrypt używa tylko harmonogramu klucza blowfish, z mechanizmem zmiennego kosztu. To drugie pozwala zwiększyć koszt brutalnej siły hasła poprzez zwiększenie i tak drogiego kluczowego harmonogramu blowfish.
Średnie praktyki
Prawie nie wyobrażam sobie już takiej sytuacji. PHPASS obsługuje PHP 3.0.18 do 5.3, więc można go używać w prawie każdej możliwej instalacji - i powinien być używany, jeśli nie wiesz na pewno, że twoje środowisko obsługuje bcrypt.
Załóżmy jednak, że nie można w ogóle używać bcrypt ani PHPASS. Co wtedy?
Wypróbuj implementację PDKBF2 z maksymalną liczbą rund, którą twoje środowisko / aplikacja / postrzeganie użytkownika może tolerować. Najniższa zalecana przeze mnie liczba to 2500 rund. Upewnij się również, że używasz hash_hmac (), jeśli jest on dostępny, aby utrudnić odtwarzanie operacji.
Przyszłe praktyki
W PHP 5.5 znajduje się pełna biblioteka do ochrony hasłem, która odciąga wszelkie problemy związane z pracą z bcrypt. Podczas gdy większość z nas utknęła w PHP 5.2 i 5.3 w większości popularnych środowisk, zwłaszcza hostów współdzielonych, @ircmaxell zbudował warstwę kompatybilności dla nadchodzącego API, która jest wstecznie kompatybilna z PHP 5.3.7.
Podsumowanie kryptografii i wyłączenie odpowiedzialności
Moc obliczeniowa wymagana do złamania zaszyfrowanego hasła nie istnieje. Jedynym sposobem na „złamanie” hasła przez komputer jest jego ponowne utworzenie i symulacja algorytmu mieszającego używanego do jego zabezpieczenia. Szybkość skrótu jest liniowo związana z jego zdolnością do brutalnej siły. Co gorsza, większość algorytmów mieszających można łatwo zrównoleglić, aby działać jeszcze szybciej. Dlatego tak ważne są kosztowne programy, takie jak bcrypt i scrypt.
Nie możesz przewidzieć wszystkich zagrożeń ani dróg ataku, dlatego musisz dołożyć wszelkich starań, aby chronić użytkowników z góry . Jeśli tego nie zrobisz, możesz nawet przegapić fakt, że zostałeś zaatakowany, dopóki nie będzie za późno ... i jesteś odpowiedzialny . Aby uniknąć tej sytuacji, na początku działaj paranoikiem. Atakuj własne oprogramowanie (wewnętrznie) i próbuj kraść poświadczenia użytkownika lub modyfikować konta innych użytkowników lub uzyskiwać dostęp do ich danych. Jeśli nie przetestujesz bezpieczeństwa swojego systemu, nie możesz obwiniać nikogo oprócz siebie.
Wreszcie: nie jestem kryptografem. Cokolwiek powiedziałem, to moja opinia, ale wydaje mi się, że opiera się na dobrym rozsądku ... i dużej ilości lektury. Pamiętaj, bądź tak paranoikiem, jak to tylko możliwe, staraj się jak najtrudniej przeszkadzać, a następnie, jeśli nadal się martwisz, skontaktuj się z białym hakerem lub kryptografem, aby zobaczyć, co mówią o twoim kodzie / systemie.
źródło
O wiele krótsza i bezpieczniejsza odpowiedź - w ogóle nie pisz własnego mechanizmu hasła , użyj sprawdzonego mechanizmu.
Większość programistów po prostu nie ma wystarczającej wiedzy, aby bezpiecznie pisać kod związany z kryptografią bez wprowadzania luk.
Szybki autotest: co to jest rozciąganie hasła i ile iteracji należy użyć? Jeśli nie znasz odpowiedzi, powinieneś użyć
password_hash()
, ponieważ rozciąganie hasła jest teraz kluczową cechą mechanizmów haseł ze względu na znacznie szybsze procesory oraz użycie procesorów graficznych i układów FPGA do łamania haseł z szybkością miliardów zgadnięć na sekundę (w przypadku układów GPU ).Na przykład możesz złamać wszystkie 8-znakowe hasła systemu Windows w ciągu 6 godzin przy użyciu 25 procesorów graficznych zainstalowanych na 5 komputerach stacjonarnych. Jest to brutalne wymuszanie, tj. Wyliczanie i sprawdzanie każdego 8-znakowego hasła systemu Windows , w tym znaków specjalnych, i nie jest atakiem słownikowym. Tak było w 2012 r., Od 2018 r. Można było używać mniejszej liczby GPU lub szybciej pękać z 25 GPU.
Istnieje również wiele ataków tabeli tęczy na hasła systemu Windows, które działają na zwykłych procesorach i są bardzo szybkie. Wszystko to dlatego, że system Windows nadal nie używa hasła ani nie rozciąga haseł, nawet w systemie Windows 10 - nie popełniaj tego samego błędu, co Microsoft!
Zobacz też:
password_hash()
lubphpass
najlepszych sposobów.źródło
Nie przechowałbym hasła zakodowanego na dwa różne sposoby, ponieważ wtedy system jest co najmniej tak słaby, jak najsłabszy z używanych algorytmów haszujących.
źródło
Począwszy od PHP 5.5, PHP ma proste, bezpieczne funkcje do mieszania i weryfikacji haseł, password_hash () i password_verify ()
Gdy
password_hash()
jest używany, generuje losową sól i włącza ją do generowanego skrótu (wraz z zastosowanym kosztem i stosowanym algorytmem),password_verify()
a następnie odczytuje ten skrót i określa zastosowaną metodę soli i szyfrowania oraz weryfikuje go na podstawie podanego hasła w postaci zwykłego tekstu.Podanie
PASSWORD_DEFAULT
instruuje PHP, aby używał domyślnego algorytmu mieszającego zainstalowanej wersji PHP. Dokładnie, który to algorytm ma zmieniać się w czasie w przyszłych wersjach, aby zawsze był jednym z najsilniejszych dostępnych algorytmów.Zwiększenie kosztu (domyślnie 10) powoduje, że skrót jest trudniejszy do użycia z użyciem siły, ale oznacza również generowanie skrótów i weryfikowanie haseł względem nich, co będzie więcej pracy dla procesora serwera.
Zauważ, że nawet jeśli domyślny algorytm mieszania może się zmienić, stare skróty będą nadal sprawdzały się dobrze, ponieważ użyty algorytm jest przechowywany w haszu i
password_verify()
pobiera go.źródło
Chociaż odpowiedź na to pytanie, chcę tylko powtórzyć, że sole używane do mieszania powinny być losowe, a nie jak adres e-mail, jak sugerowano w pierwszej odpowiedzi.
Więcej wyjaśnień można znaleźć na stronie http://www.pivotalsecurity.com/blog/password-hashing-salt-should-it-be-random/
źródło
Chciałbym tylko zauważyć, że PHP 5.5 zawiera API mieszające hasła, które zapewnia otoki
crypt()
. Ten interfejs API znacznie upraszcza zadanie mieszania, weryfikacji i ponownego hashowania hasła. Autor wydał również pakiet kompatybilności (w postaci jednego pliku password.php, którego po prosturequire
używasz), dla tych, którzy używają PHP 5.3.7 i nowszych i chcą tego teraz używać.Na razie obsługuje tylko BCRYPT, ale jego celem jest łatwe rozszerzenie go o inne techniki mieszania haseł, a ponieważ technika i koszt są przechowywane jako część skrótu, zmiany preferowanej techniki / kosztu haszowania nie unieważnią bieżących skrótów, frameworka automatycznie zastosuje prawidłową technikę / koszt podczas walidacji. Obsługuje również generowanie „bezpiecznej” soli, jeśli nie zdefiniujesz jej własnej.
Interfejs API udostępnia cztery funkcje:
password_get_info()
- zwraca informacje o danym haszupassword_hash()
- tworzy skrót hasłowypassword_needs_rehash()
- sprawdza, czy dany skrót odpowiada danym opcjom. Przydaje się, aby sprawdzić, czy skrót jest zgodny z aktualną techniką / schematem kosztów, umożliwiając w razie potrzeby powtórzenie skrótupassword_verify()
- sprawdza, czy hasło pasuje do skrótuW chwili obecnej funkcje te akceptują stałe hasła PASSWORD_BCRYPT i PASSWORD_DEFAULT, które są obecnie synonimami, z tą różnicą, że PASSWORD_DEFAULT „może się zmieniać w nowszych wersjach PHP, gdy obsługiwane są nowsze, silniejsze algorytmy mieszające”. Używanie PASSWORD_DEFAULT i password_needs_rehash () przy logowaniu (i ponownym logowaniu, jeśli to konieczne) powinno zapewnić, że twoje skróty są odpowiednio odporne na ataki typu brute force, przy niewielkim lub żadnym wysiłku.
EDYCJA: Właśnie zdałem sobie sprawę, że jest to krótko wspomniane w odpowiedzi Roberta K. Pozostawię tę odpowiedź tutaj, ponieważ uważam, że zawiera ona nieco więcej informacji o tym, jak działa i łatwość użycia, która zapewnia tym, którzy nie znają bezpieczeństwa.
źródło
Używam Phpass, który jest prostą klasą PHP z jednym plikiem, którą można bardzo łatwo zaimplementować w prawie każdym projekcie PHP. Zobacz także H .
Domyślnie używał najsilniejszego dostępnego szyfrowania, które jest zaimplementowane w Phpass, czyli
bcrypt
i wraca do innych szyfrowań aż do MD5, aby zapewnić wsteczną kompatybilność frameworków takich jak Wordpress.Zwrócony skrót może być przechowywany w bazie danych bez zmian. Przykładowe użycie do generowania skrótu to:
Aby zweryfikować hasło, możesz użyć:
źródło
RZECZY DO ZAPAMIĘTANIA
Wiele powiedziano o szyfrowaniu haseł dla PHP, z których większość jest bardzo dobrą radą, ale zanim jeszcze zaczniesz używać PHP do szyfrowania haseł, upewnij się, że masz zaimplementowane lub gotowe do wdrożenia.
SERWER
PORTY
Bez względu na to, jak dobre jest Twoje szyfrowanie, jeśli nie odpowiednio zabezpieczysz serwer z PHP i DB, wszystkie twoje wysiłki są bezwartościowe. Większość serwerów działa względnie w ten sam sposób, mają przypisane porty, aby umożliwić ci zdalny dostęp za pośrednictwem ftp lub powłoki. Upewnij się, że zmieniłeś domyślny port, w którym zawsze było aktywne połączenie zdalne. Nie robiąc tego, w efekcie sprawiłeś, że atakujący zrobił jeden krok w dostępie do twojego systemu.
NAZWA UŻYTKOWNIKA
Do wszystkiego, co jest dobre na świecie, nie używaj nazwy użytkownika admin, root lub czegoś podobnego. Również jeśli korzystasz z systemu uniksowego, NIE udostępniaj logowania do konta root, zawsze powinno to być tylko sudo.
HASŁO
Mówisz swoim użytkownikom, aby tworzyli dobre hasła, aby uniknąć włamania, zrób to samo. Jaki jest sens przechodzenia przez cały proces zamykania drzwi wejściowych, gdy tylne drzwi są szeroko otwarte.
BAZA DANYCH
SERWER
Idealnie potrzebujesz DB i APLIKACJI na osobnych serwerach. Nie zawsze jest to możliwe ze względu na koszty, ale zapewnia pewne bezpieczeństwo, ponieważ osoba atakująca będzie musiała przejść dwa kroki, aby uzyskać pełny dostęp do systemu.
UŻYTKOWNIK
Zawsze upewnij się, że Twoja aplikacja ma własne konto, aby uzyskać dostęp do bazy danych i dać mu tylko potrzebne uprawnienia.
Następnie miej dla siebie osobne konto użytkownika, które nie jest przechowywane w dowolnym miejscu na serwerze, nawet w aplikacji.
Jak zawsze NIE twórz tego roota ani czegoś podobnego.
HASŁO
Postępuj zgodnie z tymi samymi wskazówkami, co w przypadku wszystkich dobrych haseł. Nie używaj również tego samego hasła na żadnym koncie SERVER lub DB w tym samym systemie.
PHP
HASŁO
NIGDY NIGDY nie przechowuj hasła w swoim DB, zamiast tego przechowuj skrót i unikalną sól, wyjaśnię dlaczego później.
HASHING
HASŁO JEDEN SPOSÓB !!!!!!!, Nigdy nie haszuj hasła w sposób, który może być odwrócony, Hashe powinny być jednokierunkowe, co oznacza, że nie odwracasz ich i nie porównujesz z hasłem, zamiast tego haszujesz wprowadzone hasło w ten sam sposób i porównaj dwa skróty. Oznacza to, że nawet jeśli atakujący uzyska dostęp do bazy danych, nie wie, jakie jest faktycznie hasło, tylko wynikowy skrót. Co oznacza większe bezpieczeństwo dla użytkowników w najgorszym możliwym scenariuszu.
Istnieje wiele dobrych funkcji haszujących (
password_hash
,hash
itp.), Ale musisz wybrać dobry algorytm, aby hasz był skuteczny. (bcrypt i podobne do niego to przyzwoite algorytmy).Kiedy kluczowa jest szybkość mieszania, im wolniejsza, tym bardziej odporna na ataki Brute Force.
Jednym z najczęstszych błędów w mieszaniu jest to, że skróty nie są unikalne dla użytkowników. Wynika to głównie z tego, że sole nie są wytwarzane jednoznacznie.
SÓL
Hasła powinny być zawsze solone przed mieszaniem. Solenie dodaje losowy ciąg do hasła, więc podobne hasła nie pojawiają się w DB. Jeśli jednak sól nie jest unikalna dla każdego użytkownika (tj. Używasz soli zakodowanej na sztywno), to właściwie uczyniłeś ją bezwartościową. Ponieważ gdy atakujący odkryje jedną sól hasła, ma sól dla wszystkich.
Kiedy tworzysz sól, upewnij się, że jest ona unikalna dla hasła, które jest solone, a następnie przechowuj zarówno ukończony hash, jak i sól w DB. W ten sposób sprawi, że atakujący będzie musiał indywidualnie rozbić każdą sól i hasz, zanim będzie mógł uzyskać dostęp. Oznacza to o wiele więcej pracy i czasu dla atakującego.
UŻYTKOWNICY TWORZĄCY HASŁA
Jeśli użytkownik tworzy hasło za pomocą interfejsu, oznacza to, że należy je wysłać na serwer. To otwiera problem bezpieczeństwa, ponieważ oznacza to, że niezaszyfrowane hasło jest wysyłane na serwer, a jeśli osoba atakująca jest w stanie nasłuchiwać i uzyskiwać dostęp, wszystkie zabezpieczenia w PHP są bezwartościowe. ZAWSZE przesyłaj dane BEZPIECZNIE, odbywa się to przez SSL, ale bądź zmęczony, nawet SSL nie jest bezbłędny (wada OpenSSL Heartbleed jest tego przykładem).
Spraw, aby użytkownik utworzył bezpieczne hasło, jest to proste i zawsze powinno być zrobione, użytkownik będzie mu w końcu wdzięczny.
Wreszcie, bez względu na to, że środki bezpieczeństwa, które nie podejmujesz, są w 100% bezpieczne, im bardziej zaawansowana jest technologia ochrony, tym bardziej zaawansowane stają się ataki. Ale wykonanie tych kroków sprawi, że Twoja witryna będzie bezpieczniejsza i mniej pożądana dla atakujących.
Oto klasa PHP, która z łatwością tworzy skrót i sól do hasła
http://git.io/mSJqpw
źródło
Google twierdzi, że SHA256 jest dostępny dla PHP.
Zdecydowanie powinieneś użyć soli. Polecam używanie losowych bajtów (i nie ograniczaj się do znaków i cyfr). Jak zwykle, im dłużej wybierzesz, tym bezpieczniej, tym wolniej. Chyba powinno być 64 bajtów.
źródło
Ostatecznie, matematycznie podwójne haszowanie nie przynosi żadnych korzyści. W praktyce jest jednak przydatny w zapobieganiu atakom opartym na tabeli tęczy. Innymi słowy, nie przynosi więcej korzyści niż mieszanie soli, co zajmuje znacznie mniej czasu procesora w aplikacji lub na serwerze.
źródło
Znalazłem idealny temat na ten temat tutaj: https://crackstation.net/hashing-security.htm , chciałem, abyś mógł z niego skorzystać, oto kod źródłowy, który zapewnił również zapobieganie atakowi opartemu na czasie.
źródło
Zwykle używam SHA1 i soli z identyfikatorem użytkownika (lub inną informacją specyficzną dla użytkownika), a czasami dodatkowo używam stałej soli (więc mam 2 części soli).
SHA1 jest teraz również uważany za nieco zagrożony, ale w znacznie mniejszym stopniu niż MD5. Używając soli (dowolnej soli), zapobiegasz użyciu ogólnej tabeli tęczy do atakowania twoich skrótów (niektórym ludziom nawet udało się używać Google jako pewnego rodzaju tabeli tęczy, szukając skrótu). Osoba atakująca może wygenerować tęczową tabelę przy użyciu twojej soli, dlatego powinieneś dołączyć sól specyficzną dla użytkownika. W ten sposób będą musieli wygenerować tęczową tabelę dla każdego rekordu w systemie, a nie tylko dla całego systemu! Przy tego rodzaju soleniu nawet MD5 jest przyzwoicie bezpieczny.
źródło
SHA1 i sól powinny wystarczyć (w zależności od tego, czy kodujesz coś dla Fort Knox, czy system logowania do listy zakupów) w dającej się przewidzieć przyszłości. Jeśli SHA1 nie jest dla ciebie wystarczająco dobry, użyj SHA256 .
Ideą soli jest, żeby tak rzec, wytrącenie wyników mieszania z równowagi. Wiadomo na przykład, że skrót MD5 pustego łańcucha to
d41d8cd98f00b204e9800998ecf8427e
. Więc jeśli ktoś z wystarczająco dobrą pamięcią zobaczy ten skrót i będzie wiedział, że jest to skrót pustego łańcucha. Ale jeśli łańcuch zostanie solony (powiedzmy z łańcuchem „MY_PERSONAL_SALT
”), skrót dla „pustego łańcucha” (tj. „MY_PERSONAL_SALT
”) Stanie sięaeac2612626724592271634fb14d3ea6
, dlatego nie jest oczywiste, aby śledzić wstecz. To, co próbuję powiedzieć, że lepiej jest użyć jakiejkolwiek soli, niż nie. Dlatego nie jest zbyt ważne, aby wiedzieć, której soli użyć.Istnieją strony internetowe, które właśnie to robią - możesz podać jej skrót (md5) i wyrzuca znany tekst jawny, który generuje ten konkretny skrót. Jeśli uzyskasz dostęp do bazy danych, która przechowuje zwykłe skróty md5, byłoby trywialne, aby wprowadzić hash dla administratora takiej usługi i zalogować się. Ale jeśli hasła zostałyby solone, taka usługa stałaby się nieskuteczny.
Również podwójne mieszanie jest ogólnie uważane za złą metodę, ponieważ zmniejsza przestrzeń wynikową. Wszystkie popularne skróty mają stałą długość. Zatem możesz mieć tylko skończone wartości o tej stałej długości, a wyniki stają się mniej zróżnicowane. To mogłoby być uznane za inną formę solenia, ale nie polecam go.
źródło
sha1(sha1($foo))
skutecznie zmniejsza przestrzeń wyjściową, ponieważ każde zderzenie funkcji wewnętrznej automatycznie stanie się zderzeniem z funkcją zewnętrzną. Degradacja jest liniowa, ale nadal stanowi problem. Iteracyjne metody mieszania dostarczają dane z powrotem w każdej rundzie, takie jak$hash = sha1(sha1($salt . $password) . $salt)
. Ale to wciąż nie jest dobre ... Trzymaj się PBKDF2 lub Bcrypt ...ok w fitsy potrzebujemy soli sól musi być unikalna, więc pozwólmy ją wygenerować
potrzebujemy też skrótu. Używam sha512, jest najlepszy i jest w php
więc teraz możemy użyć tych funkcji do wygenerowania bezpiecznego hasła
teraz musimy zapisać w bazie danych naszą zmienną $ hash_psw i zmienną $ salt
i do autoryzacji użyjemy tych samych kroków ...
to najlepszy sposób na zabezpieczenie haseł naszych klientów ...
Ps dla ostatnich 2 kroków możesz użyć własnego algorytmu ... ale upewnij się, że możesz wygenerować to zaszyfrowane hasło w przyszłości, kiedy będziesz musiał autoryzować użytkownika ...
źródło
sha512
(nawet jeśli solone) jest powszechnie uważane za niewystarczające do ochrony hasłem. (również, że RNG nie jest kryptograficznie bezpieczny, więc użycie go do wygenerowania hasła jest ryzykowne).