Forum Webmastera, HTML, CSS, PHP, MySQL, Hosting, Domeny - Forum dla Webmasterów
PHP+MySQL kodowanie hasła - sh1/md5 - Wersja do druku

+- Forum Webmastera, HTML, CSS, PHP, MySQL, Hosting, Domeny - Forum dla Webmasterów (https://www.webmastertalk.pl)
+-- Dział: Technologie internetowe - tworzenie stron WWW (https://www.webmastertalk.pl/forum-technologie-internetowe-tworzenie-stron-www)
+--- Dział: Programowanie, Bazy danych (https://www.webmastertalk.pl/forum-programowanie-bazy-danych)
+--- Wątek: PHP+MySQL kodowanie hasła - sh1/md5 (/thread-php-mysql-kodowanie-hasla-sh1-md5)

Strony: 1 2


PHP+MySQL kodowanie hasła - sh1/md5 - toma5z - 27-07-2010

Witajcie,
utworzyłem skrypt logowania do serwisu,
konta użytkowników są przechowywane w bazie, w każdej chwili można utworzyć nowego użytkownika.

Dla bezpieczeństwa hasła koduje algorytmami sh1 i md5.
Wygląda to tak:

rejestracja użytkownika:
Kod:
$login = $_POST['password'];
$pass = sha1(md5($_POST['password']));
(na razie nie bawię się w walidacje danych, potem to zrobię)

Do SQLa wpisuje poprzez
Kod:
$pytanie = "INSERT INTO uzytkownicy (user,pass) VALUES ('$login', '$pass')";

Jak sobie zobaczę, z poziomu konsoli tabelkę użytkownicy
(select * from uzytkownicy; )
to widać ładnie zakodowane hasło tymi algorytmami.
- jest ok !

Z tym że już nie tak pięknie jak chcemy się zalogować.
Kod:
            if($login !="" and $pass !="")
                {
                    //jesli nie puste to hashujemy je
                    $pass = sha1(md5($pass));
                    
                    //pobieramy idu usera gdzie = jest $login i $pass
                    $pytanie = "SELECT idu FROM uzytkownicy WHERE user='$login'and pass='$pass'";
                    //przypisujemy wynik zmiennej $temp
                    $temp = mysql_query($pytanie) or die ("Error");
                    //przypisujemy ilosc zwroconych wynikow
                    $ile = mysql_num_rows($temp);
                    //tablica zwracana idu usera
                    $temp = mysql_fetch_array($temp);
                    
                    $id = $temp['idu'];
                        //sprawdzamy czy cos pobralismy
                        if($ile==1)
                            {
                                $_SESSION['user']=$id;
                                $_SESSION['login']=$login;    
                                echo('Zostales zalogowany!');
                            }
                        else
                            {
                                echo('<center>Bledny login lub haslo');
                                echo "<br><input type='button' value='powrót' 'onclick='history.back();'></center>";
                            }
                }
            else
            {
                echo "<center>pola nie mogą być puste !";
                echo "<br><input type='button' value='powrót' 'onclick='history.back();'></center>";
            }

i zawsze wywala mi
Kod:
('<center>Bledny login lub haslo');

Jeżeli usunę algorytmy sha1 i md5 - można bez problemu się zalogować !

Co mam źle ?


RE: PHP+MySQL kodowanie hasła - sh1/md5 - Pedro84 - 27-07-2010

Hashowanie != kodowanie. To po pierwsze.

Po drugie, jaki jest sens hashowania hasła za pomocą sha1(md5($string))? Żaden.

Po trzecie, do sprawdzania czy pola są puste używa się empty().

Po czwarte, wiesz co to SQL Incjection, na przykład? Na razie to ten kod jest niewiele warty.

Dodaj po tym fragmencie $pass = sha1(md5($pass));
Kod:
die(sha1(md5($pass)));
i zobacz czy masz taki rekord w bazie.


RE: PHP+MySQL kodowanie hasła - sh1/md5 - toma5z - 28-07-2010

(27-07-2010, 22:03)Pedro84 napisał(a): Hashowanie != kodowanie. To po pierwsze.
tak masz racje ! - chciałem to pojęcie "uogólnić", nie sądziłem że się doczepisz do tego...
(27-07-2010, 22:03)Pedro84 napisał(a): Po drugie, jaki jest sens hashowania hasła za pomocą sha1(md5($string))? Żaden.
Żaden... ? bo koleś, który włamie się mi do bazy zacznie przeglądać tabele, zwróci wyniki hasła sobie je odkoduje z powrotem... i bedzie miał dostep do serwisu...
(27-07-2010, 22:03)Pedro84 napisał(a): Po trzecie, do sprawdzania czy pola są puste używa się empty().
Tak, ale ja użyłem takiego sposobu, mogłem jeszcze użyć - NULL
(27-07-2010, 22:03)Pedro84 napisał(a): Po czwarte, wiesz co to SQL Incjection, na przykład? Na razie to ten kod jest niewiele warty.
Tak wiem co to SQL injection - 4 lata temu np. fajnie sie rozwalało księge gości... logowało się na forum bez znania hasła do admina... itp itd...
Jeżeli miałbym robić profesjonalny serwis to na pewno użył bym dodatkowo javyscript - większe możliwości w walidacji wprowadzanych danych...
ale ja chce to mieć w takim kodzie jak jest ww.
(27-07-2010, 22:03)Pedro84 napisał(a): Dodaj po tym fragmencie $pass = sha1(md5($pass));
Kod:
die(sha1(md5($pass)));
i zobacz czy masz taki rekord w bazie.
Ok, mam coś takiego:
311cfad97a2d1df257487a40b139253652465b59

Jeżeli chodzi o pole w mysql, które przechowuje password jest one typu varchar o pojemności 100...

W takim razie jak proponujesz zahaszować, lub zakodować hasło w encji ?


RE: PHP+MySQL kodowanie hasła - sh1/md5 - Pedro84 - 28-07-2010

Smile

Javascript zwiększa możliwość walidacji danych? No bez żartów. Walidacja po stronie klienta, to nic, zero, null.

Jak bym proponował? Poczytaj o crypt().

BTW... Warto też zastosować trim() do przesyłanych danych.


RE: PHP+MySQL kodowanie hasła - sh1/md5 - toma5z - 28-07-2010

(28-07-2010, 16:12)Pedro84 napisał(a): Smile

Javascript zwiększa możliwość walidacji danych? No bez żartów. Walidacja po stronie klienta, to nic, zero, null.

Jak bym proponował? Poczytaj o crypt().

BTW... Warto też zastosować trim() do przesyłanych danych.

W javie możemy sobie fajnie "ochronić" skrypt, można to wykorzystać do mostkowania z php... dzięki czemu atakujący serwis będzie miał problemy z wstrzyknięciem złośliwego kodu. - fajna sprawa, poczytaj o tym, polecam implementacje mysql z javą.
Zresztą nie o tym temat ... ;p

Dzięki, zastosuje crypt();
dodatkowo oprócz trim() stosuje stripslashes() i mysql_real_escape_string()

...ale to na samym końcu dopisze, by sobie teraz nie "zaczerniać" kodu

Ja na dal nie rozumiem, dlaczego nie łyka mi sh1 i md5...

---edit---
Przepraszam pomyliłem się, nie chodziło mi o javescript a o javę.
nie wielka różnica w nazwie, a wielka w kodowaniu ;]

Tak javascript jest wykonywana po stronie klienta, nie tak jak php - po stronie servera.


RE: PHP+MySQL kodowanie hasła - sh1/md5 - Pedro84 - 28-07-2010

Poczytaj? Hehe, a wiesz ile to wyłączyć js? Sekunda. I co wtedy zostaje z tej walidacji? Nic, zero, null Wink Jednym słowem: javascript NIE zabezpiecza Cię przed NICZYM. Absolutnie.

Zasada jest prosta, najpierw wszystko robisz po stronie serwera (nie tylko bezpieczeństwo, ale i dostępność wzrasta), a dopiero potem ewentualne zabawy po stronie klienta.

Co do meritum... Wyświetl sobie zapytanie (resztę kodu zakomentuj). Potem sprawdź te zapytanie w phpmyadmin bądź workbench'u i będziesz wiedział.

PS. Wszystkie funkcje typu trip(), etc. powinieneś pisać na samym początku. Łatwo przeoczyć. No...chyba, że robisz profesjonalny audyt, to wtedy wyłapiesz.


RE: PHP+MySQL kodowanie hasła - sh1/md5 - toma5z - 28-07-2010

(28-07-2010, 17:23)Pedro84 napisał(a): Poczytaj? Hehe, a wiesz ile to wyłączyć js? Sekunda. I co wtedy zostaje z tej walidacji? Nic, zero, null Wink Jednym słowem: javascript NIE zabezpiecza Cię przed NICZYM. Absolutnie.

Zasada jest prosta, najpierw wszystko robisz po stronie serwera (nie tylko bezpieczeństwo, ale i dostępność wzrasta), a dopiero potem ewentualne zabawy po stronie klienta.

Co do meritum... Wyświetl sobie zapytanie (resztę kodu zakomentuj). Potem sprawdź te zapytanie w phpmyadmin bądź workbench'u i będziesz wiedział.

PS. Wszystkie funkcje typu trip(), etc. powinieneś pisać na samym początku. Łatwo przeoczyć. No...chyba, że robisz profesjonalny audyt, to wtedy wyłapiesz.

Soryy nie chodziło mi o js a o jave, post wyżej masz sprostowanie Rolleyes
Ok, zaraz ogarnę sprawę.

PS. Nie mam na razie aż tak wiele kodu więc się łapię co gdzie i jak...
Najwyżej zacznę się bawić w betatestera heh i może wtedy to wyłapie Big Grin

---edit---
zastosowałem crypt()
wyświetliłem wyniki w bazie mysql wyglądają tak:

dla uzytkownika admin password jest 123
| idu | user | pass |
| 1 | admin| $1$sp/.Fl2.$mCxeSfYA.CiPXB2ftfB9d1 |


a gdy wyswielte sobie w php echo dla konta admin, password za każdym razem jest inne:
$1$YY/.Bm3.$nSYXYU0/KAQMpFH2X0Tps.

przy zakładaniu konta wprowadzane nowe hasło przez nowego użytkownika jest hashowane crypt()
i przy logowaniu tak samo, jak użytkownik podaje hasło jest hashowane w crypt(), wiec nie rozumie ze te same literki są wyświetlane w iny sposób...

---edit2---
nie rozumie funkcji crypt za każdym te samo haslo koduje w "trybie random" - za każdym innym razem inny hash przy tych samych znakach wprowadzanych.
w takim razie jak masie to do wprowadzanie hasla...
jak zakoduje to tylko w algorytmie md5 jest ok i wszystko działa...


RE: PHP+MySQL kodowanie hasła - sh1/md5 - skarabe.pl - 29-07-2010

Jeżeli cały ten kod jest "ciurkiem" to problem jest oczywisty - najpierw robisz:
Kod PHP:
$pass sha1(md5($_POST['password'])); 

A potem:

Kod PHP:
$pass sha1(md5($pass)); 

W efekcie otrzymujesz podwójnie "zamieszane" hasło i nic dziwnego, że się różni od tego, co zostało dodane do bazy.

@Pedro
Cytat:Po drugie, jaki jest sens hashowania hasła za pomocą sha1(md5($string))? Żaden.

Otóż nie - ma sens. Do złamania tak zbudowanego hasła musisz stworzyć specjalnie w tym celu utworzoną tablicę tęczową (z dokładnie takim zadeklarowanym algorytmem). Złamać krótkie i proste hasło zakodowane TYLKO w sha1 lub TYLKO w md5 jest bardzo łatwo. Także - zysk na bezpieczeństwie jest, z tym, że chyba nie do końca [/quote]świadomy Smile


RE: PHP+MySQL kodowanie hasła - sh1/md5 - Pedro84 - 29-07-2010

@skarabe.pl: A widzisz, ja ten fragment w kodzie przeoczyłem.

Po pierwsze, przeczytaj czym tęczowe tablice i do czego służą, bo wydaje mi się, że lekko się pomyliłeś.
Po drugie, złamać krótkie i proste hasło zahashowane nawet sha1(md5($string)) też nie jest trudno. Są bazy z miliardami rekordów rekordów (samo md5(), sha1(), pomixowane). Pomińmy już tutaj metodę b-f, bo w takim przypadku żadne sztuczki kryptograficzne nie przyniosą efektu.

Reasumując:
1. Samo hashowanie nic nie da (nie ważne czy zjedziesz je 100 razy)
2. Używać powinno się crypt http://php.net/manual/en/function.crypt.php
3. Jeśli już ktoś używa md5() bądź sha1 to koniecznie musi użyć sól (od jej stopnia skomplikowania zależy bezpieczeństwo hashowanego hasła)

BTW. Polecam Ci książkę pt. Applied Cryptography Bruce'a Schneier'a (niestety, nie wiem czy wyadana w naszym języku), a także bloga Bruce'a.


RE: PHP+MySQL kodowanie hasła - sh1/md5 - skarabe.pl - 29-07-2010

(29-07-2010, 16:40)Pedro84 napisał(a): Po pierwsze, przeczytaj czym tęczowe tablice i do czego służą, bo wydaje mi się, że lekko się pomyliłeś.
Po drugie, złamać krótkie i proste hasło zahashowane nawet sha1(md5($string)) też nie jest trudno. Są bazy z miliardami rekordów rekordów (samo md5(), sha1(), pomixowane). Pomińmy już tutaj metodę b-f, bo w takim przypadku żadne sztuczki kryptograficzne nie przyniosą efektu.

Reasumując:
1. Samo hashowanie nic nie da (nie ważne czy zjedziesz je 100 razy)
2. Używać powinno się crypt http://php.net/manual/en/function.crypt.php
3. Jeśli już ktoś używa md5() bądź sha1 to koniecznie musi użyć sól (od jej stopnia skomplikowania zależy bezpieczeństwo hashowanego hasła)

BTW. Polecam Ci książkę pt. Applied Cryptography Bruce'a Schneier'a (niestety, nie wiem czy wyadana w naszym języku), a także bloga Bruce'a.

Spoko spoko - nie napisałem, że skrypt będzie nie do złamania, tylko że będzie mimo wszystko minimalnie bardziej bezpieczny (więc Twoje zdanie "jaki to ma sens. Żaden." z tego punktu widzenia jest błędne), bo tęczowe tablice są chyba mimo wszystko nieco bardziej dostępne (w sensie gotowców, bo kto co sobie stworzy to już jego sprawa) w wersji gołej md5 i gołej sha1, a nie zmiksowanej. Przynajmniej ostatnio jak zaglądałem do tego zagadnienia tak było. Oczywiście powinien użyć salta i kilku innych technik, ale dopóki stawia swoje pierwsze kroki, to chyba można nieco odpuścić w tym względzie? Na solenie przyjdzie czas - po pierwszym włamaniu :D

A tęczowa tablica jest kompromisem między rozmiarem tablicy zawierającej wszystkie powiązania hash -> plain, a czasem pracy procesora wymaganej do metody wygenerowania danego hash-a za pomocą brute-force. To tak w skrócie i bez naukowego nalotu - coś się nie zgadza?