Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

2 Stron V   1 2 >  
Reply to this topicStart new topic
> [php]md5 i szyfrowanie haseł
habbakuk
post
Post #1





Grupa: Zarejestrowani
Postów: 24
Pomógł: 0
Dołączył: 22.03.2005

Ostrzeżenie: (0%)
-----


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.
Powód edycji: dodałem tag (cysiaczek)
Go to the top of the page
+Quote Post
shpyo
post
Post #2





Grupa: Zarejestrowani
Postów: 574
Pomógł: 2
Dołączył: 13.04.2004
Skąd: Lublin

Ostrzeżenie: (0%)
-----


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,

Ten post edytował shpyo 22.11.2005, 23:35:30


--------------------
Go to the top of the page
+Quote Post
habbakuk
post
Post #3





Grupa: Zarejestrowani
Postów: 24
Pomógł: 0
Dołączył: 22.03.2005

Ostrzeżenie: (0%)
-----


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).

Ten post edytował habbakuk 23.11.2005, 07:20:44
Go to the top of the page
+Quote Post
ActivePlayer
post
Post #4





Grupa: Przyjaciele php.pl
Postów: 1 224
Pomógł: 40
Dołączył: 6.07.2004
Skąd: Wuppertal

Ostrzeżenie: (0%)
-----


jaka dales max dlugosc varchara w bazie ?
Go to the top of the page
+Quote Post
shpyo
post
Post #5





Grupa: Zarejestrowani
Postów: 574
Pomógł: 2
Dołączył: 13.04.2004
Skąd: Lublin

Ostrzeżenie: (0%)
-----


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

Ten post edytował shpyo 23.11.2005, 10:14:54


--------------------
Go to the top of the page
+Quote Post
habbakuk
post
Post #6





Grupa: Zarejestrowani
Postów: 24
Pomógł: 0
Dołączył: 22.03.2005

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
shpyo
post
Post #7





Grupa: Zarejestrowani
Postów: 574
Pomógł: 2
Dołączył: 13.04.2004
Skąd: Lublin

Ostrzeżenie: (0%)
-----


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


--------------------
Go to the top of the page
+Quote Post
habbakuk
post
Post #8





Grupa: Zarejestrowani
Postów: 24
Pomógł: 0
Dołączył: 22.03.2005

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
escaflowne
post
Post #9





Grupa: Zarejestrowani
Postów: 220
Pomógł: 0
Dołączył: 20.02.2003
Skąd: Poznań

Ostrzeżenie: (0%)
-----


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


--------------------
Wieczność jest bardzo nudna, szczególnie pod koniec - Woody Allen
/home/env: Apache 2.2 | PHP 5.2 | MySQL 5.1 | FreeBSD 8.0 | NetBeans 6.8 | symfony 1.4
Go to the top of the page
+Quote Post
habbakuk
post
Post #10





Grupa: Zarejestrowani
Postów: 24
Pomógł: 0
Dołączył: 22.03.2005

Ostrzeżenie: (0%)
-----


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!
Go to the top of the page
+Quote Post
ghostrider
post
Post #11





Grupa: Zarejestrowani
Postów: 135
Pomógł: 0
Dołączył: 30.09.2005
Skąd: k-rk

Ostrzeżenie: (0%)
-----


zapytanie zostało odrzucone gdyż brakuje " ' " apostronfów,
  1. <?php
  2.  
  3. $zapytanie = "INSERT INTO users VALUES ('habbakuk', '".md5($haslo)."')";
  4.  
  5. ?>


--------------------
There are 10 types of people in the world:
-Those who understand binary, and those who don't...
There's no place like 127.0.0.1
Go to the top of the page
+Quote Post
habbakuk
post
Post #12





Grupa: Zarejestrowani
Postów: 24
Pomógł: 0
Dołączył: 22.03.2005

Ostrzeżenie: (0%)
-----


  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.
Go to the top of the page
+Quote Post
ghostrider
post
Post #13





Grupa: Zarejestrowani
Postów: 135
Pomógł: 0
Dołączył: 30.09.2005
Skąd: k-rk

Ostrzeżenie: (0%)
-----


  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.

Ten post edytował ghostrider 27.11.2005, 14:48:21


--------------------
There are 10 types of people in the world:
-Those who understand binary, and those who don't...
There's no place like 127.0.0.1
Go to the top of the page
+Quote Post
habbakuk
post
Post #14





Grupa: Zarejestrowani
Postów: 24
Pomógł: 0
Dołączył: 22.03.2005

Ostrzeżenie: (0%)
-----


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.

Ten post edytował habbakuk 27.11.2005, 15:49:51
Go to the top of the page
+Quote Post
Ociu
post
Post #15





Grupa: Moderatorzy
Postów: 1 566
Pomógł: 37
Dołączył: 14.05.2003
Skąd: Kraków




Proponuje zrobić:
  1. <?php
  2. $query = "SELECT pass FROM USERS WHERE name = '".$user."'";
  3.  
  4. if($r['pass'] === $pass) return true;
  5.  
  6. ?>
Go to the top of the page
+Quote Post
-Gość_Seba-
post
Post #16





Goście







Witam Panowie mam głupia sprawe wiedze ze macie pojecie o kompach. Mam zone ktora chyba mnie zdradza , korzystamy z tego samego komputera,zmoderowane
Go to the top of the page
+Quote Post
ghostrider
post
Post #17





Grupa: Zarejestrowani
Postów: 135
Pomógł: 0
Dołączył: 30.09.2005
Skąd: k-rk

Ostrzeżenie: (0%)
-----


  1. <?php
  2.  
  3. if ( zona_zdradza($mnie) )
  4. {
  5.  die($you_bitch);
  6. }
  7.  
  8. ?>

smile.gif)))))))
skasujcie te posty ......

Ten post edytował ghostrider 30.11.2005, 13:55:52


--------------------
There are 10 types of people in the world:
-Those who understand binary, and those who don't...
There's no place like 127.0.0.1
Go to the top of the page
+Quote Post
nospor
post
Post #18





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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.


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
-kubap0-
post
Post #19





Goście







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
Go to the top of the page
+Quote Post
drPayton
post
Post #20





Grupa: Zarejestrowani
Postów: 890
Pomógł: 65
Dołączył: 13.11.2005
Skąd: Olsztyn

Ostrzeżenie: (0%)
-----


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...
Go to the top of the page
+Quote Post

2 Stron V   1 2 >
Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 19.08.2025 - 05:20