Dlaczego funkcja crypt () PHP zwraca to samo dla dwóch różnych łańcuchów?

Używam PHPcrypt funkcja haszowania / szyfrowania haseł, ale nie sądzę, że robię to dobrze, ponieważ „nathan12” i „nathan123” pozwalają mi zalogować się do mojego konta w moim systemie (rzeczywiste hasło to „nathan123”, a zatem „nathan12 „lub cokolwiek innego powinnoNIE pozwól mi się zalogować).

Oto, co mój system robi, gdy użytkownik rejestruje się:

[...]

$salt = uniqid(mt_rand(), true);
$password = crypt($password, $salt); // '$password' is the inputted password

$insertUserStmt = $mysqli->prepare("INSERT INTO users (name, 
username, 
password, 
password_salt, 
email, 
created) VALUES (?, ?, ?, ?, ?, ?)");

$insertUserStmt->bind_param("sssssi", $name, $username, $password, $salt, $email, time());

$insertUserStmt->execute();

[...]

Wstawia hashowane / szyfrowane hasło ($password) do bazy danych wraz z$salt.

Gdy ktoś próbuje się zalogować, wykonuje się następujące czynności, aby sprawdzić, czy użytkownik wprowadził poprawne hasło dla wprowadzonej nazwy użytkownika:

[...]

// $password_salt is from DB; $password is inputted password
$password_crypt = crypt($password, $password_salt); 

// $login_password is from DB
if($password_crypt == $login_password) { 

[...]

Prawdopodobnie nawet nie używamcrypt działa poprawnie, ale zgodnie z dokumentami PHP pierwszym parametrem jest łańcuch (hasło), a drugi to sól.

questionAnswers(3)

yourAnswerToTheQuestion