Ocena wątku:
- 0 głosów - średnia: 0
- 1
- 2
- 3
- 4
- 5
PHP+MySQL kodowanie hasła - sh1/md5
|
Liczba postów: 62
Liczba wątków: 22
Dołączył: 26-07-2010
Reputacja:
0
27-07-2010, 19:11
(Ten post był ostatnio modyfikowany: 27-07-2010, 19:13 przez toma5z.)
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 ?
Liczba postów: 2,587
Liczba wątków: 2
Dołączył: 03-04-2010
Reputacja:
58
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.
Liczba postów: 62
Liczba wątków: 22
Dołączył: 26-07-2010
Reputacja:
0
(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 ?
Liczba postów: 2,587
Liczba wątków: 2
Dołączył: 03-04-2010
Reputacja:
58
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.
Liczba postów: 62
Liczba wątków: 22
Dołączył: 26-07-2010
Reputacja:
0
28-07-2010, 17:15
(Ten post był ostatnio modyfikowany: 28-07-2010, 17:23 przez toma5z.)
(28-07-2010, 16:12)Pedro84 napisał(a): 
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.
Liczba postów: 2,587
Liczba wątków: 2
Dołączył: 03-04-2010
Reputacja:
58
Poczytaj? Hehe, a wiesz ile to wyłączyć js? Sekunda. I co wtedy zostaje z tej walidacji? Nic, zero, null  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.
Liczba postów: 62
Liczba wątków: 22
Dołączył: 26-07-2010
Reputacja:
0
28-07-2010, 17:31
(Ten post był ostatnio modyfikowany: 28-07-2010, 18:10 przez toma5z.)
(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 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 
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
---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...
Liczba postów: 30
Liczba wątków: 0
Dołączył: 29-07-2010
Reputacja:
0
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
Liczba postów: 2,587
Liczba wątków: 2
Dołączył: 03-04-2010
Reputacja:
58
@skarabe.pl: A widzisz, ja ten fragment w kodzie przeoczyłem.
Po pierwsze, przeczytaj czym są 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.
Liczba postów: 30
Liczba wątków: 0
Dołączył: 29-07-2010
Reputacja:
0
(29-07-2010, 16:40)Pedro84 napisał(a): Po pierwsze, przeczytaj czym są 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?
|
Podobne wątki… |
Wątek: |
Autor |
Odpowiedzi: |
Wyświetleń: |
Ostatni post |
|
Jak sprawdzić czy adres www znajduje sie w bazie mysql? |
jarekcda |
8 |
9,035 |
13-05-2017, 01:02
Ostatni post: miketodson255
|
|
Optymalizacja MySQL-a |
tomek_00 |
1 |
3,929 |
01-09-2013, 13:31
Ostatni post: hieroshima
|
|
[MySQL] Struktura bazy dla słownika |
msx83 |
2 |
3,926 |
24-08-2013, 16:26
Ostatni post: msx83
|
|
Komunikacja PHP z MySQL na serwerze |
pawstrze |
5 |
6,453 |
16-07-2013, 15:58
Ostatni post: Engine
|
|
[MySQL] wyszukiwarka problem |
darlowiak |
3 |
3,560 |
13-06-2013, 12:58
Ostatni post: darlowiak
|
Użytkownicy przeglądający ten wątek: 1 gości
|
|
Sponsorzy i przyjaciele
|
|
|