Προσθήκη αλατιού στην εγγραφή
Λοιπόν, γνωρίζετε ήδη ότι ο κατακερματισμός μέσω
md5 είναι μια μη αναστρέψιμη διαδικασία και ένας χάκερ,
που αποκτά πρόσβαση στο hash, δεν θα μπορέσει να αποκτήσει
τον κωδικό πρόσβασης από αυτό το hash.
Στην πραγματικότητα αυτή η δήλωση δεν είναι απολύτως ακριβής - σήμερα, κακόβουλοι χάκερ έχουν δημιουργήσει βιβλιοθήκες hashes δημοφιλών και λιγότερο δημοφιλών κωδικών πρόσβασης και οποιοσδήποτε ηλίθιος μπορεί να μαντέψει τον κωδικό πρόσβασης, απλά αναζητώντας το hash στο Google.
Πρόκειται για αρκετά απλούς, δημοφιλείς κωδικούς πρόσβασης.
Αναζητήστε στο Google, για παράδειγμα, το hash 827ccb0eea8a706c4c34a16891f84e7b
και αμέσως στην αναζήτηση του Google θα δείτε ότι πρόκειται για τον
κωδικό πρόσβασης '12345'.
Τα hashes αρκετά πολύπλοκων κωδικών πρόσβασης δεν μπορούν να μαντευτούν με αυτόν τον τρόπο (δοκιμάστε).
Μπορείτε να ρωτήσετε, ποιο είναι τότε το πρόβλημα - ας κάνουμε όλοι μας εγγραφή με σύνθετους κωδικούς πρόσβασης. Ωστόσο, υπάρχει ένα πρόβλημα - οι περισσότεροι χρήστες δεν σκέφτονται την ασφάλεια των δεδομένων τους και μπορεί να εισάγουν αρκετά απλούς κωδικούς πρόσβασης.
Μπορούμε κατά την εγγραφή να αναγκάζουμε τους χρήστες να επινοούν
μεγαλύτερους σε μήκος κωδικούς πρόσβασης, περιορίζοντας, για παράδειγμα,
τον ελάχιστο αριθμό χαρακτήρων σε 6
ή 8, ωστόσο, θα εξακολουθούν να εμφανίζονται
κωδικοί πρόσβασης όπως '123456' ή '12345678'.
Φυσικά, μπορούμε να επινοήσουμε έναν πιο έξυπνο αλγόριθμο ελέγχου της πολυπλοκότητας του κωδικού πρόσβασης, αλλά υπάρχει μια άλλη λύση.
Η ουσία αυτής της λύσης είναι η εξής: οι κωδικοί πρόσβασης πρέπει να αλατίζονται. Το αλάτι - είναι μια ειδική τυχαία συμβολοσειρά, που θα προστίθεται στον κωδικό πρόσβασης κατά την εγγραφή και το hash θα υπολογίζεται όχι από έναν απλό κωδικό πρόσβασης, αλλά από τη συμβολοσειρά αλάτι+κωδικός πρόσβασης, δηλαδή από τον αλατισμένο κωδικό πρόσβασης.
Δηλαδή κατά την εγγραφή θα κάνετε κάτι σαν αυτό:
<?php
$salt = '1sJg3hfdf'; // αλάτι - σύνθετη τυχαία συμβολοσειρά
$password = md5($salt . $_POST['password']); // μετατρέπουμε τον κωδικό πρόσβασης σε αλατισμένο hash
?>
Σε αυτήν την περίπτωση, το αλάτι θα είναι διαφορετικό για κάθε χρήστη, πρέπει να δημιουργείται τυχαία τη στιγμή της εγγραφής.
Εδώ είναι μια έτοιμη συνάρτηση, που θα το κάνει αυτό:
<?php
function generateSalt()
{
$salt = '';
$saltLength = 8; // μήκος αλατιού
for($i = 0; $i < $saltLength; $i++) {
$salt .= chr(mt_rand(33, 126)); // χαρακτήρας από τον πίνακα ASCII
}
return $salt;
}
?>
Με τη βοήθεια αυτής της συνάρτησης μπορούμε να ξαναγράψουμε τον κώδικά μας ως εξής:
<?php
$salt = generateSalt(); // αλάτι
$password = md5($salt . $_POST['password']); // αλατισμένος κωδικός πρόσβασης
?>
Θα επαναλάβω για άλλη μια φορά, ότι αυτές ήταν αλλαγές κατά την εγγραφή - στη βάση δεδομένων αποθηκεύουμε όχι απλά το hash του κωδικού πρόσβασης, αλλά το hash του αλατισμένου κωδικού πρόσβασης.
Αυτό δεν είναι όλο: στον πίνακα χρηστών εκτός από
τα πεδία login και password πρέπει
να δημιουργηθεί και ένα πεδίο salt, στο οποίο
θα αποθηκεύουμε το αλάτι κάθε χρήστη.
Υλοποιήστε την παραπάνω εγγραφή με αλατισμένο κωδικό πρόσβασης.