Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php]md5 i szyfrowanie haseł
Forum PHP.pl > Forum > Przedszkole
habbakuk
Witam!
Zaczynam małą zabawę z php i mysql i chciałbym poprosić Was o pomoc. Stworzyłem sobię bazę danych, a w niej tabelkę users - 2 pola: name i pass (oba varchary). Napisałem również prosty formularz w html, gdzie podajemy nazwę usera i hasło:
  1. <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2">
  2. <title>Logowanie</title>
  3. </head>
  4.  
  5. <h2>Proszę podać nazwę użytkownika i hasło:</h2>
  6. <form name = "formularz"
  7. action = "http://localhost/sklep/nh.php"
  8. method = "POST">
  9.  
  10. <TABLE border="1"><TR>
  11. <TD bordercolor="#FFFFFF">Użytkownik:</TD>
  12. <TD bordercolor="#FFFFFF"><INPUT TYPE = "text" NAME = "user"></TD>
  13. </TR>
  14.  
  15. <TR>
  16. <TD bordercolor="#FFFFFF">Hasło:</TD>
  17. <TD bordercolor="#FFFFFF"><INPUT TYPE = "password" NAME = "haslo"></TD>
  18. </TR>
  19.  
  20. <TR>
  21. <TD colspan="2" align="center" bordercolor="#FFFFFF">
  22. <INPUT TYPE = "submit" VALUE = "Zaloguj">
  23. </TD>
  24. </TR>
  25. </BODY>
  26. </HTML>


Do tego dochodzi plik php w którym sprawdzam czy dany user i hasło znajdują się w bazie:

  1. <?php
  2. @$pass = $_POST["haslo"];
  3. @$user = $_POST["user"];
  4.  
  5. function checkPass($pass, $user){
  6.  $link = mysql_connect("localhost", "root", "supertajnehaslo);
  7.  $flag = mysql_select_db("nh");
  8.  if(!$link || !$flag){
  9. echo("Error!");
  10. return false;
  11. }
  12.  
  13. $query = "SELECT PASS FROM USERS WHERE NAME = '".$user."'";
  14. $result = mysql_query($query);
  15.  
  16. if(!$result){
  17.  echo("Problem z baza danych! Zapytanie zostalo odrzucone!");
  18.  mysql_close($link);
  19.  return false;
  20.  }
  21.  
  22.  
  23.  $row = mysql_fetch_row($result);
  24.  if(!$row){
  25. mysql_close($link);
  26. return false;
  27. }
  28.  
  29.  if($row[0] != $pass){
  30. mysql_close($link);
  31. return false;
  32. }
  33.  
  34.  else {mysql_close($link); return true;}
  35.  }
  36.  
  37. if(!checkPass($pass, $user)){
  38.  echo("<HTML><BODY><CENTER>");
  39.  echo("<H2>Niepoprawne dane!</H2>");
  40.  echo("</CENTER></BODY></HTML>");
  41.  }
  42.  
  43.  else{
  44. include('index1.html');
  45. }
  46. ?>



Teraz chciałbym jakoś najpierw zaszyfrować dane w bazie a następnie użyć jakiejś funkcji deszyfrującej już na poziomie php aby odczytać hasło z bazy.
Proszę o pomoc, pozdrawiam.
shpyo
1. MD5 nie da się rozszyfrować (ale krążą plotki, że już się to udało)
2. jeżeli chcesz "ukryć" hasło to może zrobić tak: md5($zmienna_z_haslem) wtedy spradzanie użytkownika wygląda tak:
  1. <?php
  2.  
  3. $mysqlQuery = "SELECT cos FROM tabela_userów WHERE login='".$zmienna_z_loginem."' AND haslo='".md5($zmienna_z_haslem)."'";
  4.  
  5. ?>

Dodatkowo musisz pamiętać o zabezpieczeniach.
pozdr,
habbakuk
Co rozumiesz przez 'pamiętanie o zabezpieczeniach'? Co dokładnie spowoduje ukrycie hasła? Czy zostanie ono w jakiś sposób zaszyfrowane w samej bazie danych, tak by nie występował w niej czysty ciąg typu varchar?
Pozdrawiam.
P.S. Dodam iż użyłem wspomnianego md5:
Zamiast wcześniej napisanego:
  1. <?php
  2. $query = "SELECT PASS FROM USERS WHERE NAME = '".$user."'";
  3. ?>

Mam teraz:
  1. <?php
  2. $query = "SELECT PASS FROM USERS WHERE name = '".$user."' AND pass = '".md5($pass)."'"; 
  3. ?>

Jednakże wyskakuje błąd opisany w if:
  1. <?php
  2. if(!checkPass($pass, $user)){
  3.  echo("<HTML><BODY><CENTER>");
  4.  echo("<H2>Niepoprawne dane!</H2>");
  5.  echo("</CENTER></BODY></HTML>");
  6.  }
  7. ?>

Czy do md5 biblioteka php_mcrypt.dll powinna być włączona w php.ini (jakby co - jest włączona).
ActivePlayer
jaka dales max dlugosc varchara w bazie ?
shpyo
1. długość pola z hasłem powinna mieć 32 znaki (ze względu na md5)
2. pisząc 'pamiętanie o zabezpieczeniach' miałem na myśli danie jeszcze addslashes" title="Zobacz w manualu php" target="_manual aby jakiś hAx0r nie zalogowal się na admina smile.gif

W funkcji spradzającej znalazłem błąd:
  1. <?php
  2.  
  3. function checkPass($pass, $user){
  4.  $link = mysql_connect("localhost", "root", "supertajnehaslo");
  5.  $flag = mysql_select_db("nh");
  6.  if(!$link || !$flag){
  7. echo("Error!");
  8. return false;
  9. }
  10.  
  11. $query = "SELECT PASS FROM USERS WHERE name = '".addslashes($user)."' AND pass = '".md5(addslashes($pass))."'";
  12. $result = mysql_query($query);
  13.  
  14. if(!$result){
  15.  echo("Problem z baza danych! Zapytanie zostalo odrzucone!");
  16.  mysql_close($link);
  17.  return false;
  18.  }
  19.  
  20.  
  21.  $row = mysql_fetch_row($result);
  22.  if(!$row){
  23. mysql_close($link);
  24. return false;
  25. }
  26. }
  27. ?>

Zobacz teraz, podaj też dokładny błąd jaki Ci pokazuje - nie jesteśmy wróżkami tongue.gif
habbakuk
Zerknę w domu jak wygląda wynik, dzięki winksmiley.jpg Mówiąc o errorze nie miałem na myśli żadnego błędu php/mysql, jednakże tylko to iż tak jakby hasło zostało źle odczytane z bazy. Rozumiem, iż w bazie cały czas mamy niezaszyfrowane hasło w varcharze(32) a następnie dopiero z poziomu php wyciągamy je szyfrując. Co w takim wypadku będzie, jeśli ktoś uzyska dostęp do samej bazy danych - tam będą trzymane czyste niezaszyfrowane hasła, czy tak?
shpyo
proces rejestracji wygląda tak:
1. ktoś podaje dane (login hasło itp...)
2. php zapisuje te dane, ale hasło już jest kodowane w md5 i zapisywane do bazy (czyli w postaci ciągu 32 znaków), do bazy!

Logowanie wygląda tak:
1. ktos podaje login i hasło
2. php sprawdza to robiąc zapytanie do bazy (patrz na górę). Hasło podane przez logującego się musi być zakodowane w md5 (aby porównać je czy jest taki rekord z loginem i hasłem w bazie).

Mam nadzieję, że zrozumiałeś ideę logowanie z kodowaniem hasła tongue.gif
habbakuk
Zrozumiałem winksmiley.jpg Jednakże u mnie nie ma póki co procesu rejestracji! Są na sztywno wpisane dane w bazie spod linii poleceń mysql. Czyli rozumiem, że najpierw poszukać jakiegoś skryptu, bądź samemu go napisać do rejestracji - wpisu do samej bazy a następnie zająć się logowaniem czyli odczytem.
Pozdrawiam.
escaflowne
W procesie rejestracji, do bazy danych wrzucasz hasz hasła, czyli hasło zakodowane w md5; możesz je zakodować albo przez PHPowe md5():
  1. <?php
  2. $zapytanie = "INSERT INTO users VALUES ('user01', ". md5($haslo) .")";
  3. $zapytanie_wykonaj = mysql_query($zapytanie);
  4. ?>


albo przez MySQLowe MD5:
  1. <?php
  2. $zapytanie = "INSERT INTO users VALUES ('user01', MD5($haslo))";
  3. $zapytanie_wykonaj = mysql_query($zapytanie);
  4. ?>


Tak więc, do bazy danych trafia hasz hasła (nie do odkodowania). A kiedy ktoś się loguje, proces przebiega następująco: tworzony jest hasz podanego przez logującego się hasła i tenże hasz, porównywany jest z haszem trzymanym w bazie danych:
  1. <?php
  2. $zapytanie = "SELECT id FROM users WHERE haslo = '". md5($haslo) ."'";
  3. $zapytanie_wykonaj = mysql_query($zapytanie);
  4. if(mysql_num_rows($zapytanie_wykonaj)===1){
  5.  echo 'zalogowany';
  6. }
  7. else{
  8.  echo 'zła nazwa użytkownika i/lub hasło';
  9. }
  10. ?>


Pamiętaj o tym, że z jednego ciągu znaków, choćbyś niewiadomo ile razy traktował go md5(), zawsze otrzymasz taki sam hasz. Ale zmień choćby jeden znak w tym ciągu - otrzymasz zupełnie inny hasz od pierwotnego.

Dobrym pomysłem jest dodawanie soli do hasza, dzięki temu, nawet jeżeli ktoś wykradnie ci z bazy danych hasz hasła, to nie będzie mógł skorzystać sobie z gotowej tablicy haszy (można powiedzieć: słownik ciągów znaków i ich haszy), będzie musiał sam taką tablicę wygenerować i w niej szukać wykradzionego hasza, a to mu chwilę zajmie. A jeżeli wykranie więcej haszy, to dla każdego będzie musiał tworzyć oddzielną tablicę. Ale to już temat na osobną dyskusję... smile.gif
habbakuk
I mam mały problem - za każdym razem gdy uruchamiam:
  1. <?php
  2. $link = mysql_connect("localhost", "root", "superTajneHaslo");
  3. $flag = mysql_select_db("nh");
  4.  
  5. $haslo = 'superHaslo';
  6. $zapytanie = "INSERT INTO users VALUES ('habbakuk', ".md5($haslo).")";
  7. $zapytanie_wykonaj = mysql_query($zapytanie);
  8.  
  9. if(!$zapytanie_wykonaj){
  10.  echo("Problem z baza danych! Zapytanie zostalo odrzucone!");
  11.  mysql_close($link);
  12.  return false;
  13.  }
  14. else {mysql_close($link); return true;} 
  15.  
  16. ?>

Pojawia mi się komunikat: Problem z baza danych! Zapytanie zostalo odrzucone!
ghostrider
zapytanie zostało odrzucone gdyż brakuje " ' " apostronfów,
  1. <?php
  2.  
  3. $zapytanie = "INSERT INTO users VALUES ('habbakuk', '".md5($haslo)."')";
  4.  
  5. ?>
habbakuk
  1. <?php
  2. $link = mysql_connect("localhost", "root", "superTajneHaslo");
  3. $flag = mysql_select_db("nh");
  4.  
  5. $haslo = 'superHaslo';
  6. $zapytanie = "INSERT INTO users VALUES ('habbakuk', '".md5($haslo)."')";
  7. $zapytanie_wykonaj = mysql_query($zapytanie);
  8.  
  9. if(!$zapytanie_wykonaj){
  10.  echo("Problem z baza danych! Zapytanie zostalo odrzucone!");
  11.  mysql_close($link);
  12.  return false;
  13.  }
  14. else {mysql_close($link); return true;} 
  15.  
  16. ?>

Cały czas to samo -> ten sam błąd.
ghostrider
  1. <?php
  2. echo "Problem z baza danych! Zapytanie zostalo odrzucone! Mysql SAID:" . mysql_error() ;
  3. ?>


powinienes sprawdzac co powiedzał mySQL, inczej ciężko sie zoriętowac co poszło nie tak, stawiam na to iz w tabeli users masz wiecej pol a zapytanie nie podaje wszystkich wartosci:

  1. <?php
  2. $sql = "INSERT INTO users (name, pass) VALUES ('haba...', MD5('" . $haslo . "') )" 
  3. ?>


i jeszcze :

  1. <?php
  2. @$pass = $_POST["haslo"];
  3. @$user = $_POST["user"];
  4. ?>


powinno być:
  1. <?php
  2.  
  3. $pass = (isset($_POST['haslo'])) ? $_POST['haslo'] : NULL;
  4. $user = (isset($_POST['user'])) ? $_POST['user'] : NULL;
  5. ?>


ucisznie (@) parsera nie jest najlepsza metoda, moze doprowadzic do poważnego spadku wydajnosi skryptu.
habbakuk
W porządku, hula winksmiley.jpg Dzięki!! Jednakże teraz nie mogę się zalogować na zapisane już w bazie dane:
  1. <?php
  2. $pass = (isset($_POST['haslo'])) ? $_POST['haslo'] : NULL;
  3. $user = (isset($_POST['user'])) ? $_POST['user'] : NULL;
  4.  
  5. function checkPass($pass, $user){
  6.  $link = mysql_connect("localhost", "root", "autsajder12");
  7.  $flag = mysql_select_db("nh");
  8.  if(!$link || !$flag){
  9. echo("Error!");
  10. return false;
  11. }
  12.  
  13. $query = "SELECT PASS FROM USERS WHERE name = '".$user."' AND pass = '".md5($pass)."'"; 
  14.  
  15. $result = mysql_query($query);
  16.  
  17. if(!$result){
  18.  echo "Problem z baza danych! Zapytanie zostalo odrzucone! Mysql SAID: " . mysql_error() ;
  19.  mysql_close($link);
  20.  return false;
  21.  }
  22.  
  23.  
  24.  $row = mysql_fetch_row($result);
  25.  if(!$row){
  26. mysql_close($link);
  27. return false;
  28. }
  29.  
  30.  if($row[0] != md5($pass){
  31. mysql_close($link);
  32. return false;
  33. }
  34.  
  35.  else {mysql_close($link); return true;}
  36.  }
  37.  
  38. if(!checkPass($pass, $user)){
  39.  echo("<HTML><BODY><CENTER>");
  40.  echo("<H2>Niepoprawne dane!</H2>");
  41.  echo("</CENTER></BODY></HTML>");
  42.  }
  43.  
  44.  else{
  45. include('index1.html');
  46. }
  47. ?>

Po wpisaniu danych (czy to dobrych czy złych) ani nie pojawia się komunikat: Niepoprawne dane! ani też index1.html - po prostu wyświetla się pusta strona.
Ociu
Proponuje zrobić:
  1. <?php
  2. $query = "SELECT pass FROM USERS WHERE name = '".$user."'";
  3.  
  4. if($r['pass'] === $pass) return true;
  5.  
  6. ?>
Gość_Seba
Witam Panowie mam głupia sprawe wiedze ze macie pojecie o kompach. Mam zone ktora chyba mnie zdradza , korzystamy z tego samego komputera,zmoderowane
ghostrider
  1. <?php
  2.  
  3. if ( zona_zdradza($mnie) )
  4. {
  5.  die($you_bitch);
  6. }
  7.  
  8. ?>

smile.gif)))))))
skasujcie te posty ......
nospor
Drogi gościu. To smutne co piszesz, ale nie możemy ci pomoc w tym o co prosisz. To juz lekko pod nagiecie prawa podchodzi. W związku z tym moderuje Twoj post

@ghostrider a ty to prosisz sie o warna.
kubap0
Witam chce skorzystac z MD5 pole haslo w bazie jest polem varchar 32 znakowym ale mam problem.
Oto moj kod
  1. <?php
  2. $nazwisko = GetSQLValueString($_POST['nazwisko'], "text") ;
  3. $login = GetSQLValueString($_POST['login'], "text");,
  4. $haslo = GetSQLValueString($_POST['haslo'], "text");
  5. $grupa_id = GetSQLValueString($_POST['grupa_id'], "int");
  6. $email = GetSQLValueString($_POST['email'], "text");
  7. $aktywny = GetSQLValueString($_POST['aktywny'], "text");
  8. $handl_info = GetSQLValueString($_POST['handl_info'], "text"));
  9. $szyfr=md5($haslo);
  10.  
  11. $insertSQL = sprintf("INSERT INTO as_user_dane (nazwisko, login, haslo, grupa_id, email, aktywny, handl_info) VALUES ('$nazwisko, '$login', '$szyfr', '$grupa_id', '$email', '$aktywny', '$handl_info')";
  12. ?>

I otzymuje blad :
Unknown column '54d7fdf584c92b8555ad6b0c0b58fe84' in 'field list'
Nie mam pojecia co moze byc nie tak probowalem juz roznych konfiguracji z md5 w zapytaniu sql i tez ten sam blad
drPayton
Wytnij dokłądnie z kodu fragment od:
  1. <?php
  2. $insertSQL =
  3. ?>

bo tak jak wkleiłeś, to w ogóle nie ma prawa działać nic, tylko parse error...
envp
Cytat
MD5 nie da się rozszyfrować (ale krążą plotki, że już się to udało)


haha, oddam mojego laptopa, jak zrobie hasha, z avi mpjego ulubionego filmu, a ty go odkodujesz smile.gif
kubap0
Troche przerobilem ale dalej ten sam blad

  1. <?php
  2. $nazwisko = ($_POST['nazwisko']) ;
  3. $login = ($_POST['login']);
  4. $pass = ($_POST['haslo']);
  5. $grupa_id = ($_POST['grupa_id']);
  6. $email = ($_POST['email']);
  7. $aktywny = ($_POST['aktywny']);
  8. $handl_info = ($_POST['handl_info']);
  9.  
  10. $insertSQL = "INSERT INTO as_user_dane (nazwisko, login, grupa_id, email, aktywny, handl_info, haslo) VALUES ('$nazwisko', '$login', '$grupa_id', '$email', '$aktywny', '$handl_info', MD5('\" . $pass . \"'))";
  11.  
  12. mysql_select_db($database_access, $access);
  13. $Result1 = mysql_query($insertSQL, $access) or die(mysql_error());
  14. ?>
drPayton
  1. <?php
  2. $insertSQL = "INSERT INTO as_user_dane (nazwisko, login, grupa_id, email, aktywny, handl_info, haslo) VALUES ('$nazwisko', '$login', '$grupa_id', '$email', '$aktywny', '$handl_info', MD5('\" . $pass . \"'))";
  3. ?>

zamień na:
  1. <?php
  2. $insertSQL = "INSERT INTO as_user_dane (nazwisko, login, grupa_id, email, aktywny, handl_info, haslo) VALUES ('$nazwisko', '$login', '$grupa_id', '$email', '$aktywny', '$handl_info', '".md5($pass)."')";
  3. ?>

Bo ja szczerze mówiąc nie mam pojęcia co może powodować ten błąd. Po tej zamianie skorzystasz z md5 php'owego zamiast sql'owego.
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.