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.