Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Czy hasła będą bezpieczne ?
Forum PHP.pl > Forum > Przedszkole
Xart
Witam napisałem sobie skrypt kodowania haseł i chciałbym posłuchać waszych opini na temat jego bezpieczeństwa smile.gif
INFO: Zmienna $klucz dla każdego użytkownika inna (przechowywana w DB)

  1. $klucz = 'ab12cd34ghip';
  2. $haslo = 'ddd';
  3. $s1 = crc32(substr($klucz, 0, -9));
  4. $s2 = crc32(substr($klucz, 3, -6));
  5. $s3 = crc32(substr($klucz, 6, -3));
  6. $s4 = crc32(substr($klucz, 9));
  7. $kod = md5($haslo);
  8. $kod2 = $s3 . $s2 . $kod . $s1 . $s4;
  9. $kod3 = md5(hash('sha512', $kod2));
  10. echo $kod3;
pyro
Łap coś znacznie lepszego:

  1. $salt = 'sd19dfjkas';
  2. $password = 'kDSODO23929';
  3. echo hash('sha256', $salt.$password);
Xart
@UP
Moim zdaniem kod mój jest bezpieczniejszy smile.gif
Crozin
Albo jeszcze lepszego od tego podanego przez @pyro: http://stackoverflow.com/questions/4795385...asswords-in-php

Cytat
Moim zdaniem kod mój jest bezpieczniejszy smile.gif
Nie, nie jest.
Xart
Cytat(Crozin @ 12.02.2014, 23:23:08 ) *
Albo jeszcze lepszego od tego podanego przez @pyro: http://stackoverflow.com/questions/4795385...asswords-in-php

Nie, nie jest.


A to niby czemu ?
Mam więcej funkcji kodujących hasło smile.gif i jest to dużo bardziej zagmatfane
Damonsson
Nie, bo upubliczniłeś algorytm wink.gif

hasło -> md5(hasło) -> sól + md5(hasło) + sól -> sha512(md5(hasło)) -> md5(sha512(md5(hasło)))

Jest prawie że tym samym co

hasło -> sha512(sól + hasło)

Takie wielokrotne hashowanie nie robi jakiegoś super problemu. Ale tak, takie hasło będzie bezpieczne.
Xart
Cytat(Damonsson @ 12.02.2014, 23:27:12 ) *
Nie, bo upubliczniłeś algorytm wink.gif

hasło -> md5(hasło) -> sól + md5(hasło) + sól -> sha512(md5(hasło)) -> md5(sha512(md5(hasło)))

Jest prawie że tym samym co

hasło -> sha512(sól + hasło)

Takie wielokrotne hashowanie nie robi jakiegoś super problemu. Ale tak, takie hasło będzie bezpieczne.


Hehe itak nikt nie będzie wiedział gdzie i i w jaki sposób go użyję smile.gif
I wiem że wszelkie zabezpieczenie po opublikowaniu traci swój sens ale z pewnością ten algorytm zmienię przed użyciem ;p
Damonsson
I tak musisz zawsze zakładać wariant, że algorytm będzie dla atakującego jawny.
Xart
Cytat(Damonsson @ 12.02.2014, 23:35:58 ) *
I tak musisz zawsze zakładać wariant, że algorytm będzie dla atakującego jawny.


Masz rację ale jak jeszcze bardziej zagmatfam ten algorytm + dodam sól2 i jeszcze raz je przekoduję + użyję trim mysql_escape_string i htmlspecialchars + dodam limit logowań i przepisywanie kodu captcha przy logowaniu oraz np kod 4 znakowy kod sprawdzający to nie ma bata żeby się włamać smile.gif
Crozin
1. Jesteś ofiarą podejścia Security through obscurity. Rozwiązanie podane przeze mnie mimo iż włamującemu się doskonale znane nadal pozostaje bezpieczne.
2. http://forum.php.pl/index.php?showtopic=44156
3.
Cytat
A to niby czemu ?
Bo stoi za tym solidny kawał matematyki, którą Twoje posunięcia niweczą w pewnym stopniu. Korzystasz z kryptograficznie bezsensownych funkcji (crc) albo funkcji uznanych za złamane (md5). Czas generowania Twojego kodu jest bardzo, bardzo mały, a co za tym idzie spokojnie można przeprowadzić atak typu brute force.
pyro
Cytat(Xart @ 12.02.2014, 23:22:34 ) *
@UP
Moim zdaniem kod mój jest bezpieczniejszy smile.gif



Jedyne co różni mój kod od Twojego to to, że Twój jest znacznie wolniejszy od mojego.

// EDIT

Cytat(Crozin)
funkcji uznanych za złamane (md5)


MD5 jest przestarzały i obecnie istnieją o wiele lepsze algorytmy hashujące, ale "uznanym za złamane" trochę przesadziłeś.
Damonsson
Choćbyś to zahashował milion razy to i tak będzie to na podobnym poziomie co sha512(sól + hasło) czy tam sha256 smile.gif

Co ma do tego limit logowań, captcha i jakiś 4 znakowy kod? Czy trzymasz plaintext czy swój "super zagmatwany" hash, to przecież nie ma żadnej różnicy.

edit: dla MD5 tęczowe tablice mają po kilka tera bajtów, więc chyba można spokojnie powiedzieć, że MD5 jest złamane.
Crozin
@pyro: Prędkość wykonywania Twojego kodu i autora będzie w realnym świecie taka sama, poza tym w przypadku haseł szybkość generowania skrótu wcale nie jest czymś pożądanym. Co do MD5, pogoogleaj za frazą is md5 broken, a znajdziesz sporo źródeł, które skłonią Cię do używania frazy "MD5 jest złamany". wink.gif
@Damonsson: wielokrotne hashowanie przy pomocy algorytmów niezaprojektowanych w tym celu (m. in. rodzina MD/SHA), generalnie jedynie obniża kryptograficzną jakość hasha. Zaś CAPTCHA po kilku nieudanych próbach zalogowania to całkiem dobry pomysł - z tym, że może nie już po 4.
sowiq
@Xart, podstawową zasadą kryptografii, o której przeczytasz w pierwszym rozdziale każdej książki o tej tematyce, czy dowiesz się na pierwszym wykładzie kryptografii brzmi: "Nie próbuj tworzyć własnych algorytmów szyfrujących (tutaj: hashujących), tylko użyj sprawdzonych i przetestowanych rozwiązań". Oraz: "poleganie na niejawności algorytmu szyfrującego jest złym pomysłem" (por. Security By Obscurity).

Zrób jak Ci koledzy dobrze radzą smile.gif

A już inna sprawa, że jeśli nie robisz strony systemu bankowego, to czy Twoje hasła będą dały się złamać w miesiąc czy 1000 lat, to i tak podejrzewam że nikomu nie będzie na nich zależało. Równie dobrze możesz je trzymać i w plaintext wink.gif

Cytat(Crozin @ 12.02.2014, 23:57:57 ) *
skłonią Cię do używania frazy "MD5 jest złamany". wink.gif

Złamany to złe słowo, bo sugerowałoby, że ktoś znalazł funkcję odwracającą. A jak wiadomo taka funkcja nie istnieje i istnieć nie może, bo md5 mapuje nieskończony zbiór ciągów wejściowych w skończony zbiór wartości (hashy). Słabość md5 polega na jej szybkości, przez co jest podatna na ataki "brute force" (celowo pisane w cudzysłowach).
Damonsson
Cytat(Crozin @ 12.02.2014, 23:57:57 ) *
Zaś CAPTCHA po kilku nieudanych próbach zalogowania to całkiem dobry pomysł - z tym, że może nie już po 4.

No jasne, dobry pomysł. Tylko, czy trzyma hasło plaintextem, czy zahashowane, to przecież nie ma żadnej różnicy.
pyro
Cytat(Damonsson @ 12.02.2014, 23:46:27 ) *
edit: dla MD5 tęczowe tablice mają po kilka tera bajtów, więc chyba można spokojnie powiedzieć, że MD5 jest złamane.


  1. var_dump(count(array_merge(range('a', 'f'),range(0, 10)))); // EDIT: 16, rozpędziłem się :)


16^32 / 1024 / 1024 / 1024 / 1024 = 3.0948501e+26

Mi się jednak wydaje, że wszystkie serwerownie Googla razem wzięte nie pomieszczą nawet drobnego fragmentu tego.

Cytat(Crozin @ 12.02.2014, 23:57:57 ) *
@pyro: Prędkość wykonywania Twojego kodu i autora będzie w realnym świecie taka sama, poza tym w przypadku haseł szybkość generowania skrótu wcale nie jest czymś pożądanym. Co do MD5, pogoogleaj za frazą is md5 broken, a znajdziesz sporo źródeł, które skłonią Cię do używania frazy "MD5 jest złamany". wink.gif


Widziałem mnóstwo artykułów na ten temat na przestrzeni czasu i jedyne co w nich piszą to o większej podatności na kolizje etc. co nijak ma się do twierdzenia, że "zostało złamane". Bugatti jest droższe od Lamborgini, ale czy to znaczy, że Lamborgini jest tanie?

Cytat(Crozin @ 12.02.2014, 23:57:57 ) *
@Damonsson: wielokrotne hashowanie przy pomocy algorytmów niezaprojektowanych w tym celu (m. in. rodzina MD/SHA), generalnie jedynie obniża kryptograficzną jakość hasha. Zaś CAPTCHA po kilku nieudanych próbach zalogowania to całkiem dobry pomysł - z tym, że może nie już po 4.


Mogłoby się wydawać, że małe limity na takie rzeczy to czyste obscurity, jednak metodologia się sprawdza jak jest przypomnienie hasła np. za pomocą pomocniczego pytania, np. "Jak ma na imię Twoja teściowa" wink.gif ?
sowiq
Chciałbym tylko uściślić dwie rzeczy, bo trochę zaczynacie bredzić dry.gif

1. Tęczowe tablice nie polegają na przechowywaniu wszystkich możliwych hashy. Pewnie zależy to od implementacji, ale ja spotkałem się ze sposobem robienia łańcuchów hashy (np. 2k elementów) w taki sposób, że zaczynając od pierwszego elementu, wykonując dany algorytm (przejście string1 -> hash1 -> string2 -> hash2 -> ... -> hash2k) można przejść do ostatniego. W bazie danych przechowuje się tylko pierwszy i ostatni element. Zatem miejsce potrzebne do przechowywania tablic tęczowych jest kilka rzędów wielkości mniejsze wink.gif

2. Captcha i hashowanie haseł mają tyle wspólnego co Java i JavaScript wink.gif


[edit]
Jak ktoś ma trochę wolnego czasu to polecam - bardzo ciekawe wykłady z Uniwersytetu Stanforda: https://www.coursera.org/course/crypto
Damonsson
@pyro:
Ok tylko wyliczyłeś to dla każdego możliwego hasha, czyli piszesz o realnym złamaniu algorytmu.
A skoro masz kilku terabajtową tablicę hashy, to wyszukanie w niej interesującego ciągu, skraca się X krotnie i można bardzo szybko "złamać" hasło.
Daimos
Oj zrażacie chłopaka, najlepsze zabezpieczenie widziałem w dziale pr0 kodów amatorów, na stronie nospora, polecam wink.gif

  1. <?php
  2. $szyfr = sha1(sha1(sha1(sha1(sha1(sha1(sha1(sha1(sha1(sha1(
  3. sha1(sha1(sha1(sha1(sha1(sha1(sha1(sha1(sha1(sha1(sha1(sha1(
  4. md5(sha1(sha1(sha1(sha1(sha1(sha1(sha1(sha1(sha1(sha1(sha1(
  5. sha1(md5($coś))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))));
  6. ?>


źródło: http://pr0.nospor.pl/view/id/37/
pyro
Cytat(Damonsson @ 13.02.2014, 00:29:54 ) *
@pyro:
Ok tylko wyliczyłeś to dla każdego możliwego hasha, czyli piszesz o realnym złamaniu algorytmu.


Sorry pomyliłem posty i myślałem, że to jest propo tej myśli o "złamaniu algorytmu".

To prawda, że tęczowe tablice zajmują dużo mniej, ale przy łamaniu solonych haseł (zakładając, że to nie jest "abcd", tylko coś w stylu "SOI9290@&$(sLLSDOXoiwisXOW201)!@") są właściwie bezbronne bez kolizji. Poza tym duże tęczowe tablice też zajmują od groma miejsca mimo wszystko.
Crozin
Cytat
Złamany to złe słowo, bo sugerowałoby, że ktoś znalazł funkcję odwracającą. A jak wiadomo taka funkcja nie istnieje i istnieć nie może, bo md5 mapuje nieskończony zbiór ciągów wejściowych w skończony zbiór wartości (hashy). Słabość md5 polega na jej szybkości, przez co jest podatna na ataki "brute force" (celowo pisane w cudzysłowach).
Złamany rozumiany jako "znalezienie funkcji odwracającej" byłby OK w kontekście funkcji szyfrujących, ale MD5 taką oczywiście nie jest. Tutaj, przez złamanie rozumie się przede wszystkim jej podatność na kolizje, a MD5 jest na nie podatny: http://www.mscs.dal.ca/~selinger/md5collision/ (pierwszy link z brzegu). Jednak mniejsza z tym, nie ma sensu spierać się o nomenklaturę w tym przypadku.

@pyro: W przypadku MD5 tablica tęczowa musiałaby mieć maksymalnie 16^32 rekordów (nadal ogromna liczba), ponieważ wynik funkcji to 32 znaki z puli 0-9a-f. Jednak tęczowe tablice nie będą przechowywały wszystkiego (jest to niewykonalne obecnie), ale będą zawierać całe słowniki, popularne i niepopularne frazy typu dupa.8, zaq1@WSX czy 123321 - te pozwalają na złamanie ogromnej liczby haseł, bo ludzie po prostu z takich korzystają.

Cytat
Widziałem mnóstwo artykułów na ten temat na przestrzeni czasu i jedyne co w nich piszą to o większej podatności na kolizje etc. co nijak ma się do twierdzenia, że "zostało złamane". Bugatti jest droższe od Lamborgini, ale czy to znaczy, że Lamborgini jest tanie?
Możliwość generowania kolizji w małym czasie, jest wystarczającym powodem by uznać daną funkcję za niebezpieczną. Nawet jeżeli dzisiaj nie oznacza to jeszcze czegoś tragicznego, w niedalekiej przyszłości może. A zważywszy na fakt ogromnej popularności MD5 jest on pierwszy w kolejce do odstrzału.
Damonsson
Cytat(pyro @ 13.02.2014, 00:38:51 ) *
Sorry pomyliłem posty i myślałem, że to jest propo tej myśli o "złamaniu algorytmu".

To prawda, że tęczowe tablice zajmują dużo mniej, ale przy łamaniu solonych haseł (zakładając, że to nie jest "abcd", tylko coś w stylu "SOI9290@&$(sLLSDOXoiwisXOW201)!@") są właściwie bezbronne bez kolizji. Poza tym duże tęczowe tablice też zajmują od groma miejsca mimo wszystko.

Zgadza się, dla każdej soli musiałyby powstać nowe osobne tablice tęczowe, co jest już nierealne.
pyro
Nie niebezpieczną, tylko mniej bezpieczną od innych. Teraz będę cytował sam siebie wink.gif

Cytat
MD5 jest przestarzały i obecnie istnieją o wiele lepsze algorytmy hashujące, ale "uznanym za złamane" trochę przesadziłeś.


Hipotetyczna sytuacja: posiadasz tęczowe tablice o ogromnych rozmiarach i dostajesz 10 000 hashy haseł, ale solonych do złamania. Ile z nich zostanie złamanych? 0 (złamanych, czyli poznanie pierwotnej formy). Możesz co najwyżej natrafić na kolizje (ile? najwyżej kilka), ale hash dalej nie złamany, możesz się zalogować na konto na stronie, ale jeżeli użytkownik uzywa tego samego hasła w innych serwisach, to już się do nich nie zalogujesz, przy złamaniu - tak.

Pragnę zauważyć, że od początku tematu jest mowa o solonych hasełkach .

Cytat( @ 13.02.2014, 00:43:50 ) *
Zgadza się, dla każdej soli musiałyby powstać nowe osobne tablice tęczowe, co jest już nierealne.


Otóż to smile.gif
Crozin
@pyro: W przypadku funkcji skrótu, przez "złamanie" nigdy nie będzie się rozumiało znalezienia oryginalnych danych wejściowych, tylko co najwyżej kolizji. To czy ową kolizję będzie się dało w ogóle do czegokolwiek wykorzystać to już inna bajka. http://eprint.iacr.org/2006/105 - mój komputer potrzebuje ~15 sek na znalezienie kolizji. Nie wiem szczerze powiedziawszy jak sprawa wyglądałaby przy normalnych hasłach, ale zakładając ~1 min na hasło po tygodniu powinienem mieć te 10 000 kolizji. Solone czy nie, bez znaczenia.

1. MD5 już obecnie jest podatne na różne ataki, w niedalekiej przyszłości jego jakość będzie mogła co najwyżej jeszcze bardziej się obniżać.
2. Istnieją lepsze, równie dobrze wspierane, nowsze rozwiązania, które w przeciwieństwie do MD5 są bezpieczne.
3. Nie widzę żadnego powodu by korzystać z MD5, a jest kilka przeciw.
4. Jeżeli gdzieś korzystasz z MD5 w celach zapewnienia bezpieczeństwa - powinieneś rozważyć migrację na inny algorytm.
pyro
Cytat(Crozin @ 13.02.2014, 01:42:37 ) *
1. MD5 już obecnie jest podatne na różne ataki, w niedalekiej przyszłości jego jakość będzie mogła co najwyżej jeszcze bardziej się obniżać.
2. Istnieją lepsze, równie dobrze wspierane, nowsze rozwiązania, które w przeciwieństwie do MD5 są bezpieczne.
3. Nie widzę żadnego powodu by korzystać z MD5, a jest kilka przeciw.
4. Jeżeli gdzieś korzystasz z MD5 w celach zapewnienia bezpieczeństwa - powinieneś rozważyć migrację na inny algorytm.


Nie widzę najmniejszego powodu, dla którego należałoby wmawiać mi coś na siłę, skoro jedyne co robisz, to tylko powtarzasz w większej ilości tekstu. Wielokrotne cytowanie nic nie daje. Zrobię to jeszcze (trzeci) raz:

Cytat(pyro)
MD5 jest przestarzały i obecnie istnieją o wiele lepsze algorytmy hashujące, ale "uznanym za złamane" trochę przesadziłeś.


...natomiast następnym razem specjalnie dla Ciebie obudzę Krakena, zwanego dalej Paintem i pokażę strzałeczkami od szczegółu do szczegółu, dlaczego napisałeś to samo wink.gif .

Uspokoję także Twoje zmartwienia - od dawna nie używałem, nie używam i nie będę używać MD5, jednak za wybitną troskę chętnie postawię Ci piwo smile.gif .

Cytat(Crozin)
@pyro: W przypadku funkcji skrótu, przez "złamanie" nigdy nie będzie się rozumiało znalezienia oryginalnych danych wejściowych, tylko co najwyżej kolizji.


To wynika z samej funkcji skrótu. W MD5, tak samo jak innych algorytmach hashujących ilość kolizji jest nieskończona. Kiedy natomiast można mówić o złamaniu? Jeżeli np. zostanie znaleziona metoda, która pozwoli na odnajdywanie kolizji z danego zakresu / długości znaków / zawierających frazę. Wtedy natomiast "kolizją" dla niesolonych haseł będzie samo hasło, a w przypadku solonych haseł i znajomości tej soli również pierwotna forma. W przypadku solonych haseł z nieznajomością soli również będzie możliwe poznanie pierwotnej formy, jeżeli np. jest to skrypt gdzie możemy sprawdzić jak ta sól jest generowana.
plej
a nie lepiej dosolić hasło dać przez md5 potem znów dosolić i dać przez sha1?

xart facebook nie ma lepszego szyfrowania od ciebie haha.gif
nospor
@plej wez przeczytaj ten temat jeszcze raz oraz podtematy, ktore podano. Masz tam bardzo dobrze wyjasnione, ze kilkukrotne mieszanie nie zwieksza bezpieczenstwa.... wrecz odwrotnie - zmniejsza je.
plej
no wyczytałem to ; p

Kiedyś pare lat temu na jakieś angielskiej stronie wyczytałem "solidne syfrowanie" no i tam bylo takie coś ; p

osobiście tego nie uzywam ; p
emillo91
a ja zrobiłbym to tak:
  1. $klucz = array("a" => "kwiq", "b" => "45pp", "c" => "dl", "d" => "22f", "e" => "fv1", "f" => "2", "g" => "45h", "h" => "Oq3", "i" => "doa"
  2. , "j" => "d", "k" => "49", "l" => "q04", "m" => "oep", "n" => "qj", "o" => "01o", "p" => "bb", "q" => "cd", "r" => "ao", "s" => "q01", "t" => "o4p"
  3. , "u" => "fff", "v" => "30r", "w" => "pqo", "x" => "ien", "y" => "j", "z" => "10", "0" => "co", "1" => "ap", "2" => "l3", "3" => "d0", "4" => "3l3"
  4. , "5" => "qp1", "6" => "vbu", "7" => "so", "8" => "al", "9" => "qp");
  5. foreach ($klucz as $litera => $kod)
  6.  
  7. $klucz[$litera] = "$kod";
  8.  
  9. $tekst = str_ireplace(array_keys($klucz), array_values($klucz), $haslo);
  10. $koduj = md5($tekst);


Teraz spróbuj sobie odgadnąć twoje hasło biggrin.gif

edit:
Już poprawione wink.gif
sowiq
Tak patrzę w ten kod i nie wiem czym się różnią tablice $klucz i $symbol dry.gif

Bo o bezpieczeństwie md5 było już wystarczająco wink.gif
Damonsson
@emillo91
1. Szybkość znalezienia kolizji jest na tym samym poziomie,
2. Bezpieczne hashowanie to takie, w którym atakujący mimo, że zna algorytm nie jest w stanie odgadnąć hasła.

To coś co stworzyłeś, nic nie robi, a na pewno nie poprawia bezpieczeństwa o więcej niż 1%.
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.