2009-11-17 14 views
27

Używam sha256 do szyfrowania hasła. Mogę zapisać zaszyfrowane hasło sha256 w mysql. Ale nie mogę się zalogować z tą samą klauzulą.Jak korzystać z sha256 w php5.3.0

kod Wkładka:

<?php 
error_reporting(E_ALL^E_NOTICE); 
$username = $_POST['uusername']; 
$passcode = $_POST['ppasscode']; 
$userflag = $_POST['uuserflag']; 
//$passcodeen = hash('sha256',$passcode); 
$passcodeen = hash('sha256', (get_magic_quotes_gpc() ? stripslashes($ppasscode) : $ppasscode)); 
$conn = mysql_connect("localhost","charles","charles") or die("connection failed with DB:".mysql_error()); 
mysql_select_db("sessiondb"); 
$query = "INSERT INTO users(username,passcode,userflag) values('$username','$passcodeen','$userflag')"; 

Wybierz kod:

<?php 
error_reporting(E_ALL^E_NOTICE); 

    @mysql_connect("localhost","charles","charles") or die("Connection failed".mysql_error()); 
    @mysql_select_db("sessiondb") or die("Database doesn't exist".mysql_error()); 
    //get user input 
    $username = $_POST['username']; 
    $ppasscode = $_POST['ppasscode']; 
    //$passcodeen = hash('sha256', $ppasscode); 
    $passcodeen = hash('sha256', (get_magic_quotes_gpc() ? stripslashes($ppasscode) : $ppasscode)); 
    //get session value from mysql 
    $query = @mysql_query("select username, userflag from users where username ='$username' and passcode = '$passcodeen'") or die("Query execution failed".mysql_error()); 

Czy coś się stało? Jestem bardzo zmieszany. Dzięki.

+2

Czy używasz pola VARCHAR do przechowywania hasła? Ponieważ maksymalny rozmiar na varcharach wynosi 255 znaków ... – davethegr8

+0

Czy możesz umieścić próbkę skrótu jako jej zapisaną w bazie danych w porównaniu do tego, jak wygląda w kodzie? –

+1

Dla sha256 potrzebujesz VARCHAR co najmniej 64 znaków. –

Odpowiedz

40

Czy to może być literówka? (Dwa Ps w ppasscode przeznaczone?)

$_POST['ppasscode']; 

chciałbym się upewnić i zrobić:

print_r($_POST); 

i upewnić się, że dane są tam dokładne, a następnie powtórzyć, co to powinno wyglądać:

echo hash('sha256', $_POST['ppasscode']); 

Porównaj to wyjście z tym, co masz w bazie danych (ręcznie). Dzięki temu jesteś odkrywania swoich możliwych punktów awarii:

  1. Pierwsze hasło z formularza
  2. mieszania hasła przy
  3. przechowywane hasło
  4. porównanie dwóch.
+0

@jeremy, Dzięki, tak, "kod ppass" jest przeznaczony. –

+0

jak korzystać z soli? – mofidul

11

Po pierwsze, sha256 jest algorytmem mieszającym, a nie typem szyfrowania. Szyfrowanie wymagałoby sposobu odszyfrowania informacji do pierwotnej wartości (kolizje na bok).

Wygląda na to, że kod powinien działać, jeśli podajesz poprawny parametr.

  • Spróbuj użyć ciągiem znaków w kodzie pierwszy i sprawdzić jego ważność zamiast przy użyciu $_POST[] zmienna

  • Spróbuj przesunąć porównania z kwerendy bazy danych w kodzie (uzyskać hash za dany użytkownika i porównać do mieszania właśnie obliczonej)

Ale co najważniejsze przed wdrożeniem tego w jakiejkolwiek publicznej mody, proszę pamiętać, aby zdezynfekować swoje wejścia. Nie zezwalaj na wstawianie dowolnych instrukcji SQL do zapytań. Najlepszym pomysłem byłoby użycie sparametryzowanych zapytań.

+1

+1, aby uzyskać porady dotyczące sprawdzania poprawności danych wejściowych. Sparametryzowane zapytania zapewniają dużą kontrolę nad bardzo małym dodatkowym kodowaniem. –

+0

@Yannick, Dzięki za twoją dobrą radę. –

-1

Sposób lepszym rozwiązaniem jest po prostu użyć skryptu zgodności znakomity Anthony Ferrara:

https://github.com/ircmaxell/password_compat

proszę, a także, przy sprawdzaniu hasło, zawsze dodawaj sposób (najlepiej asynchronicznie, aby nie wpływał na proces sprawdzania dla ataków czasowych), aby w razie potrzeby zaktualizować hash.