2016-12-14 16 views
7

Używam funkcji php crypt do zabezpieczenia hasła, ale gdy spróbuję porównać hasło wprowadzone w bazie danych, nie będzie działać.Nie mogę porównać hasła z mojej bazy danych i wprowadzonej

tutaj jest mój kod, aby utworzyć hasło w pierwszej kolejności:

$crypt_password = crypt($_POST['confirm-password']); 

tutaj to ja próbuje porównać do hasła w innej funkcji:

$input_crypt_password = crypt($_POST['input-pw']); 

if ($input_crypt_password == $dbpassword){ 
    // do change password function 
} 

To nie działa.

podczas drukowania obu haseł są różne.

dlaczego hasła są różne, mimo że wpisuję to samo hasło i używam funkcji kryptograficznej na obu?

Czy ktoś może wskazać mi właściwy kierunek?

+3

Należy przeczytać dokumentację dotyczącą używanej funkcji. To odpowie na twoje pytanie. – arkascha

+1

szybkie odniesienie: 'Opcjonalny ciąg soli do oparcia mieszania. Jeśli nie zostanie podane, zachowanie jest zdefiniowane przez implementację algorytmu i może prowadzić do nieoczekiwanych wyników. " – bansi

+4

Rozważ skorzystanie z bezpieczniejszego password_hash() - https://secure.php.net/manual/en/function.password-hash. php –

Odpowiedz

1

Nie wiem co powiedzieć, że będzie dodać więcej szczegółów niż to, co wszyscy już powiedział ...

więc w dzisiejszej hash/algorytmy unhashing byłoby niebezpieczne do przechowywania haseł za pomocą standardowego hashowania funkcje (np. MD5/SHA256), ponieważ szybkie i łatwe jest usuwanie tego typu wpisów.

password_hash() jako odniesienie w innych odpowiedzi i komentarze powinny być jesteś # 1 sposobem na bezpieczne przechowywanie haseł, gdyż wykorzystuje jednokierunkowej mieszającego algorytm.

You should read this page!

A potem w odpowiedzi na oryginalne pytanie, użyj hash_equals() funkcję porównać haseł.

6

Nie używaj crypt bezpośrednio dla haseł.

Jeśli masz PHP 5.5+, użyj wbudowanej funkcji password_hash, w przeciwnym razie, jeśli masz PHP 5.3.7+, użyj polyfill dla tej funkcji.

13

Od the docs

Przykład # 1 krypty() Przykłady

<?php 
$hashed_password = crypt('mypassword'); // let the salt be automatically generated 

/* You should pass the entire results of crypt() as the salt for comparing a 
    password, to avoid problems when different hashing algorithms are used. (As 
    it says above, standard DES-based password hashing uses a 2-character salt, 
    but MD5-based hashing uses 12.) */ 
if (hash_equals($hashed_password, crypt($user_input, $hashed_password))) { 
    echo "Password verified!"; 
} 
?> 

Kod w pytaniu będzie skutecznie generować nowy hash za każdym razem to się nazywa - istniejąca hash hasła musi być przekazywane jako sól, aby uzyskać spójny wynik.

jak wspomniano w Dokumentach

Zastosowanie password_hash() zachęca.

pójdę dalej i powiedzieć, na pewno należy używać password_hash zamiast dzwonić crypt do użycia haseł (zakładając PHP> = 5,5); w każdym przypadku, niezależnie od tego, jakich narzędzi/metod używasz - przeczytaj dokumenty, aby dowiedzieć się, jak z nich korzystać.

+0

poznaj wszystkie powyższe komplikacje dla gorszego niezadowalającego algorytmu hasła lub po prostu użyj hasła password_hash zgodnie z zaleceniami instrukcji. – bansi

+1

@bansi 'password_hash() jest prostą paczką crypt() i zgodną z istniejącymi hasłami haszowania. Użycie password_hash() jest zachęcane. "Ja również zachęcałbym do używania' password_hash', ale błąd w pytaniu nie jest "używanie niewłaściwej funkcji" to "używanie funkcji, zła" - lub po prostu nie czytanie dokumentów. – AD7six

2

Spróbuj czegoś takiego.

$crypt_password = crypt($_POST['confirm-password'],salt); 

$input_crypt_password = crypt($_POST['input-pw'],salt); 

if ($input_crypt_password == $dbpassword){ 
    // do change password function 
    echo "Password match successfully!"; 
} 

Tutaj parametr salt do oparcia mieszania. W przeciwnym razie zachowanie jest określane przez implementację algorytmu i może prowadzić do nieoczekiwanych wyników.

+1

Prawdopodobnie masz na myśli '$ salt', chyba że' sól' jest zdefiniowana jako stała ... – Leith

0

Jak już wspomniano, wielu użytkowników powinno używać funkcji php: password_hash.

Tutaj można zobaczyć prosty przykład, jak go używać:

<?php 

$password = '123456'; 
$userInput = '123456'; 

$storedHash = password_hash($password, PASSWORD_DEFAULT); 

if (password_verify($userInput, $storedHash)) { 
    echo 'OK'; 
} else { 
    echo 'ERROR'; 
} 

Ponadto, jak wspomniano wcześniej, jeśli używasz starszej wersji PHP, można zainstalować polyfill.

0

Czy przycinałeś wejście przed zapisaniem w db i podczas porównywania. Ponieważ dane wejściowe pochodzą z przeglądarki, może to być powód, dla którego nie pasuje. w przeciwnym razie ten https://stackoverflow.com/a/41141338/1748066 wydaje się odpowiedni.

Powiązane problemy