Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Jak dobrze hashowac hasla?
Forum PHP.pl > Forum > PHP
narvego
Na wstepie przepraszam, jesli jakis podobny watek na ten temat istnieje - jednak przeszukalem forum i w ostatnich nie znalazlem.

Pytanie brzmi - jak dobrze zahashowac haslo? Od razu chce zaznaczyc, ze moja wiedza jest dosc amatorska. Dotychczas w przerobkach skryptow stosowalem podwojne hashowanie:

  1. sha1(md5($password));


Jednak w przypadku robienia sobie serwisu na ktorym spodziewam sie kilku tysiecy kont, chyba przydalyby sie lepsze zabezpieczenia... wymyslilem sobie zatem konstrukcje tego typu:


  1. md5(sha1(base64_encode($password)));


Smiga, dziala, rejestruje sie, loguje... roznica pomiedzy tym samym haslem zakodowanym w sha1+md5 a pomiedzy haslem dodatkowo zakodowanym tez w base64 istnieje, zatem to kodowanie rzeczywiscie mi dziala. Ale watpliwosci mam duze:

- czy potrojne kodowanie nie zuzywa przesadnie mocy obliczeniowej maszyny? hosting posiadam wykupiony, nie chcialbym, zeby admin dostal przeze mnie bialej goraczki gdy spojrzy na zuzycie procesorow smile.gif

- czy jest w ogole sens kodowac potrojnie haslo?

Czy nie lepiej, abym uzyl jednego kodowania z moze samym base64? Czy to bedzie wystarczajace zabezpieczenie? Jaka jeszcze inna metode hashowania mozna polecic? Nie chce czegos przesadnie mocnego, ale cos jednak na miare dzisiejszych "standardow".
wookieb
Cytat(narvego @ 12.09.2010, 14:02:48 ) *
- czy jest w ogole sens kodowac potrojnie haslo?

Nie. Używaj sha1 ewentualnie sha o wyższych numerach.
narvego
Ok, udalo sie mi zrobic to tak -

Dolaczylem funkcje pobrana stad:

  1. include("nanolink-sha256.inc.php");


Nastepnie koduje sobie jako:

  1. sha256($_POST['password']);


No i smiga. Co prawda haselka teraz w bazie zajmuja mi troche miejsca, ale cos za cos. Tego rodzaju hashowanie powinno byc bardzo bezpieczne?
Pilsener
Wystarczy zwykłe md5 + sól, solenie haseł jest istotniejsze niż te Twoje machinacje, bo zabezpiecza przed odgadnięciem prostych haseł gdy w łapy wpadnie nam baza haszy. Zaraz będziecie robić hasz zajmujący 50 kb biggrin.gif
uupah5
Cytat(Pilsener @ 12.09.2010, 14:53:11 ) *
Wystarczy zwykłe md5 + sól, solenie haseł jest istotniejsze niż te Twoje machinacje, bo zabezpiecza przed odgadnięciem prostych haseł gdy w łapy wpadnie nam baza haszy. Zaraz będziecie robić hasz zajmujący 50 kb biggrin.gif

a sól stosuj dla każdego usera inny
Quantum
sha1(str.salt) w zupełności wystarcza (umiejscowienie soli rzecz jasna można zmienić)
Cytat
a sól stosuj dla każdego usera inny
Lepiej stworzyć zależność między bazą, a plikami strony. Jeżeli osoba z zewnątrz uzyska jakimś cudem dostęp do bazy będzie widziała tylko hash-e haseł, a sól mogąca posłużyć do ich odgadnięcia będzie nadal bezpieczna.

co do wielokrotnego hashowania: Temat: podwojne hashowanie hasel
everth
Akurat przeczytałem temat do którego odnosisz @Quantum i pośród wielu odpowiedzi nie znalazłem żadnej odwołującej się do standardów (może nieuważnie czytałem). A takie standardy są zdefiniowane - choćby publikowany przez RSA PCKS.

W jednej z jego części dot. kodowania haseł zaleca się używanie soli i wielokrotne haszowanie - tutaj. Standard publikuje nawet spec. funkcji (PKBDF2) która ma utrudnić odgadnięcie hasła z hasza. Na szybkiego znalazłem implementację PKBDF2 w PHP.

Więc moje pytanie jest takie - czy nikt nie zna tych standardów (w co nie wierzę), czy też mają one jakieś wady które ograniczają ich użycie w PHP (wydajność?, zbyt duży kaliber?). Pytam bo nie jestem specjalistą - może ktoś ma bardziej teoretyczną wiedzę na ten temat.
wookieb
Tylko, że RSA jest szyfrem dwukierunkowym (można do odszyfrować posiadając klucz) natomiast sha1 i md5 są już jednokierunkowe. Dlatego w tych drugich nie ma sensu szyfrować n-krotnie.
skowron-line
Najlepiej poczytaj o tych funkcjach jednokierunkowcyh md5 zostało już dawno złamane, sha1 chyba też zobacz co oferuje funkcja HASH
everth
@wookieb - to że chodzi o firmę RSA, to nie znaczy że cały standard odnosi się do szyfrowania asymetrycznego. Akurat ta część odnosi się do bezpieczeństwa haseł tekstowych i zwiększania ich bezpieczeństwa. W zasadzie tam cały czas jest mowa o funkcjach skrótu.
Quantum
Cytat(everth)
W jednej z jego części dot. kodowania haseł zaleca się używanie soli i wielokrotne haszowanie
wielokrotne hashowanie zwiększa szansę wystąpienia kolizji, więc jaki tego sens ?
Noidea
Z wielokrotnym hashowaniem jest tak, że stosowanie czegoś takiego:
  1. $hash = md5( md5( md5( md5( md5( md5( md5( md5( md5( md5( $pass . $salt ) ) ) ) ) ) ) ) ) );

jest w gruncie rzeczy bez sensu. Natomiast wielokrotne hashowanie, zakładając, że "wielokrotne" jest rzędu tysięcy, pomaga zabezpieczyć się przed atakami brute force na wykradziony hash.
MD5 jest bardzo szybkim algorytmem, więc nieskomplikowane hasło nowoczesny komputer jest w stanie złamać w czasie, gdy będę sobie parzył herbatę. Natomiast nieskomplikowane hasło hashowane 3000 razy wydłuży czas łamania 3000 razy, czyli łamanie może przestać być to opłacalne.
Minus jest taki, że ludzie którzy uważają, że stosowanie ' zamiast " przyspieszy ich skrypt PHP raczej niechętnie będą robili hash tysiące razy.
Plus natomiast, że można pozwolić użytkownikom na mniej skomplikowane hasła. To jest bardzo ważne, bo 99% społeczeństwa nie lubi zapamiętywać skomplikowanych haseł i gdy na stronce, na której co najwyżej można napisać komentarz i wstawić fotkę wymaga się od nich małych, dużych liter, cyfr, znaków i Bóg wie czego jeszcze, to podadzą takie hasło jak mają na allegro albo do banku smile.gif

Z tego co pamiętam, to są nawet algorytmy hashujące specjalnie zaprojektowane, żeby były powolne, ale nie mogę sobie nazw przypomnieć.


Natomiast sól zabezpiecza przed rainbow tables. Ogólnie powinno się stosować losową, unikalną sól dla każdego hasła (nic przesadnie skomplikowanego, zwykły int wystarczy) i trzymać ją w bazie danych. Przez to dla każdej soli trzeba by wygenerować osobną tęczową tablicę, ważącą dziesiątki GB, co również przestaje być opłacalne.


Cytat
wielokrotne hashowanie zwiększa szansę wystąpienia kolizji, więc jaki tego sens ?

Z tego co się dowiedziałem, od mądrzejszych ode mnie ludzi, to po pierwsze przyjmuje się, że jeżeli ktoś ma dostęp do bazy danych strony XYZ, to już nie będzie się włamywał na konta jej użytkowników. Będzie natomiast próbował odzyskać oryginalne hasło i użyć je na innych stronach (banki, paypal, allegro, bukmacherzy, poker online, cokolwiek). Więc znalezienie kolizji w sumie niewiele daje - potrzebny jest oryginał, bo inne strony mogą używać innego algorytmu, czy innej soli.
Ponadto szansa wystąpienia kolizji się co prawda zwiększa, ale nie aż tak znacznie, żeby brać to pod uwagę.
yevaud
PBKDF2 przypomina raczej nakladanie funkcji mieszania na siebie (xor leci po drodze) niz zwykle "hashujmy wiele razy to bedzie lepiej bo duzo"

duzo wazniejsze niz 1000 iteracji jest poczatek - czyli fakt ze funkcja hashuje wszystko blokami, a nie caly tekst od razu. Dzieki temu jest duzo bardziej "chaotyczna" i traci mozliwie malo informacji

generalnie hashowanie czegos po kilka razy nie ma wiekszego sensu
trzymanie soli w bazie nie zadnego sensu, tutaj akurat moge powolac sie na dokumenty ISACA, chociaz nie moge ich zacytowac bo nie mam pod reka smile.gif duzo lepsza jest jedna sol ktora - o czym wspomnial ktos wyzej - lezy sobie na dysku

lepiej niz 10000 razy iteracji md5 zabezpieczy was jakis bardziej na czasie algorytm hashujacy smile.gif
piotr94
Cytat(skowron-line @ 13.09.2010, 18:08:22 ) *
Najlepiej poczytaj o tych funkcjach jednokierunkowcyh md5 zostało już dawno złamane, sha1 chyba też zobacz co oferuje funkcja HASH

Jak to zostało złamane??
są tęczowe tablice dla wszystkich haszy, czy sposób na odkodowanie??
biggrin.gif
ja osobiście polecam i stosuję md5 + sól z puli (mam ileś tam soli i na podstawie np. pierwszej litery loginu wybieram konkretną z nich dla danego usera)
najlepiej robić to np. tak:
  1. $key=md5($salt.md5($salt2.$password));
yevaud
tak na dobra sprawe zeby dobrze odpowiedziec na pytanie z tematu, trzeba byloby najpierw odpowiedziec sobie co to znaczy "dobrze hashowac" w tym konkretnym przypadku

jesli przyjmiemy zalozenie ze chodzi o zwykle bazy php na jakichs stronkach ktore nikogo w sensie globalnym nie interesuja, to mozna przyjac bezpieczne zalozenie ze zaden kryptoanalityk nie zainteresuje sie na powaznie waszymi haslami smile.gif wtedy po prostu kazde proste udziwnienie jakie zrobicie - nawet jesli z punktu widzenia kryptografii bedzie idiotycze - zwieksza troszke bezpieczenstwo waszych hasel, bo lamer z brzytwa sobie z tym nie poradzi. Pisze proste, bo jak ktos za bardzo poszaleje, a nie wie co robi, to moze sie okazac ze na koncu dostaje hash ktory z losowoscia nie ma juz zupelnie nic wspolnego smile.gif Warto takze pamietac, ze pomimo niewatpliwej szybkosci MD5 i faktu ze nowsze procesory wspieraja ta funckje hashujaca(oraz np. AES), to puszczanie serii md5 przy kazdym logowaniu usera, na pewno nie przyspieszy waszego portalu smile.gif

jesli zakladamy ze hashe maja byc ultra bezpieczne bo boicie sie ataku NSA, to jak juz wspomnialem zamiast hashowac po ilestam razy, warto byloby zaczac od uzycia czegos nowszego niz md5 (np sha-512), i troche wydluzyc klucz smile.gif, generalnie dopiero wtedy uzycie algorytmu typu PBKDF2 ma jakis sens.
everth
@yevaud - czyli jednak są rozbieżności. W PKCS zalecają by sól była raczej losowa dla każdego klucza. W tym przypadku raczej trzeba składować gdzieś sól powiązaną z haszami (niekoniecznie w bazie). Chyba że rekombinujemy statyczną sól za pomocą jakiegoś argumentu (id rekordu/długość loginu?) dla każdego przypadku osobno.

@piotr94 z tego co mi wiadomo to md5 nie tyle zostało odkodowane, co po prostu zostały znalezione braki w algorytmie dzięki którym łatwiej jest wygenerować kolizję niż wynika to z paradoksu urodzin. W zasadzie oznacza to złamanie (zważywszy na to że md5 ma tylko 128 bitów).
yevaud
Cytat(everth @ 13.09.2010, 19:38:58 ) *
@yevaud - czyli jednak są rozbieżności. W PKCS zalecają by sól była raczej losowa dla każdego klucza.

w takim razie sa rozbieznosci, widocznie wszystko zalezy od tego co dokladnie chcemy osiagnac(jaki dokladnie rozdzaj ataku jest dla nas potencjalnie niebezpieczny), albo po prostu nie ma to wiekszego znaczenia i jesli w ogole jest jakas unikalna-losowa-dluga sol to juz jest dobrze

warto rzucic okiem na roznice miedzy sha-0 a sha-1 - to sa 3 bajty kodu php winksmiley.jpg dlatego tym bardziej w profesjonalnych zastosowaniach podchodzilbym ostroznie do pomyslow typu md5(md5(...)))...), nie dosc ze tracimy jedyna aktualnie zalete md5(wszystko to obsluguje, jest szybkie), to na dodatek mozemy sie bardzo zdziwic w kwestii "przyrostu bezpieczenstwa"

po dluzszych dywagacjach i rozmyslaniach podczas czytania tego tematu odpowiedz na pytanie chyba jest dosc jasna winksmiley.jpg

Jak dobrze hashowac hasla w php?
uzyj jakiegos sha-2, wygeneruj dobra losowa sol, staraj sie zeby to co robisz dzialalo szybko i bylo latwe wiec nie udziwniaj
Zyx
Noidea -> co najwyżej serwer Ci spowolni, ale głupoty gadasz o tym wielokrotnym haszowaniu. Złożenie funkcji mieszającej H z samą sobą: H(H(x)) jest co najwyżej tak samo silne, jak H(x). H(x) mapuje nieskończoną liczbę tekstów na skończoną liczbę możliwych kluczy. Lecz jak zrobisz H(H(x)), mapujesz klucz na klucz. Jeśli kolizja kluczy zachodzi dla dwóch kluczy p oraz q generowanych przez teksty x oraz y, to zaczyna się zabawa, bo choć H(x) != H(y), to po podwójnym zahaszowaniu kolizja się już pojawia: H(H(x)) = H(H(x)). Ty myślisz, bym był na tyle głupi, by to brute forcem lecieć? Nieprawda, byłbym na tyle mądry i wręcz skorzystałbym jedynie z faktu, że mi 5 tysięcy razy mapujesz klucz na klucz, co mi tylko ułatwia znajdowanie cykli, posiedziałbym miesiąc analizując problem matematycznie, a później złamałbym to kilkakrotnie krócej, niż zwykłe MD5 smile.gif.

Ogólnie polecam lekturę: http://www.zyxist.com/pokaz.php/wielokrotne_haszowanie czyli dlaczego amatorską kryptografię można rozbić o kant czterech liter.

Pomijam już aspekt praktyczny, że Tobie na domowym komputerze przy jednym żądaniu na 3 dni może się to liczyć szybko, ale jak przerzucisz na serwer i będziesz musiał weryfikować np. 5 haseł na sekundę, może okazać się, że serwer nic innego nie robi, tylko liczy hasze smile.gif.
everth
Ee tam, Zyx przesadzasz z tą kolizją - przecież prawdopodobieństwo kolizji choćby dla sha1, powiększone o naszą liczbę iteracji jest i tak nikłe. Tutaj chodzi raczej o przypadek że ktoś ma naszą tablicę haszy i dowolną ilość czasu - wtedy dla ataku brute-force czas liczenia sum zaczyna być ważną cechą. I wątpię żeby spowolnienie miało praktyczny wydźwięk na większych serwerach - prawdopodobieństwo że odpowiednio duża liczba użytkowników zaloguje się w tym samym momencie jest raczej nikłe.

Żeby nie było - nie zakładam tak prymitywnego przykładu jak @Noidea (czyli bez soli i słabą funkcją).
flashdev
Cytat(narvego @ 12.09.2010, 14:02:48 ) *
- czy jest w ogole sens kodowac potrojnie haslo?


Pewnie już zostało powiedziane w temacie ale napisze jeszcze raz.
Nie ma sensu.
Nie kodujesz, bo kodowanie jest procesem, który można odwrócić. Spróbuj napisać funkcję odwrotną do md5 czy sha1.

Prawdopodobnie najlepsze możliwe rozwiązanie to:

  1. $hash = sha1( $haslo . $sol );


Gdzie sól jest dowolnie wybranym ciągiem znaków, stałym dla Twojej aplikacji.
Novik102
A co myślicie o tym?

  1. function mdpass($pass) {
  2. $pass = $pass['2'].implode('', array_reverse(str_split($pass))).'w4u'.$pass['1'].'5';
  3. return md5($pass);
  4. }


Na pewno nie takie proste do złamania...
nospor
Przypięty temat w tym dziale
http://forum.php.pl/index.php?showtopic=44156
a Wy dalej to samo wałkujecie, te same argumenty.

@Novik102 przeczytaj jeszcze raz dokładnie. Slowo klucz: KOLIZJE

zamykam. Jak ktoś ma coś nowego do dodania - zapraszam na PW
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.