Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: szyfrowanie logowania
Forum PHP.pl > Forum > Przedszkole
TopGun
No wiec zabralem sie za tworzenie skryptu logowania i mam maly zgrzyt. Otoz w bazie haslo koduje za pomoca password('haslo') i nijak nie wiem jak porownac to haslo z moim wpisanym oraz jak zakodowac haslo wpisywane w formularzu by siecia szlo juz zakodowane? Ponizej moj skrypcik.

  1. <?php
  2. include ("baza.inc");
  3. $sql_szukaj = "SELECT * FROM users WHERE login = 'admin' and pass = password('admin1234')";
  4. $res_szukaj= @mysql_query($sql_szukaj, $connection) or die("Zapytanie usera nieudane");
  5. if($res_szukaj)
  6. {
  7. $sql_dodaj_admina = "insert into users (login, pass, user, uprawnienia) values ("admin", password('admin1234'), "Administrator", "3")";
  8. $res_dodaj_admina= @mysql_query($sql_dodaj_admina, $connection);// or die("Zapytanie dodania admina nieudane");
  9. }
  10.  
  11. if(!(isset($_POST['login'])) && !(isset($_POST['haslo'])))
  12. {
  13. echo "<FORM action="index.php" method="post">
  14. Login:
  15. <input type="text" name="login" /><BR/>
  16. Hasło:
  17. <input type="password" name="haslo" /><BR/>
  18. <input type="submit" name="Zaloguj" /><BR/></FORM>";
  19. }
  20.  
  21. if(isset($_POST['login']) && isset($_POST['haslo']))
  22. {
  23. $login_porownaj=$_POST['login'];
  24. $haslo_porownaj=$_POST['haslo'];
  25. $haslo = crypt($haslo_porownaj);
  26. $sql_porownaj = "SELECT * FROM users WHERE login = 'jarek' ";
  27. $res_porownaj = @mysql_query($sql_porownaj, $connection) or die("Zapytanie porownania do bani");
  28. while ($row = mysql_fetch_array($res_porownaj))
  29. {
  30. $password = $row['pass'];
  31. echo "$password <BR>
  32. $haslo_porownaj<BR>
  33. $haslo<BR>";
  34. }
  35. if ($password == $haslo_porownaj)
  36. {
  37. echo "zalogowales sie";
  38. }
  39. else
  40. {
  41. echo "zle dane";
  42. }
  43. }
  44. ?>


niby funkcja crypt() po stronie php koduje hasla ale z tego co mi wyswietla to za kazdym razem jest inna wartosc. Jakas podpowiedz?
My4tic
1. Używaj odpowiednich tagów do wstawiania kodu na forum.
2. password() != crypt()
3. Nie używaj SQL'owego password()
4. Używaj funkcji mieszających - MD5, SHA1
5. Crypt() jest także funkcją mieszającą.
TopGun
Dzieki za podpowiedz, uzylem wlasnie md5 i dziala mi to porownanie, lecz w jaki sposob zaszyfrowac formularz, by z niego haslo do serwera szlo zaszyfrowane a nie otwartym tekstem? Czy pozostaje mi tylko szyfrowanie strony przy pomocy ssl?
My4tic
Mógłbyś zakodować hasło w MD5 po stronie klienta przy pomocy javascript'u i dopiero je wysyłać jednak moim zdaniem lepiej użyć SSL.

http://www.google.pl/search?q=md5+javascri...lient=firefox-a
TopGun
Na sieci znalazlem implementacje po stronie klienta w php:

  1. <?php 
  2. /* 
  3.  * sha-1.php 
  4.  * A php implementation of the Secure Hash Algorithm, SHA-1, based on 
  5.  * the JavaScript implementation by Paul Johnston. 
  6.  * This is basically a "translation from JavaScript to php, so most 
  7.  * of the credits should go to Paul Johnston. I only re-wrote it in php. 
  8.  * See <a href="http://pajhome.org.uk/site/legal.html" target="_blank">http://pajhome.org.uk/site/legal.html</a> for details. 
  9.  */ 
  10.  
  11. /* 
  12.  * Convert a 32-bit number to a hex string with ms-byte first 
  13.  */ 
  14. function hex($num) 
  15. { 
  16. $hex_chr = "0123456789abcdef"; 
  17. $str = ""; 
  18. for($j = 7; $j >= 0; $j--) 
  19. $str .= $hex_chr{(($num >> ($j * 4)) & 0x0F)}; 
  20. return $str; 
  21. } 
  22.  
  23. /* 
  24.  * Convert a string to a sequence of 16-word blocks, stored as an array. 
  25.  * Append padding bits and the length, as described in the SHA1 standard. 
  26.  */ 
  27. function str2blks_SHA1($str) 
  28. { 
  29. $nblk = ((strlen($str) + 8) >> 6) + 1; 
  30. for($i = 0; $i < $nblk * 16; $i++) $blks[$i] = 0; 
  31. for($i = 0; $i < strlen($str); $i++) 
  32. $blks[$i >> 2] |= ord($str{$i}) << (24 - ($i % 4) * 8); 
  33. $blks[$i >> 2] |= 0x80 << (24 - ($i % 4) * 8); 
  34. $blks[$nblk * 16 - 1] = strlen($str) * 8; 
  35. return $blks; 
  36. } 
  37.  
  38. /* 
  39.  * Bitwise rotate a 32-bit number to the left 
  40.  */ 
  41.  
  42. // zeroFill() is needed because php doesn't have a zero-fill 
  43. // right shift operator like JavaScript's >>> 
  44. function zeroFill($a, $b) 
  45. { 
  46. $z = hexdec(80000000); 
  47. if ($z & $a) 
  48. { 
  49. $a >>= 1; 
  50. $a &= (~$z); 
  51. $a |= 0x40000000; 
  52. $a >>= ($b-1); 
  53. } 
  54. else 
  55. { 
  56. $a >>= $b; 
  57. } 
  58. return $a; 
  59. } 
  60.  
  61. function rol($num, $cnt) 
  62. { 
  63. return ($num << $cnt) | (zeroFill($num, (32 - $cnt))); 
  64. } 
  65.  
  66. /* 
  67.  * Perform the appropriate triplet combination function for the current 
  68.  * iteration 
  69.  */ 
  70. function ft($t, $b, $c, $d) 
  71. { 
  72. if($t < 20) return ($b & $c) | ((~$b) & $d); 
  73. if($t < 40) return $b ^ $c ^ $d; 
  74. if($t < 60) return ($b & $c) | ($b & $d) | ($c & $d); 
  75. return $b ^ $c ^ $d; 
  76. } 
  77.  
  78. /* 
  79.  * Determine the appropriate additive constant for the current iteration 
  80.  */ 
  81. function kt($t) 
  82. { 
  83. return ($t < 20) ? 1518500249 : ( ($t < 40) ? 1859775393 : ( ($t < 60) ? -1894007588 : -899497514 ) ); 
  84. } 
  85.  
  86. /* 
  87.  * Take a string and return the hex representation of its SHA-1. 
  88.  */ 
  89. function calcSHA1($str) 
  90. { 
  91. $x = str2blks_SHA1($str); 
  92.  
  93. $a = 1732584193; 
  94. $b = -271733879; 
  95. $c = -1732584194; 
  96. $d = 271733878; 
  97. $e = -1009589776; 
  98.  
  99. for($i = 0; $i < count($x); $i += 16) 
  100. { 
  101. $olda = $a; 
  102. $oldb = $b; 
  103. $oldc = $c; 
  104. $oldd = $d; 
  105. $olde = $e; 
  106.  
  107. for($j = 0; $j < 80; $j++) 
  108. { 
  109. if($j < 16) $w[$j] = $x[$i + $j]; 
  110. else $w[$j] = rol($w[$j-3] ^ $w[$j-8] ^ $w[$j-14] ^ $w[$j-16], 1); 
  111.  
  112. $t = rol($a, 5) + ft($j, $b, $c, $d) + $e + $w[$j] + kt($j); 
  113. $e = $d; 
  114. $d = $c; 
  115. $c = rol($b, 30); 
  116. $b = $a; 
  117. $a = $t; 
  118. } 
  119.  
  120. $a += $olda; 
  121. $b += $oldb; 
  122. $c += $oldc; 
  123. $d += $oldd; 
  124. $e += $olde; 
  125. } 
  126. return hex($a) . hex($b) . hex($c) . hex($d) . hex($e); 
  127. } 
  128. ?>


I teraz pytanie: jak wykorzystac funkcje calcSHA1() w formularzu np. tego typu?

  1. <?php
  2. if(!(isset($_POST['login'])) && !(isset($_POST['haslo'])))
  3. {
  4. echo "<FORM action="index.php" method="post">
  5. Login:
  6. <input type="text" name="login" /><BR/>
  7. Hasło:
  8. <input type="password" name="haslo" /><BR/>
  9. <input type="submit" name="Zaloguj" /><BR/></FORM>";
  10. }
  11. ?>
maryaan
powiedz mi jak chcesz zastosowac po stronie klienta cos co jest napisane (a dokladniej przepisane z js) w php ktore dziala po stronie serwera?
TopGun
Hmm...tez prawda smile.gif Wiec pozostaje mi implementacja javascriptu albo sobie odpuscic smile.gif
nospor
a ja zadam pytanie: czemu ma sluzyc hashowanie po stronie klienta?
Rozwazmy sytuacje: masz juz to hashowanie u klienta. Klient sie loguje, wysyla haslo shashowane. Siedzi sobie teraz taki hackier i nasluchuje co wysyla ludek. Przechwytuje shashowane haslo, zaraz potem wysyla identyczne rządanie logowania i mimo ze haslo bylo shashowane to i tak sie zaloguje. teraz moze robic na koncie klienta co dusza zapragnie.
My4tic
Cytat(nospor @ 26.01.2007, 11:58:04 ) *
a ja zadam pytanie: czemu ma sluzyc hashowanie po stronie klienta?
Rozwazmy sytuacje: masz juz to hashowanie u klienta. Klient sie loguje, wysyla haslo shashowane. Siedzi sobie teraz taki hackier i nasluchuje co wysyla ludek. Przechwytuje shashowane haslo, zaraz potem wysyla identyczne rządanie logowania i mimo ze haslo bylo shashowane to i tak sie zaloguje. teraz moze robic na koncie klienta co dusza zapragnie.



...myślę, że jednak jest jakiś plus takiego rozwiązania jednak tak jak pisałem wcześniej - moim zdaniem nie warto się tym bawić. Załóżmy, że hacker sniffuje sieć i przechwytuje pakiety. Kiedy wysyłasz żądanie logowania hacker dostaje tylko hash - nie zna jawnego hasła co przy świadomości bezpieczeństwa użytkowników internetu jednak ma jakieś znaczenie - większość osób ma pewnie takie samo hasło na forum, takie samo do maila, serwera czy wielu innych. Przechwytując login i hasło wystarczy władować nick usera do google i pewnie znajdzie się jeszcze parę serwisów gdzie używa tego samego hasła. Wysyłając hash - zabezpieczasz się przed tym jednak po to jest SSH żeby go używac jeśli jest potrzebne.
nospor
Cytat
większość osób ma pewnie takie samo hasło na forum, takie samo do maila, serwera czy wielu innych.
No to tylko w tej sytuacji, ze nie poznam hasla na inne konta. Ale na danym serwisie bede mogl szalec. Z drugiej strony jesli mowimy o takich ludkach, co to maja te same hasla na rozne serwisy, to i te hasla wowczas do "trudnych" nie naleza i znalezienie odpowiednika dla takiego hasha problemem nie bedzie.

podsumowujac: niepotrzebna zabawa, ale... no wlasnie: co kraj to obyczaj smile.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-2025 Invision Power Services, Inc.