Συνάρτηση password_hash
Στην πραγματικότητα, η συνάρτηση md5 και η αλατισμός
κωδικού πρόσβασης με τη βοήθειά της θεωρείται ξεπερασμένη.
Τη μελετήσαμε για να κατανοήσετε το περαιτέρω
υλικό, αλλά και επειδή μπορεί να τη συναντήσετε
δουλεύοντας σε projects τρίτων.
Υπάρχει ένας πιο εξελιγμένος τρόπος για να πάρετε
έναν αλατισμένο κωδικό πρόσβασης. Για αυτό χρησιμοποιείται η συνάρτηση
password_hash. Ως πρώτη παράμετρο δέχεται
μια συμβολοσειρά, και ως δεύτερη - τον αλγόριθμο κρυπτογράφησης
(για αυτόν αργότερα), και επιστρέφει το hash αυτής της συμβολοσειράς
μαζί με το αλάτι.
Δοκιμάστε να εκτελέσετε αυτόν τον κώδικα πολλές φορές:
<?php
echo password_hash('12345', PASSWORD_DEFAULT);
?>
Θα λαμβάνετε κάθε φορά ένα διαφορετικό αποτέλεσμα και σε αυτό το αποτέλεσμα το πρώτο μέρος της συμβολοσειράς θα αποτελεί το αλάτι, ενώ το δεύτερο μέρος - τον αλατισμένο κωδικό πρόσβασης.
Ας υποθέσουμε ότι έχουμε ένα hash, που προέκυψε από τη συνάρτηση
password_hash και κάποιον κωδικό πρόσβασης. Για να
ελέγξουμε αν είναι το hash αυτού του κωδικού ή όχι,
πρέπει να χρησιμοποιήσουμε τη συνάρτηση password_verify
- ως πρώτη παράμετρο δέχεται τον κωδικό πρόσβασης,
και ως δεύτερη - το hash, και επιστρέφει true
ή false.
Ας δούμε ένα παράδειγμα:
<?php
$password = '12345'; // κωδικός πρόσβασης
$hash = '$2y$10$xoYFX1mFPxBSyxaRe3iIRutxkIWhxGShzEhjYUVd3qpCUKfJE1k7a'; // hash
if (password_verify($password, $hash)) {
// το hash είναι από αυτόν τον κωδικό
} else {
// το hash δεν είναι από αυτόν τον κωδικό
}
?>
Τι μας δίνει αυτό στην πράξη: μπορούμε να μην δημιουργούμε στην βάση δεδομένων ένα ξεχωριστό πεδίο για την αποθήκευση του αλατιού, να μην ασχολούμαστε με τη δημιουργία αυτού του αλατιού - Η PHP θα κάνει τα πάντα για εμάς!
Δηλαδή, θα συμβαίνει το εξής: στη βάση δεδομένων στο πεδίο
password θα αποθηκεύουμε τον αλατισμένο
κωδικό πρόσβασης μαζί με το αλάτι του. Επίσης, ο κωδικός πρόσβασης σε μορφή hash
θα έχει μεγαλύτερο μήκος. Για αυτό
στη βάση δεδομένων πρέπει να διορθώσουμε το μέγεθος
του πεδίου του κωδικού πρόσβασης και να το ορίσουμε σε 60
χαρακτήρες.
Τώρα ας διορθώσουμε τον κώδικα εγγραφής. Να τι έχουμε τώρα:
<?php
function generateSalt()
{
$salt = '';
$saltLength = 8; // μήκος αλατιού
for($i = 0; $i < $saltLength; $i++) {
$salt .= chr(mt_rand(33, 126)); // χαρακτήρας από τον πίνακα ASCII
}
return $salt;
}
$salt = generateSalt(); // αλάτι
$password = md5($salt . $_POST['password']); // μετατρέπουμε τον κωδικό πρόσβασης σε αλατισμένο hash
?>
Με τη βοήθεια της password_hash θα το μειώσουμε σε:
<?php
$password = password_hash($_POST['password'], PASSWORD_DEFAULT);
?>
Παρόμοια θα διορθωθεί και ο κώδικας σύνδεσης:
<?php
$login = $_POST['login'];
$query = "SELECT * FROM users WHERE login='$login'"; // παίρνουμε τον χρήστη από το login
$res = mysqli_query($link, $query);
$user = mysqli_fetch_assoc($res);
if (!empty($user)) {
$hash = $user['password']; // αλατισμένος κωδικός από τη ΒΔ
// Ελέγχουμε την αντιστοιχία του hash από τη βάση με τον κωδικό που εισήχθη
if (password_verify($_POST['password'], $hash)) {
// όλα εντάξει, κάνουμε σύνδεση...
} else {
// ο κωδικός πρόσβασης δεν ταίριαξε, εμφανίζουμε μήνυμα
}
} else {
// δεν υπάρχει χρήστης με αυτό το login, εμφανίζουμε μήνυμα
}
?>
Μετατρέψτε τη διαδικασία σύνδεσης και εγγραφής σας στις νέες συναρτήσεις που μελετήσατε.