PHP - szyfrowanie haseł dostępu
| DZIAŁANIE: |
SHA1 == d033e22ae348aeb5660fc2140aec35850c4da997 MD5 == 21232f297a57a5a743894a0e4a801fc3 sha1 == Đ3â*ăHŽľf ě5 MŠ |
Kod:

Ewentualne Objaśnienia:
Pokazywałem już sporo różnych rozwiązań logowania itp - zawsze jednak hasła zapisywane w pliku czy też bazie danych były w swojej pierwotnej formie - w formie tekstowej, nie były w żaden sposób zaszyfrowane. To nie jest dobre rozwiązanie - dlatego, też powinno się użyć algorytmów mieszających , szyfrujących. Jest wiele jednokierunkowych algorytmów w PHP ( jednokierunkowy czyli szyfrujemy dane z postaci normalnej do zakodowanej, ale nie ma możliwości zrobienia tego samego z powrotem ). Popularne to algorytm MD5 ( Message Digest 5 ) dostępny w wielu wersjach PHP. Inny to SHA1 ( Secure Hash Algoritm ) obsługiwany od wersji bodajże 4.3.0 ( głowy nie daje ale na 85% tak ).
SHA1 przyjmuje 2 argumenty :
- 1 - łańcuch do zakodowania
- 2 - opcjonalny parametr oznaczający łańcuch binarny
SHA1 zwraca pseudolosowy łańcuch 40znaków, natomiast jeżeli ustawimy 2
parametr na true ( jak na przykładzie ) to zwróci 20-znakowy łańcuch danych
binarnych.
SHA1 z 2 argumentem - nie zadziała na serwerze z wersją PHP inną niż 5.
Jak z tego korzystać ? Jeśli mamy na przykład sobie jakieś jedno hasło - tak jak na przykładzie "admin" no to można napisać warunek :
if ($user == "moderator" && sha1($pass) ==
"d033e22ae348aeb5660fc2140aec35850c4da997" )
{
echo "masz dostęp do tajnej strony";
}
else
{
echo "Niepoprawne dane!";
}
Oczywiście przykład ten jest bardzo ubogi, rzecz jasna kiedy na przykład będziemy przechowywać więcej haseł dostępowych w plikach txt czy bazie danych to sprawdzanie poprawności danych w ten sposób mija się z celem.
Załóżmy, że mamy przechowywane nazwy użytkowników i hasła dla nich w bazie
danych w tabeli users, gdzie mamy pola :
- uzytkownik
- haslo
No i teraz chcemy aby nasze dane były szyfrowane więc generalnie kiedy
dodajemy nowego użytkownika należy hasło dla niego zaszyfrować więc albo :
- zmienną z hasłem na przykład $pass = addslashes(htmlspecialchars($_POST['haslo']))
szyfrujemy sobie wcześniej czyli po przesłaniu danych :
$pass = sha1($pass) a następnie dodajemy dane do
bazy czyli :
INSET INTO users VALUES ('$nazwa', '$pass');
- lub też w czasie wykonywania zapytania czyli :
INSERT INTO users VALUES ('$nazwa', sha1('$pass') )
SHA1 występuje zarówno jako funkcja PHP jak i MySQL, zobaczmy jak napisać dla
naszej tabeli :
$query = "SELECT COUNT(*) FROM users WHERE uzytkownik='$nazwa'
AND haslo=sha1('$pass');
$wynik = mysql_query($query);
$rekord = mysql_fetch_row($wynik);
$zlicz = $rekord[0];
if ( $zlicz > 0 )
{
echo "podano poprawne dane logowania";
}
else
{
echo "podano niepoprane dane logowania";
}
Wynikiem naszego zapytania może być 0 lub 1 - z racji takiej, że powinnyśmy
nasze pole uzytkownk ustawić jako primary key - więc nie będzie w bazie
użytkowników o takiej samej nazwie, więc sprawdzane jest czy dla użytkownika
określonego zmienną $nazwa ( czyli wpisany login w czasie logowania ) hasło z
bazy danych jest takie samo jak hasło podane przy logowaniu ( wcześniej
szyfrujemy podane hasło użytkownika aby je sprawdzić z tym z bazy ).
Warto tutaj pamiętać, że SHA1 zwraca 40 znakowy ciąg więc pole w bazie danych
przechowujące hasła powinno mieć odpowiednią długość.