Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: podwójne hashowanie haseł
Forum PHP.pl > Forum > PHP
Stron: 1, 2, 3
nospor
w związku z lekkim OT w pewnym temacie, który rozwinął się w ciekawą dyskusję, temat rozdzielam. Dotyczy on:
Czy podwójne (n-te) hashowanie hasła jest bezpieczniejsze, od pojedynczego hashowania

md5 sie nie odkoduje. mozna trafic na rozwiązanie metodą brute force. Dla tej metody jednak jest bez roznicy, czy ty dane haslo przepuścic przez md5 raz, dwa czy milion razy wink.gif

Posty będące duplikacją postów już zawartych w temacie, będą bez ostrzeżenia usuwane. Ma to zapobiedz tworzeniu się zbędnego śmietnika
wijet
Ja też myślalem że przepuścić przez md5 dwa razy będzie lepiej, ale ja to bym zrobil tak.

  1. <?php
  2.  
  3. $tajny_ciag = '23mjdkifjS1lpo321lpSAo5c90sawe3';
  4.  
  5. $zaszyfrowane = md5($tajny_ciag.md5($tajny_ciag.$_POST['pass']));
  6.  
  7. ?>
mike
Haszowanie dwa razy jest bez sensu, no bo nawet jeśli działa to co z tego?
W takim razie dlaczego nie 10 razy.

To jest jak z kostką Rubika. Jak już pomieszałeś dobrze, to każde kolejne przekręcenie ścianki nic nie daje.
Nie da się bardziej pomieszać.

A md5 jest algorytmem mieszającym.

P.S.
Wiecie dlaczego polskim matematykom udało się rozszyfrować Enigmę?
Bo niemieccy projektanci założyli, że jak kodowanie będzie odbywać się dwa razy to wzrośnie efektywność.
A stało się to przyczyną jej złamania wink.gif
FiDO
Cytat(mike_mech @ 2006-02-27 14:30:17)
rety, co wy żeście się przyczepili tego podwojnego hashowania. jeszcze ten tajny ciąg...
Metodzie brute force jest to wszystko jedno. Proponuje poczytać coś na ten temat. md5 do nie jest szyfrowanie dwustronne, że trzeba kombinować. Na to jest tylko jedna metoda by odgadnąć haslo: brute force, czyli tworzenei kombinacja hasla do bólu, aż się natrafi na takie co pasuje. Możecie te haslo mlynkiem mielic, ale jak pasuje to pasuje i juz smile.gif

No niezupelnie. Zgadzam sie z tym, ze w gre wchodzi tylko b-f (aczkolwiek na md5 juz sa jakies bardziej inteligentne sposoby), tylko ze jest roznica dla b-f czy atakujesz haslo, ktore ma 7 znakow czy tez takie, ktore ma 32 znaki.
Zakladajac, ze haslo brzmi 'tajne123' to probujac je zaatakowac przy pojedynczym hashowaniu b-f powinien sobie poradzic w czasie takim, ze oplaca sie czekac (tak na oko przy tej dlugosci sadze, ze jest to do rozlozenia w czasie gora kilku dni przy pesymistycznym zalozeniu na domowym sprzecie), w koncu to 'tylko' 8 znakow. Jesli hashujemy podwojnie to pierwszy cykl b-f bedzie musial zwalczyc ciag 32 znakowy (litery i cyfry), a tego juz tak szybko zrobic sie nie da. A nawet jak juz sie po wielu miesiacach/latach uda to otrzymamy w wyniku jeszcze jeden hash i zabawa od nowa.
To tak na pierwszy rzut oka.. jednak pamietam przez mgle z inzynierii bezpieczenstwa, ze koles cos mowil o nieskutecznosci podwojnego szyfrowania, nie pamietam jednak czy tyczylo sie to tez hashowania. Jesli ktos widzi jakas dziure w rozumowaniu, ktore przedstawilem wyzej to smialo.. chetnie sobie odswieze wiedze, a przez ksiazki kopac mi sie teraz nie chce winksmiley.jpg
rbart
Osobiście niewiem po co to podwójne kodowanie md5 skoro i tak qbase zastanawia się nad zapamiętywaniem użytkownika przez cookies. Poreszto czy to nowe zabezpieczenia fort'u knox snitch.gif jeżeli nie to całe kodowanie służy tylko do tego że jeżeli już komuś uda się odczytać dane z bazy to żeby niemógł wyciągnąć haseł (znaczy się bez problemu). Md5 zapewnia bezpieczenstwo o wiele wyższe od tego które będzie potrzebne.

Teoretycznie :

Jakie kolwiek złamanie hasła wiąże się jedynie z metodą b-f o odkodowaniu md5 mogą wszyscy zapomnieć. I w tym przypadku podwójne zakodowanie md5 może spełnić swoją rolę ponieważ wtedy b-f będzie musiał wygenerować 128 bitowe ciągi znaków. o ile dobrze pamiętam to jest 32 znaki co napewno będzie trudniej rozszyfrować b-f'em z drugiej strony jeżeli ktoś już wyciągnął zakodowane hasła z bazy to napewno sprawdzi czym i jak były kodowane i wtedy okazuje się że podwujne kodowanie jest bez sensu ponieważ wspomniana osoba dalej posłuży się b-f tylko będzie musiała go dwa razy kodować i dopiero sprawdzić z rekordem w bazie.
sobstel
Cytat(nospor @ 2006-02-27 11:48:23)
md5 sie nie odkoduje. mozna trafic na rozwiązanie metodą brute force. Dla tej metody jednak jest bez roznicy, czy ty dane haslo przepuścic przez md5 raz, dwa czy milion razy winksmiley.jpg Moze się okazać, ze podwojne shashowanie hasla, zostanie rozwiązane szybciej, niż byś to zrobil tylko raz smile.gif tak więc nie kombinuj smile.gif

widze wlasciwie tylko jeden przypadek kiedy kombinowanie z md5 ma sens. istnieją w necie duze bazy z wygenerwoanymi hashami slow ze slownika, ich kombinacji, itp. (podajesz 32-znakowego hasha a on ci wyrzuca co sie pod tym kryje). jesli ktos w jakis sposob wszedl w posiadanie np. hasel zakodowanych md5 wtedy uzywajac powyzszej bazy stosunkowo łatwo wyciągnie większość haseł.
ale powiedzmy sobie jasno ze jesli ktos rzeczywiscie wejdzei w posiadanie hasel i loginow to znaczy ze aplikacja jest dziurawa jak sito, ale to juz inna sprawa tongue.gif

oczywiscie przy metodach typu brute-force to nie gra zadnej roznicy chocby ktos zrobil crypt, md5, sha1, przemieszial wszystko i jeszcze powtorzyl kilka razy ;-)

co do odkodowania md5, jak juz ktos kiedys ladnie zauwazyl, gdyby to bylo mozliwe to mielibysmi najlepszy w historii algorytm kompresji... wszystko mozna do 32 znakow tongue.gif
Aztech
[offtopic mode on]
Cytat
co do odkodowania md5, jak juz ktos kiedys ladnie zauwazyl, gdyby to bylo mozliwe to mielibysmi najlepszy w historii algorytm kompresji... wszystko mozna do 32 znakow

laugh.gif laugh.gif
Rozbroiłeś mnei tym wnioskiem, w życiu bym nie pomyślał w tych katergoriach o md5
[offtopic mode off]
Co do podwórjnego md5 to nie widzę sensu, wszystkie argumenty zostały już powiedziaane wcześniej.
nospor
Cytat
Zakladajac, ze haslo brzmi 'tajne123' to probujac je zaatakowac przy pojedynczym hashowaniu b-f powinien sobie poradzic w czasie takim, ze oplaca sie czekac (tak na oko przy tej dlugosci sadze, ze jest to do rozlozenia w czasie gora kilku dni przy pesymistycznym zalozeniu na domowym sprzecie), w koncu to 'tylko' 8 znakow. Jesli hashujemy podwojnie to pierwszy cykl b-f bedzie musial zwalczyc ciag 32 znakowy (litery i cyfry), a tego juz tak szybko zrobic sie nie da. A nawet jak juz sie po wielu miesiacach/latach uda to otrzymamy w wyniku jeszcze jeden hash i zabawa od nowa.

Przyznam szczerze, iż nie wiem jak robi się w praktyce ataki b-f. Nigdy nie robilem winksmiley.jpg Wiem z teorii tylko jak dzialają.
Ale przypuśćmy, ze taki atak polega na ciąglym wysylaniu requesta do strony, gdzie należy się zalogować. W request wysylane jest haslo. Jak wiemy jest to haslo wówczas w postaci jawnej (nie hashowane). Tak więc nie ma znaczenia, ze hash będzie mial 32 bajty czy też więcej. Nie ma znaczenia, ze po stronie serwera bedzi dodawany jakiś tajny ciąg do tego. Znaczenie ma to, ze haslo ma 8 znaków i wygenerowanie ich wszystkich kombinacji nie ma już zadnego związku z metodami hashowania na serwerze.
lenczewski
hmmm. a jednak będę odmiennego zdania, niż cześc tu obecnych.
Zakładając, że ktoś wyciagnie hasło uzytkownika (ciastka, itp.) i będzie ono zakodowane md5($hasło), rozszyfrowanie tego nie zajmie dużo czasu (no chyba, ze ma więcej niż 7 znaków), natomiast rozszyfrowanie md5(md5($hasło)) potrwa raczej zbyt długo ...i yu w zupełności zgadzam się z FIDO.
Lektura: Rainbow Tables
Cytat
co do odkodowania md5, jak juz ktos kiedys ladnie zauwazyl, gdyby to bylo mozliwe to mielibysmi najlepszy w historii algorytm kompresji... wszystko mozna do 32 znakow

winksmiley.jpg istnieje jeszcze coś takiego na kolizje kodowania, tzn. 32 znaki muszą się kiedyś powtarzać, dlatego jeżeli będziesz chciał coś "odkompresować" winksmiley.jpg możesz otrzymać zupełnie coś innego, a taka szansa jest wprost proporcjonalna do długości ciągu początkowego.

Wniosek nasuwa się mi prosty, chyba stosowanie podwójnego md5() nie obciąza tak bardzo serwera, żeby tego nie używać. na pewno nikt na tym nie straci, a do zzyskania jest o wiele więcej. Zawsze lepiej jest komuś (potencjalnemu "chackerowi") coś utrudnić, niż ułatwić.

tak swoją drogą, baza danych hashów md5() samych liczb (do 7 znaków) zajmuje ok. 1.3 GB winksmiley.jpg złamanie takiego hasła (przeszukanie bazy) to ok. 3 min.

-edyta:
jeszcze raz [OT]:
Cytat
co do odkodowania md5, jak juz ktos kiedys ladnie zauwazyl, gdyby to bylo mozliwe to mielibysmi najlepszy w historii algorytm kompresji... wszystko mozna do 32 znakow

jest algorytm (stosunkowo prosty) gdzie z pliku powiedzmy 200kb po rozpakowaniu otrzymamy jakieś 60GB, wszystko zalezy od tego co pakujemy.
My4tic
A co powiecie o słownikach hashy w md5 których pełno w necie? W takim wypadku podwójne hashowanie czy kombinacje z 'tajnym ciagiem' zaczynają mieć sens. Zgadzam się ze md5(md5(pass)) samo w sobie nie ma większego sensu ale żeby uniknąć metody słownikowej może być przydatne.
nospor
Kurka wodna, jak to potrafią czlowiekowi wodę z mózgu zrobić.... winksmiley.jpg
Jak tak czytam kolejne wypowiedzi, to zaczynam wierzyć w lekki sens tego kombinowania smile.gif

edit: oczywiscie mam na mysli sytuację, gdy ktoś wykradnie nam hasha. Bo gdy b-f leci bezposrednio na stronę, to takie kombinowanie jest bez sensu
My4tic
Zgadza sie - na b-f nic sie nie poradzi ale podwojny hash dla takiego czegoś:

http://gdataonline.com/seekhash.php

to już bedzie problem.
lenczewski
nospor: dla bezpośredniego ataku na strone (remote) mało co ma sens. Zakładając, że serwer odpowiada czy jest dobre hasło czy nie w czasie powiedzmy 0,5 s. (co jest czasem chyba bardzo dobrym winksmiley.jpg, daje to 172 800 zapytań na dobę, przy haśle powiedzmy pięcio literowym (małe litery bez cyfr i innych znaków) przy najbardziej pesymistycznym podejściu
Kod
24^1+24^2+24^3+24^4+24^5

daje to 8 308 824 hashów
Czyli jakieś 48 dni, nie licząc padów serwera winksmiley.jpg

Exploitów do wyciągnięcia haseł z phpBB jest masa. ...a z tamtąd już tylko prosta droga do gdata.

-add:
oczywiście dodanie do hasła znaków innych niż alfanumeryczne spowoduje koszmarne utrudnienie w złamaniu takiego hasła, ale to już raczej mentalność użytkowników, a nie administratora ;(
SHiP
Co do kodowania 2 x md5 heh a nie łatwiej użyć kodowania sha1()? Dużo mniej znany sposób więc i baze danych hashów nie bedzie łątwo znaleźć przez co napewno będzie ciężej go złamac ;] Dla utrudnienia można kodować w sh1 i ucienać 8 znaków przez co bedzie to wyglądało jak md5 ;] Nikt nie zauważy =)

Co do COOKIE + md5 ;] skoro mamy hasło w md5 to po co je odkodowywać? Wystrczy spreparować odpowiednie ciastko i mamy dostęp do kona ;]
lenczewski
hmmm. po co?
jeżli masz odkodowane hasło, szansa, że użytkownik ma takie samo w mailu #1 mailu #2, innych kontach, homebanking, itp., a wszystko dzięki Twojej stronie i "systemu zabezpieczeń" na niej.

co do Twojego sposobu z SHA1() wydaje się być bardo dobry.

ja użwam od jakiegoś czasu megody w której koduje $hasło . $mail funkcjami md5(md5()) (i taki zapis jest w kodzie źróodłowym) następnie w innej cześci trafia to do bazy, gdzie jest standartowe pole typu passwd.
Jak ktos dostanie moje baze bedzie mam nadzieje, ze bedzie lekko wprowadzony w blad, a przy okazji powstała optymalizacja bazy (w jednej kolumnie trzymam dwie rzeczy i zamiast adresu e-mail + 32 znaki na hasło, mam 16).

Dlatego namawiam wszystkich do nie stosowania standartowych rozwiazan typu md5() i po sprawie. Dołączenie choćby jednego znaku (~!@#$%^&*(){}:"<>?/.,;'[]) znacznie utrudni sprawę. Jednak i tak nie daje to 100% metody na nie odkodowanie. Jeżeli ktoś dostanie kod źródłowy strony, sam może napisać taką funkcję substr(sha1($tajne), 0, 32), a wtedy b-f i kwestia czasu winksmiley.jpg

Nie popadajmy jednak w panikę, metod na nieautoryzowany dostęp do aplikacji jest napradwdę mnóstwo. Poprostu róbcie rzeczy nieszablonwe (tyczy sie kodowania hasel), co do reszty, coz jest SQL Injection, Code injection, Cross-Site scripting, HTTP Response Splitting, Directory traversal, Session fixation, Session injection... i pewnie jeszcze milion innych metod.

Coż jest miecz, jest tarcza, ale i miny przeciw piechotne, granaty, rakiety bliskiego, średniego i dalekiego zasięgu ...i pewnie miltion innych winksmiley.jpg
chomiczek
Cytat(SHiP @ 2006-03-23 22:02:10)
Dla utrudnienia można kodować w sh1 i ucienać 8 znaków przez co bedzie to wyglądało jak md5 ;] Nikt nie zauważy =)

Z tym ucinaniem to chyba nie jest za dobry sposób z uwagi na to, że chyba jest spore prawdopodobieństwo żeby początkowy fragment sie zdublował z jakimś innym.

Co do MD5 to jest podobno wydajny sposób na podstawienie swojej zawartości zawierające taka samą sume kontrolną (md5). Sposób ten opracowali jacyś naukowcy i de facto nie został jeszcze opublikowany, ale..

P.S. jak znajde ten artykuł to dokleje linka.

-add:
Co do stosowanie np. samego MD5 to ja osobiście np. uploadując fotki na serwer wprowadzam nazewnictwo typu: md5('#d.icA'.mysql_inserted_id()); dla dużych fotek i dla miniaturek md5('#m.icA'.mysql_inserted_id()); sądze, że jest to dobry sposób a jesli ktoś nie ma dostępu do kodu to nie wie nawet jak to ugryźć.
kszychu
Cytat(lenzcewski @ 2006-03-24 06:53:32)
hmmm. po co?
jeżli masz odkodowane hasło, szansa, że użytkownik ma takie samo w mailu #1 mailu #2, innych kontach, homebanking, itp., a wszystko dzięki Twojej stronie i "systemu zabezpieczeń" na niej.

Debile, którzy używają jednego hasła do wszystkiego sami są sobie winni! Jak można używać takiego samego hasła do logowania na forum i logowania do banku?!
Najlepszym zabezpieczeniem i tak pozostanie ludzka inteligencja. Wtedy nawet jeżeli ktoś odkryje Twoje hasło do strony, to będzie znał tylko... hasło do strony. I nic więcej.
E-d
md5 da się odhaszować.
http://md5.rednoize.com/
Więc lepiej używać sha1
lenczewski
krzychu:
nie zmienia to faktu, że ktoś uzyskał dostęp do jego haseł poprzez nasz serwis, stronę, czy co tam innego. Przy Twoim rozumowaniu po co wogule kodować hasła?
nospor
Cytat
md5 da się odhaszować.
http://md5.rednoize.com/
Więc lepiej używać sha1
To jest akurat przykład na łamanie "łatwych haseł". Link ten, lamie hasla, które skaladają sie tylko z liter. Przykladowo zlamal mi takei hasla:
kaczor
mama
ale wystarczylo, ze zamiasta a dalem 4, albo zamiast o dalem 0 (zero), i juz nie znalazl:
k4czor
kacz0r
m4ma

W łamaniu hasel duża wina leży po stronie uzytkownika. Od stopnia skomplikowania swego hasla. Im mniejszy stopien, tym szybciej go zlamac.

Kiedys jeden z największych hackerów na świecie powiedzial, że byl najlepszy nie dlatego ze umial lamac kody, ale dlatego, ze znal mentalność ludzką, która jest największym sprzymierzeńcem hackera. To zadzwonil do Pani krysi, powiedzial ze zapomnial hasla lub jakas inna bajeczka i ona mu podawala wszystko jak na tacy.
Albo zbieral dane o osobie. Imie żony, dziecka i takie tam. Mamy niestety (jako ludzie) takie sklonnosci, ze wlasnie takie nadajemy hasla: imie zony, rok urodzenia lub podobne. Nie mowię ze wszyscy winksmiley.jpg Ale spora grupa osób tak robi.

Podobnie jest tutaj. Chcemy miec bezpieczne hasla? Zadbajmy oto sami smile.gif
Oczywiście jesli i dany serwis nam w tym pomoże, to też nie zaszkodzi winksmiley.jpg

ps: mojego hasla nie zlamal biggrin.gif
kszychu
Cytat(lenzcewski @ 2006-03-24 11:41:30)
Przy Twoim rozumowaniu po co wogule kodować hasła?

Nie zrozum mnie źle, nie twierdzę, że nie należy kodować haseł. Tak czy inaczej jednak, każde zabezpieczenia można złamać.
Mówimy tutaj jednak o sytuacji, w której cyfrowym zamkiem najnowszej generacji zamykamy drewniany składzik z węglem. Da się obejść nawet taki zamek, tylko uważam, że nawet zwykła kłódka byłaby wystarczającym zabezpieczeniem, bo po co się włamywać do komórki z węglem.
Przestrzegam natomiast przed sytuacją, w której jeden klucz służy nam do wszystkich zamków w domu, bo ktoś wścibski, "rozpracowawszy" zamek do komórki z węglem, spróbuje tym samym kluczem otworzyć sejf za obrazem.

A tak na marginesie: jeżeli ktoś włamie Ci się do systemu i wyciągnie hasche haseł, to wyciągnie równieżdowolne inne informacje, więc po co miałby się bawić w odkodowywanie tych haseł?

Cytat

Nie zdziwiłbym się, gdyby ten serwis "karmił" swoją bazę wpisywanymi tam hasłami...
FiDO
Cytat
Przestrzegam natomiast przed sytuacją, w której jeden klucz służy nam do wszystkich zamków w domu, bo ktoś wścibski, "rozpracowawszy" zamek do komórki z węglem, spróbuje tym samym kluczem otworzyć sejf za obrazem.

A tak na marginesie: jeżeli ktoś włamie Ci się do systemu i wyciągnie hasche haseł, to wyciągnie równieżdowolne inne informacje, więc po co miałby się bawić w odkodowywanie tych haseł?

Na przyklad po to o czym napisales w pogrubionym akapicie. Majac haslo danej osoby mozna sprobowac tym samym haslem wejsc na jakies inne serwisy, w ktorych jest ona zarejestrowana.. kto wie czy ludzie nie daja takich samych hasel do maila, na ktorego sie zarejestrowali, a majac baze prawdopodobnie jestesmy w ich posiadaniu, a to juz cos.
Ewentualnie ktos moze miec po prostu ochote namieszac ludziom na kontach, takich dowcipnisiow tez nie brakuje. Nie zawsze motywem musza byc jakies profity.

Cytat
Cytat

Nie zdziwiłbym się, gdyby ten serwis "karmił" swoją bazę wpisywanymi tam hasłami...

Przeciez on tak wlasnie robi. Jak wpiszecie haslo nie bedace hashem md5, ktorego jeszcze nie ma w bazie to pojawia sie informacja "Result saved", wiec to jest baza budowana przez ludzi.

Co do podwojnego hashowania to ja sugeruje jeszcze troche inna metode. Samo md5(md5) ma taka wade, ze kilka osob z tym samym haslem (zdziwilibyscie sie jak duzo osob uzywa powiedzmy 'standardowych' 123456 czy czegos podobnego kalibru) otrzyma takiego samego hasha. Nie jest to dobre, bo lamiac jedno takie haslo mamy dostep do wszystkich kont z tym samym hashem. Dlatego ja stosuje cos w rodzaju sha( 'jakis_ciag' + sha(haslo)), gdzie 'jakis_ciag' to jest jakis string wygenerowany w jakis sposob z danych tego uzytkownika (musi byc za kazdym razem taki sam, zeby za kazdym razem byl generowany taki sam hash).
W najprostszej wersji moze to byc chociazby sam login (albo nawet jego hash, zeby za latwo nie bylo ;]) lub tez jakas inna kombinacja niezmienialnych danych o uzytkowniku.
kszychu
Cytat(FiDO @ 2006-03-24 13:23:39)
Na przyklad po to o czym napisales w pogrubionym akapicie. Majac haslo danej osoby mozna sprobowac tym samym haslem wejsc na jakies inne serwisy, w ktorych jest ona zarejestrowana.. kto wie czy ludzie nie daja takich samych hasel do maila, na ktorego sie zarejestrowali, a majac baze prawdopodobnie jestesmy w ich posiadaniu, a to juz cos.

Dlatego napisałem, że tylko głupcy używają tego samego hasła do róznych rzeczy.
FiDO
Ja tak robie tongue.gif

Oczywiscie nie ot tak sobie przypadkowo.. mam zestaw kilku hasel o zroznicowanym stopniu skomplikowania oraz kilka ich wariacji (rozniacych sie z reguly kilkoma znakami). Uzywam ich zgodnie ze stopniem waznosci danego konta, wiec rzeczy najwazniejsze maja te najtrudniejsze hasla (nawet i ok 25 znakow), a rzeczy o najnizszym priorytecie maja te prostsze (i w sumie tylko te hasla i ich wariacje sie powtarzaja).
Gdybym mial wymyslac osobne haslo do kazdego konta to mialbym problem z ich zapamietaniem. A w ten sposob hasel "glownych" mam dosc malo, pamietam wszystkie ich wariacje, wiec w sumie mam do dyspozycji kilkanascie roznych kombinacji. O ile hasel raczej nie zapominam to zdarza mi sie czasem zapomniec, ktore uzywam do jakiegos tam rzadko uzywanego konta. Jakbym mial ich wiecej to sprawa by sie jeszcze skomplikowala, a zapisywac hasel na dysku (czy innej pamieci zewnetrznej w stosunku do glowy) nie mam zamiaru smile.gif
shpyo
Cytat(E-d @ 2006-03-24 12:36:29)
md5 da się odhaszować.
http://md5.rednoize.com/
Więc lepiej używać sha1

sha1 to już przeszłość - został złamany przez dwie Chinki.
UsTeK
Cytat
sha1 to już przeszłość - został złamany przez dwie Chinki.

A co to znaczy że został złamany? Znaleziono kolizję? W takim razie kiedy złamano MD5? Dlaczego więc nadal używa się MD5?

Moja propozycja to:
  1. <?php
  2. $pass = md5( sha1($_POST['pass']) . $_POST['pass'] );
  3. ?>



//Edit:
Sorrki, głupote walnąłem, miało być na odwrót:
  1. <?php
  2. $pass = sha1( md5($_POST['pass']) . $_POST['pass'] );
  3. ?>

Dlaczego tak? B-F dla sha1 jest o wiele mniej popularny, a dodanie md5($_POST['pass']) sprawia, że RainbowTable jest bezużyteczny.



Pozdrawiam,
UsTeK
Vengeance
Dlaczego twierdzicie, że n-hash kompletnie nic nie daje? Wg mnie, przy metodzie brute-force zwiększa czas potrzebny na pozyskanie hasła (i to do czasu wrecz nieosiagalnego dla nas... kilkadziesial latek).

Może uzasadnie jak to widze (jesli sie myle poprawcie):
Jezeli uzytkownik zakoduje haslo 'test' metoda brute-force sprawdzajaca po kolei alfabet dosc szybko zwroci wynik. Ale przy podwojnym hashu, najpierw trzeba bedzie odgadnac 1 hash, a dopiero potem realne hasło. Biorac pod uwage, jak ciezej jest trafic w 32 znakowe haslo (w stosunku do tego 4 znakowego) chyba nikt mi nie powie, ze 2xmd5 jest bezsensu?

Ja to traktuje jako zwykle "wzmocnienie" hasla uzytkownika. Z takieog 4 znakowego na 32...
nospor
Cytat
Jezeli uzytkownik zakoduje haslo 'test' metoda brute-force sprawdzajaca po kolei alfabet dosc szybko zwroci wynik. Ale przy podwojnym hashu, najpierw trzeba bedzie odgadnac 1 hash, a dopiero potem realne hasło. Biorac pod uwage, jak ciezej jest trafic w 32 znakowe haslo (w stosunku do tego 4 znakowego) chyba nikt mi nie powie, ze 2xmd5 jest bezsensu?
Przy metodzie brute force, generuje się hasla, anie hashe. potem te haslo wysyla się na serwer lub tez wykonuje te samo hashowanie co na serwerze. Tak wiec dla b-f bez roznicy jest przez co to haslo zostanie zmielone, gdyz generujemy hasla a nie kolejne kroki mielenia.
Te kolejne hashe, mogą wydluzyc czas znalezienia hasla metodą b-f, gdyż trzeba dodatkowo x -razy wywolac te md5, ktore jakis tam czas sie wykonuje.

Ja osobiscie juz troche inaczej patrze na to mieszanie hashy, ale to tylko ze względu na te slowniki co juz w necie są
popo
2xmd5 = 2x wieksza szansa na kolizje.
Z prostego powodu, ze md5 jest stratny.
Istnieje wiec realna szansa, ze pomimo podania 2 roznych hasel mozesz dostac ten sam hasz 2 poziomu.
Jesi haszujesz md5 to wlamywacz nie musi wcale szukac oryginalnego tekstu, a jedynie cos co da mu klucz 1 poziomu. Jak juz to cos znajdzie to hasz 2 poziomu sam sie wygeneruje identycznie jak dla poprawnego hasla.
Poza tym nie musi on trafic w idealnie ten sam hasz 1 poziomu a jedynie w jeden z wielu ktore dadza mu w rezultacie hasz 2 poziomu co w rezultacie znacznie zwieksza szanse na trafienie.

Zagniezdrzanie md5 samego w sobie nie jest raczej dobrym pomyslem, zreszta zagnierzdzanie jakiegokolwiek "haszowania" nie jest polecane (zwieksza sie strate informacji, a co za tym idzie zwieksza prawdopodobienstwo trafienia w "kolizje")

Mozna oczywiscie zastosowac inne algorytmy szyfrowania, ale to raczej malo ekonomiczne i jak ktos wlamie sie na serwer, to i tak za wiele nie da bo bedzie mogl sobie obejrzec algorytm szyfrujacy. Chyba ze umiescimy go poza obszarem dostepnym z internetu, czyli wwwroot. W wielu serwisach udostepniajacych uslugi hostingowe moze to jednak stanowic powazny problem.

co do nieslabnacej popularnosci md5 to ... niestety na wielu serwerach nie ma mozliwosci uzywania sha1 (znam conajmniej 2 takie i to platne)
Tam, zmuszony jestes stosowac md5

Pewnym pomyslem moze byc dodawanie jakiegos dodatkowego ciagu do hasel userow tyle, ze problem taki sam jak poprzednio w razie zlamania zabezpieczen wlamywacz najprawdopodobniej bedzie mogl sobie podejrzec ten ciag

Najlepszym wiec sposobem na zabespieczenie userow jest uswiadomienie im jak wazne jest wybranie odpowiednio dlugiego i trudnego do odganiecia hasla.

Mozna tez stosowac wstepne sprawdzanie hasel proponowanych przez userow i poprostu odrzucac te zbyt proste lub oczywiste (cos na wzor cracklib uzywanego do eliminowania slabych hasel userow przy ich zmianie dla kont shelowych)

Jest to oczywiscie utrudnieniem dla uzytkownikow i nie zawsze mozna stosowac tego typu praktyki
Vengeance
Cytat
Tak wiec dla b-f bez roznicy jest przez co to haslo zostanie zmielone, gdyz generujemy hasla a nie kolejne kroki mielenia.


Ja mówiłem o najczęstrzej sytuacji... gdzie ktoś np. uzyskuje dostęp do bazy sql czy też w jakiś inny sposób poznaje hash hasła użytkownika. W tym momencie, odgadniecie hasla metoda bruteforce przy dwukrotnym hashu jest bedzie duzo trudniejsze!

"2xmd5 = 2x wieksza szansa na kolizje." Przykro mi, że nie mam tak potężnej wiedzy w kryptografii, iż nie mogę tego ani poprzezć ani obalić. Ale na "mój nos" mogę powiedzieć, że nigdy się z tobą nie zgodzę w tej kwestii winksmiley.jpg

Powracając znów do wypowiedzi nospora, jeżeli mówimy o metodzie b-f na zasadzie: wyślij formularz POST do skryptu logowanie.php to i najlepsze alg. nic nie poradzą :] Powótrze jeszcze raz, ja mówie o sytuacji gdzie ktoś w jakiś sposób zdobywa 32 znaki z zakresu 0-9a-f :]
nospor
Cytat
Ja mówiłem o najczęstrzej sytuacji... gdzie ktoś np. uzyskuje dostęp do bazy sql czy też w jakiś inny sposób poznaje hash hasła użytkownika. W tym momencie, odgadniecie hasla metoda bruteforce przy dwukrotnym hashu jest bedzie duzo trudniejsze!

Powracając znów do wypowiedzi nospora, jeżeli mówimy o metodzie b-f na zasadzie: wyślij formularz POST do skryptu logowanie.php to i najlepsze alg. nic nie poradzą :] Powótrze jeszcze raz, ja mówie o sytuacji gdzie ktoś w jakiś sposób zdobywa 32 znaki z zakresu 0-9a-f :]
Nie, no oczywiscie, jezeli ktos zdobedzie hasha i mysli ze ten hash powstal w wyniku jednokrotnego uzycia md5, to i faktycznie nie znajdzie metodą b-f hasla, gdy bedzie tylko raz przepuszczal przez md5. Ale jezeli ten ktos, wie, ze to bylo dwa razy md5, to na nic to, ze to bylo dwa razy md5. Takie samo zabezpieczenia co by bylo tylko raz. Przeciez wowczas hacker wie, jak ma mielic do b-f smile.gif
Vengeance
"Ale jezeli ten ktos, wie, ze to bylo dwa razy md5, to na nic to, ze to bylo dwa razy md5. Takie samo zabezpieczenia co by bylo tylko raz."

Wiesz ile setek lat by trwało "trafienie" w 32 znakowy hash, który wygenerował ten drugi hash? biggrin.gif Także uważam, że 2xHash (czy jakie kolwiek inne sposoby na dodawanie smieci do hasla usera zanim je zahashujemy) ma sens.
nospor
widze że się nie rozumiemy smile.gif

koles gdy robi b-f, generuje hasla w postaci jawnej, a nie hashe. I skoro wie, jak je potem mielic, to dla niego juz bez roznicy, czy raz md5 czy dwa razy, gdyż niezależnie od tego on generuje hasla. Czas jaki się zwiększy na znalezienie hasla, to tylko o te dodatkowe jedno wykonanie funkcji md5() (oczywiscie w petli).
Vengeance
No tak racja, o ile wie ;] Najczęściej nie wie i skapnie się dopiero po 150x latach, gdy w rezultacie otrzyma 32 znakowe hasło snitch.gif
popo
Vengance on nawet nie musi tego wiedziec cala brudna robote odwala za niego twoje wlasne skrypty tongue.gif btw moja opinia oparta jest o raczej dobrze poinformowane zrodla, a co do wyciagania z hashy hasel to erm nie musi zgadnac jedynego poprawnego wystarczy ze znajdzie cos co daje taki hash a jesli wlamie sie na twoje konto na serwerze to pewnikiem zdola przejrzec skrypty a wtedy no cuz smile.gif
dodawanie jakichs losowych ciagow do hasel ma sens ale nie zawsze (jesli masz mozliwosc ukryc totalnie przed dostepem z zewnatrz to cos co dodajesz to ok zwiekszy dlugosc hasla i cos co zostanie zdekodowane z hasza wprowadzone na stronce nie zadziala, jednak nie daje to zadnej ochrony porzed atakami z sieci na twoj serwis typu brute force najlepiej przed tym chronia te "powszechnie lubiane obrazki z koslaymi niewyraznymi losowymi literkami i cyferkami (nie widzialem jeszcze automatu ktory by to potrafil ominac)
Vengeance
Te obrazki zwą sie "captcha" i sa automaty je odczytujące (ofc nie wszystkie).
Jest nawet stronka/projekt w necie skupiająca programistów tworzących czytniki takowych.

Swego czasu anakin napisał skrypt w php! o 100% skuteczności odczytywania takich obrazków przy rejestracji w GaduGadu - to dlatego 3 dni potem zostały one zmienione na takie jak te widoczne dziś winksmiley.jpg
Kuziu
~Vengeance Zrób taki mały test:

Zakoduj sobie np. 'fgfwe34r3ferg45twerg' ... czyli obojętnie jaki ciąg którego

http://md5.rednoize.com/

Nie pozna

a potem zrób to samo z słowa którego nie poznało.

Będziesz miał jasną odpowiedź.

Łatwiej im było zrobić wszystki 32 znakowe ciągki z zakresu a-f-1-9 zrobić B-F niż wszystkie pozostałe ciągi.

Więc gdy bym dostał ten Twój 2xmd5 to w moment bym go mial a normalnego gerg345r38jv934 bym tak szybko nie dostał
chomiczek
trochę odświeże temat:
http://www.stachliu.com/collisions.html pod tym adresem jest do pobrania programik, który potrafi w ciągu kilkudziesięciu minut na domowym PC wygenerować kolidujący z podanym skrót MD5.

Dodatkowo na plus za SHA-1 przemawia fakt, że funkcja ta jest standardem wykorzystywanym przez agencje rządowe Stanów Zjednoczonych Ameryki Północnej.
thornag
Odswierzam troche temat ale mysle ze moje pytanie najlepiej pasuje wlasnie do tego,

Kod
md4 md5 sha1 sha256 sha384 sha512 ripemd128 ripemd160 whirlpool tiger128, 3 tiger160, 3 tiger192, 3 tiger128, 4 tiger160, 4 tiger192, 4 snefru gost adler32 crc32 crc32b haval128, 3 haval160, 3 haval192, 3 haval224, 3 haval256, 3 haval128, 4 haval160, 4 haval192, 4 haval224, 4 haval256, 4 haval128, 5 haval160, 5 haval192, 5 haval224, 5 haval256, 5


To sa algorytmu mieszajace dostepne u mnie na serwerze. Wszedzie slysze tylko o md5 i sha1, co mozecie powiedziec o reszcie ? Sa przestarzale ? Niezbyt bezpieczne ? Dlaczego zamiat sha1 nie stosowac sha256, string jest dluzszy, fakt faktem zajmuje zdecydowanie wiecej miejsca ale i ryzyko kolizji jest chyba mniejsze. Co z pozostalymi ? Dlaczego taie jak haval, tiger czy whirlpool sa tak malo popularne ?
MajareQ
Cytat(E-d @ 24.03.2006, 11:36:29 ) *
md5 da się odhaszować.
http://md5.rednoize.com/
Więc lepiej używać sha1



czy to przypadkiem nie jest jedna z teczowych tablic?
kwiateusz
cos w ten desen ale przy 12 znakach nie znalazł hasha smile.gif bardzo wybrakowane te tablice np nie łamie hasha zbudowanego w oryginale z ciagu cyfr
MajareQ
jednym słowem jeszcze daleko brakuje do łamacza hashów z prawdziwego zdarzenia...
pinochet
Witajcie ... to mój pierwszy post na tym forum więc tym bardziej witam ;-)
Chciałbym dorzucić swoje trzy grosze ;] (podsumowując powyższą dyskusję)
1. (pierwszy grosz) n-hashowanie nie ma żadnego znaczenia przy ataku bf - zdalnym
2. (drugi grosz) - Jeżeli hacker wszedł w posiadanie naszej bazy danych jednak nie ma dostępu do źrodeł PHP w takiej sytuacji n-hashowanie daje hackerowi dodatkowy problem - odgadnięcie algorytmu hashowania - co powoduje że hasła są nie do złamania biggrin.gif oczywiście mądry hacker od razu sprawdzi 1-hashowanie i 2-hashowanie dlatego ja również polecam dodawanie do hasła tajnego ciągu i np loginu.
3. (trzeci grosz) - hacker zna nasz algorytm i zna hashe - w tej sytuacji wielokrotne hashowanie również zwiększa bezpieczeństwo haseł(jawnych) ... Dlaczego? Dlatego że obliczenie sumy trwa ... i od czasu tego generowania zalezy ile możliwości zostanie sprawdzonych w ciągu sekundy. sprawdzenie wszystkich hashy 4 literowych przy algorytmie md5(md5($ciag)) bedzie trwało dwa razy dłużej niż md5($ciąg) - możliwe - nie analizowałem dokładnie funkcji liczącej hasha - ze czas potrzebny na md5(md5($ciag)) będize kilkakrotnie dłuższy niż md5($ciag) bo $ciąg ma 4 znaki a md5($ciąg) 32 znaki. między innymi na tym polega bezpieczeństwo WPA2 ( WiFi) tam hasło z tego co pamiętam jest hashowane 16 razy. W jakiś zawodach hacker który stworzył sobie Rainbow Tables wygrał bo przy kolejnych włamach tylko sprawdzał hasła - bez ich generowania ( tam hash liczony jest lokalnie )

Jeśli chodzi o kolizje to rzeczywiści md5 jest na nie podatne - jednak z logicznego punktu widzenia jeżeli md5 hash jest 32 znakowy to kolizje będą pojawiać się dopiero przy kodowaniu ciągów dłuższych niż 32 znaki ... dlatego wielokrotne hashowanie ciągów 32 znakowych nie powinno powodować kolizji choć pewnie znaczenie ma tutaj także zakres znaków
Zyx
1. Dwukrotne wydłużenie czasu potrzebnego do złamania to żadne wydłużenie. Podzielę zbiór haseł na dwa, puszczę proces równolegle na dwóch komputerach i po sprawie.
2. Jedyne, co może zrobić podwójne haszowanie, to zwiększyć podatność funkcji na kolizje. Załóżmy, że mamy takie wiadomości A, B, że H( A ) = H( B ). Wiemy, że istnieją takie z zasady szufladkowej (skończona ilość haszów, nieskończona ilość tekstów). Możemy też znaleźć dwie inne wiadomości C, D takie, że H( C ) = H( D ). Przy pojedynczym haszowaniu mamy dwie różne kolizje: algorytm, który wygeneruje A, podczas gdy hasz jest H©, będzie szukać dalej. Przypuśćmy teraz, że haszujemy oba hasze i okazuje się, że one ze sobą kolidują: H(H( A )) = H(H( C )). Nie można zakładać niemożliwości takiej sytuacji, bo niby czemu? Stworzę sobie z sha1 poprawną funkcję haszującą, która dla każdego 40-znakowego ciągu daje 40 liter "a" w wyniku i wtedy wszystkie hasze będą ze sobą kolidować smile.gif. W każdym razie otrzymujemy wtedy równość: H(H( A )) = H(H( B )) = H(H( C )) = H(H( D )), tak więc gdy wygenerujemy hasło "A", ono zostanie zaakceptowane nawet, jeśli oryginał brzmi "C" i jeśli po pojedynczym zahaszowaniu takie coś by nie weszło. Nie zachodzi za to sytuacja w drugą stronę, tj. jeśli A i B kolidują, to po podwójnym zahaszowaniu dalej będą kolidować. Wniosek: wielokrotne haszowanie pogasza sprawę tym bardziej, im więcej razy złożymy naszą funkcję z samą sobą.
pinochet
Cytat(Zyx @ 14.10.2008, 08:20:42 ) *
1. Dwukrotne wydłużenie czasu potrzebnego do złamania to żadne wydłużenie. Podzielę zbiór haseł na dwa, puszczę proces równolegle na dwóch komputerach i po sprawie.
Idąc dalej tym tokiem rozumowania można stwierdzić że hashowanie wogole nie jest potrzebne ... zawsze istnieje pewna skończona liczba komputerow przy ktorej haslo da sie złamać. Co do podatnosci na kolizje zgodze sie ze moze sie zwiekszyc przy podwojnym hashowaniu - ale jest to tylko hipoteza. Jak pisałem nie analizowałem algorytmu md5 i nie wiem czy prawdopodobieństwo kolizji jest większe dla ciągów o tej samej długości czy o różnej.
Cytat(Zyx @ 14.10.2008, 08:20:42 ) *
Stworzę sobie z sha1 poprawną funkcję haszującą, która dla każdego 40-znakowego ciągu daje 40 liter "a" w wyniku i wtedy wszystkie hasze będą ze sobą kolidować
stworzę sobie poprawną funkcję hashującą która dla kazdego 40 literowego ciągu da inny 40 literowy ciąg ...
Zyx
Kurde, jak do czegoś został przedstawiony poprawny dowód, to nie może być to hipotezą. n-krotne haszowanie co najwyżej pozostawia odporność na kolizje na niezmienionym poziomie lub ją pogarsza i jest to udowodniony fakt dla każdej istniejącej funkcji haszującej, jaką sobie wymyślisz. Natomiast od rodzaju samej funkcji zależy jedynie, jak bardzo sprawa może się pogorszyć, w szczególnym przypadku - może pozostać bez zmian.

A pozostaje bez zmian tylko i wyłącznie wtedy, gdy H(k) dająca n-znakowy ciąg jest bijekcją dla każdego k o długości dokładnie n. Lecz jeśli jest bijekcją, to wtedy istnieje jednoznaczna funkcja odwrotna. I aby Cię zmartwić, najłatwiej dowieść bijekcji właśnie znajdując funkcję odwrotną. O MD5 i SHA1 nic takiego nie wiemy i teraz są dwa wyjścia:

1. Albo przyjmujemy, że generują one kolizje dla 32- lub 40-znakowych ciągów, tym samym pogarszając odporność na kolizje.
2. Albo przyjmujemy, że nie są i wtedy cała nasza robota na nic, bo jak ktoś znajdzie funkcję odwrotną, co będzie tylko kwestią czasu, to z naszego podwójnego hasza bez trudu wyliczy sobie na początku pracy pojedynczy i cały Twój pomysł ze zwiększaniem ilości czasu/komputerów możesz wyrzucić na śmietnik.

Tak więc najlepiej do naszego hasła dokleić losową i jawną sól, by zabezpieczyć się przed tęczowymi tablicami i zahaszować RAZ. Drugi hasz i więcej albo ułatwi zadanie łamaczowi, albo w najlepszym przypadku nie da nam NIC.

PS. Pomysł ze zwiększaniem ilości zasobów byłby bardziej sensowny, gdyby pogarszał rząd złożoności, np. n-krotny hasz powodowałby konieczność użycia n^2 komputerów, by zakończyć obliczenia w tym samym czasie.

PS2. Spróbuję znaleźć kogoś, kto się zajmuje kryptografią i kryptoanalizą przynajmniej półzawodowo i skonsultować z nim cały problem.
pinochet
Dobra muszę przyznać Ci rację ;]
Wielokrone hashowanie zwiększa podatność na kolizję - chyba że funkcja hashująca jest odwzorowaniem jednoznaczym ( nie lubie MD ;P ), a wiadomo że nie jest.
W sprawie zwiększenia czasu łamania hasha - owszem dobrze by było znac sposób na nie liniowe zwiększanie czasu ale chyba raczej takiego nie ma ... zakładając że hacker nie dysponuje botnetem z 10^6 komputerów zwiększenie czasu potrzebnego nawet dwukrotnie - zawsze będzie utrudnieniem. Chyba wszyscy wiemy że w atakach typu bruteforce czas gra najistotniejszą rolę.

Jeszcze nasunęło mi się takie pytanie: Czy podatność na kolizję zmniejsza bezpieczeństwo haseł jawnych questionmark.gif Hyba nie bo znając hasha: f:X-> {a}, aby poznać hasło jawne musimy poznać cały zbiór X (przynajmniej teoretycznie).
Michu
Nie rozumiem po co cały ten szum. Moje zdanie jest takie:

Słabość MD5 polega na tym że wszyscy znają ten algorytm, dlatego teorytycznie da się go 'odhashować'.

Jeśli więc utrudnić procedurę hashowania, np. dodając nowe znaki, zamieniając kolejność znaków, mieszając hashe, odcinamy hakerowi możliwość złamania szyfru bo nie wie on jak go złamać.
mike
Cytat(Michu @ 16.10.2008, 19:34:21 ) *
Słabość MD5 polega na tym że wszyscy znają ten algorytm, dlatego teorytycznie da się go 'odhashować'.
Tyle wałkowania i na darmo.
W jednym zdaniu poinformowałeś nas, że nie znasz md5. Bo jego nie da się "odhaszować". To nie jest algorytm dwustronny exclamation.gif exclamation.gif
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-2024 Invision Power Services, Inc.