Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php]Dziwny problem z hash()
Forum PHP.pl > Forum > PHP
neosatan
Hejka,
Mam ciekawy problem z funkcją hashującą w php.
  1. private function hash($username, $salt, $password)
  2. {
  3. return hash('sha512', $salt.$username.$password);
  4. }
  5. function checkValidUsernamePassword($username, $password)
  6. {
  7. $this->startDatabase();
  8. $sql = "select nazwa, salt, hash from users where nazwa ='$username' limit 1";
  9. $result = mysql_query($sql);
  10. if(mysql_num_rows($result) == 1)
  11. {
  12. $record = mysql_fetch_assoc($result);
  13. $hash = $this->hash($username, $record['salt'], $password);
  14. echo $hash.'<br/>';
  15. echo $record['hash'].'<br/>';
  16. echo strlen($hash).'<br/>';
  17. echo strlen($record['hash']);
  18. if($hash == $record['hash'])
  19. return true;
  20. else
  21. return false;
  22. }
  23. else
  24. return false;
  25.  
  26. }

i output
  1. 678e3130227fedc39757785a044202fc6c6c072f46c98c37b4c628da7b98c092674a534ff1c49909
    c6800265705ee098b9e38f30198dba6e0ad8b0113d8d0ba0
  2. 734a8cb77a6f469e933857637600e29749d4be75112711f89d78b3bf462f7b664b7b1bef511370c8
    79c84145bb2795d6da4810de5de852ccdc6456753de127ad
  3. 128
  4. 128


jak można się szybko domyślić hash się nie pokrywa, a co za tym idzie nie mogę przeprowadzić autoryzacji użytkownika.
Pierwszy raz spotkałem się z czymś takim. Jak ktoś może mi podsunąć pomysł jaki jest powód różnego hashowania tych samych stringów (lub może gdzieś po drodze stringi są zmieniane, a ja nie wiem o tym :?), to będę bardzo szczęśliwy.
jang
nie wiem jak Twoje ale moje PHP pokazuje w takich wypadkach :
  1. function hash($username, $salt, $password)
  2. {
  3.  
  4. }

Fatal error: Cannot redeclare hash() in /test.php on line 4
neosatan
bo ta funkcja jest częścią większej klasy, ale reszta klasy jest nieistotna, wykonuje po prostu inne zadania.
jang
Cytat(neosatan @ 14.04.2011, 22:40:27 ) *
bo ta funkcja jest częścią większej klasy, ale reszta klasy jest nieistotna, wykonuje po prostu inne zadania.

a co ma piernik do wiatraka ?
1. skoro w klasie to metoda a nie funkcja
2. http://pl.php.net/manual/pl/functions.user-defined.php :
PHP nie umożliwia przeładowywania funkcji, nie jest też możliwe usunięcie jej definicji lub redefiniowanie poprzednio określonych funkcji.
więc skoro w PHP istnieje funkcja hash() to metoda nie ma prawa się tak nazywać -> Cannot redeclare hash()
Bags_Bunny
@neosatan: nie pokazałeś nam w jaki sposób wygenerowałeś hash, który jest w bazie. Może jest inaczej posolony?

Cytat(jang @ 14.04.2011, 22:53:07 ) *
1. skoro w klasie to metoda a nie funkcja

Owszem, w ogólnej nomenklaturze. PHP jednak, jak zresztą widać przy deklaracji, określa to też mianem funkcji.

Cytat(jang @ 14.04.2011, 22:53:07 ) *
więc skoro w PHP istnieje funkcja hash() to metoda nie ma prawa się tak nazywać -> Cannot redeclare hash()

Co palisz? Też to chcę.

-- edycja --
Zmieniłem zdanie. Nie chcę tego towaru. Miałbym koszmary...
neosatan
@jang. Napisz sobie na spokojnie taka klasę, odpal, później się zastanów co napisałeś.
@Bags_Bunny. Faktycznie. Kod jest poniżej.
  1. function addUser($username, $password)
  2. {
  3. $this->startDatabase();
  4. if($this->checkUsername($username))
  5. {
  6. $salt = $this->generateSalt();
  7. $hash = $this->hash($username, $salt, $password);
  8. echo $hash.'<br/>';
  9. $sql = "call add_user('$username', '$hash', '$salt')";
  10. mysql_query($sql);
  11. return true;
  12. }
  13. else
  14. return false;
  15. }


Co ciekawe, z śledzenia stringów w każdej fazie wynika z tego, że z tych samych danych mogą powstać dwa inne hashe przy użyciu sha512. Może jest jakiś bug z tym związany?
auto-all
Zrób tak:
  1. // Poniższą linię zamień
  2. return hash('sha512', $salt.$username.$password);
  3. // na
  4. return $salt.$username.$password;
  5. // Zobczysz string z którego generujesz hash
możne dane się różnią jakimś drobnym szczegółem
ylk
Cytat(jang @ 14.04.2011, 23:53:07 ) *
a co ma piernik do wiatraka ?
skoro w PHP istnieje funkcja hash() to metoda nie ma prawa się tak nazywać -> Cannot redeclare hash()

Ojj ale wpadka... może na drugi raz sprawdź, zanim napiszesz taką głupotę? Przecież sam napisałeś, że metoda to nie funkcja <lol>
neosatan
Prześledziłem zmianę łańcuchów znaków, ale jak wchodzą do metody hash są identyczne (w przypadku logowania i rejestracji). Sprawdziłem też czy pod funkcjami md5() i sh1() (właściwie nie wiem po co, bo przecież to są aliasy do hash('md5', $string), hash('sha1', $string)), oraz innymi algorytmami hashowania też tak się dziej. Niestety dzieje się to samo, więc to musi być jakiś błąd w kodzie, lub istnieje jakieś przekodowanie w znakach, o którym nie wiem. Powiem, że serwer działa na windowsie i na platformie XAMPP. Nie znam żadnych bugów, które by to powodowały.
auto-all
Porównuj dane z hashem który wygenerujesz sobie na stronie http://gen24.pl/ i sprawdź czy te przekłamanie występuje podczas rejestracji czy podczas autoryzacji (moze do bazy zapisujesz niepoprawna wartość tego $salt).
Bags_Bunny
Cytat(auto-all @ 15.04.2011, 12:14:50 ) *
(moze do bazy zapisujesz niepoprawna wartość tego $salt).

Słuszna uwaga. Może np. wielkość pola w bazie jest niewłaściwa i sól jest rozsypywana?
neosatan
faktycznie. sól była rozsypywana. Długość pola była o 1 za mała.
Dziękuję wszystkim za pomoc.
Bags_Bunny
Też nie lubię niedosolonych potraw wink.gif
Cieszymy się, że mogliśmy pomóc i prosimy o "pomogła" wink.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.