Πιστεύουμε ότι το Stack Overflow δεν θα πρέπει να είναι μόνο μια πηγή για πολύ συγκεκριμένες τεχνικές ερωτήσεις, αλλά και για γενικές οδηγίες σχετικά με το πώς να επιλύσετε παραλλαγές κοινών προβλημάτων. "Έλεγχος ταυτότητας βάσει φόρμας για ιστότοπους" θα πρέπει να είναι ένα καλό θέμα για ένα τέτοιο πείραμα.
Θα υποθέσουμε ότι γνωρίζετε ήδη πώς να κατασκευάσετε μια φόρμα HTML σύνδεσης + κωδικού πρόσβασης η οποία POSTάρει τις τιμές σε ένα σενάριο στην πλευρά του διακομιστή για έλεγχο ταυτότητας. Οι παρακάτω ενότητες θα ασχοληθούν με πρότυπα για υγιή πρακτικά auth, και πώς να αποφύγετε τις πιο συνηθισμένες παγίδες ασφαλείας. Για HTTPS ή όχι για HTTPS; Αν η σύνδεση δεν είναι ήδη ασφαλής (δηλαδή, διοχετευμένη μέσω HTTPS με χρήση SSL/TLS), οι τιμές της φόρμας σύνδεσης θα αποστέλλονται σε καθαρό κείμενο, γεγονός που επιτρέπει σε οποιονδήποτε κρυφακούει τη γραμμή μεταξύ του προγράμματος περιήγησης και του διακομιστή ιστού να μπορεί να διαβάσει τις συνδέσεις καθώς περνούν. Αυτός ο τύπος υποκλοπής γίνεται συνήθως από τις κυβερνήσεις, αλλά γενικά, δεν θα ασχοληθούμε με τα 'ιδιόκτητα' καλώδια παρά μόνο για να πούμε το εξής: Απλά χρησιμοποιήστε το HTTPS. Στην ουσία, ο μόνος πρακτικός τρόπος για να προστατευτείτε από την υποκλοπή/παρακολούθηση πακέτων κατά τη διάρκεια της σύνδεσης είναι η χρήση του HTTPS ή ενός άλλου σχήματος κρυπτογράφησης που βασίζεται σε πιστοποιητικά (για παράδειγμα, TLS) ή ενός δοκιμασμένου σχήματος πρόκλησης-απάντησης (για παράδειγμα, το SRP που βασίζεται στο Diffie-Hellman). Οποιαδήποτε άλλη μέθοδος μπορεί εύκολα να παρακαμφθεί από έναν εισβολέα που κρυφακούει. Φυσικά, αν είστε πρόθυμοι να γίνετε λίγο ανεφάρμοστοι, θα μπορούσατε επίσης να χρησιμοποιήσετε κάποια μορφή σχήματος ελέγχου ταυτότητας δύο παραγόντων (π.χ. την εφαρμογή Google Authenticator, ένα φυσικό 'cold war style' codebook, ή ένα RSA key generator dongle). Εάν εφαρμοστεί σωστά, αυτό θα μπορούσε να λειτουργήσει ακόμη και με μια μη ασφαλή σύνδεση, αλλά είναι δύσκολο να φανταστεί κανείς ότι ένας προγραμματιστής θα ήταν πρόθυμος να εφαρμόσει το two-factor auth αλλά όχι το SSL. (Μην) Κρυπτογράφηση JavaScript από το δικό σας ρολό (Roll-your-own) / κρυπτογράφηση/κρυπτογράφηση με κρυπτογράφηση σε μορφή κατακερματισμού Δεδομένου του αντιληπτού (αν και πλέον αποφεύξιμου) κόστους και της τεχνικής δυσκολίας της εγκατάστασης ενός πιστοποιητικού SSL στον ιστότοπό σας, ορισμένοι προγραμματιστές μπαίνουν στον πειρασμό να αναπτύξουν τα δικά τους συστήματα κατακερματισμού ή κρυπτογράφησης εντός του προγράμματος περιήγησης, προκειμένου να αποφύγουν τη διαβίβαση συνδέσεων καθαρού κειμένου μέσω ενός μη ασφαλούς καλωδίου. Αν και αυτή είναι μια ευγενική σκέψη, είναι ουσιαστικά άχρηστη (και μπορεί να αποτελέσει ελάττωμα ασφαλείας), εκτός αν συνδυαστεί με ένα από τα παραπάνω - δηλαδή είτε με την εξασφάλιση της γραμμής με ισχυρή κρυπτογράφηση είτε με τη χρήση ενός δοκιμασμένου μηχανισμού πρόκλησης-απόκρισης (αν δεν ξέρετε τι είναι αυτό, απλά να ξέρετε ότι είναι μια από τις πιο δύσκολα αποδείξιμες, πιο δύσκολα σχεδιάσιμες και πιο δύσκολα υλοποιήσιμες έννοιες στην ψηφιακή ασφάλεια). Ενώ είναι αλήθεια ότι ο κατακερματισμός του κωδικού πρόσβασης μπορεί να είναι αποτελεσματικός κατά της αποκάλυψης κωδικού πρόσβασης, είναι ευάλωτος σε επιθέσεις επανάληψης, επιθέσεις Man-In-The-Middle / αεροπειρατεία (αν ένας εισβολέας μπορεί να εισάγει μερικά bytes στην ανασφάλιστη σελίδα HTML πριν φτάσει στο πρόγραμμα περιήγησής σας, μπορεί απλά να σχολιάσει τον κατακερματισμό στην JavaScript), ή επιθέσεις brute-force (αφού δίνετε στον εισβολέα τόσο το όνομα χρήστη, το αλάτι όσο και τον κατακερματισμένο κωδικό πρόσβασης). CAPTCHAS κατά της ανθρωπότητας Το CAPTCHA προορίζεται να ανατρέψει μια συγκεκριμένη κατηγορία επιθέσεων: αυτοματοποιημένη δοκιμασία και σφάλμα λεξικού/brute force χωρίς ανθρώπινο χειριστή. Δεν υπάρχει καμία αμφιβολία ότι αυτή είναι μια πραγματική απειλή, ωστόσο, υπάρχουν τρόποι απρόσκοπτης αντιμετώπισής της που δεν απαιτούν CAPTCHA, συγκεκριμένα κατάλληλα σχεδιασμένα συστήματα στραγγαλισμού σύνδεσης από την πλευρά του διακομιστή - θα τα συζητήσουμε αργότερα. Γνωρίζετε ότι οι υλοποιήσεις CAPTCHA δεν είναι ίδιες- συχνά δεν είναι επιλύσιμες από τον άνθρωπο, οι περισσότερες από αυτές είναι στην πραγματικότητα αναποτελεσματικές έναντι των bots, όλες είναι αναποτελεσματικές έναντι της φτηνής εργασίας του τρίτου κόσμου (σύμφωνα με το OWASP, η τρέχουσα τιμή του sweatshop είναι 12 δολάρια ανά 500 δοκιμές) και ορισμένες υλοποιήσεις μπορεί να είναι τεχνικά παράνομες σε ορισμένες χώρες (βλ. OWASP Authentication Cheat Sheet). Αν πρέπει να χρησιμοποιήσετε ένα CAPTCHA, χρησιμοποιήστε το reCAPTCHA της Google, καθώς είναι εξ ορισμού OCR-σκληρό (αφού χρησιμοποιεί ήδη OCR-ανεπιθύμητες σαρώσεις βιβλίων) και προσπαθεί πολύ σκληρά να είναι φιλικό προς τον χρήστη. Προσωπικά, τείνω να βρίσκω τα CAPTCHAS ενοχλητικά και τα χρησιμοποιώ μόνο ως έσχατη λύση όταν ένας χρήστης έχει αποτύχει να συνδεθεί αρκετές φορές και οι καθυστερήσεις στραγγαλισμού έχουν εξαντληθεί. Αυτό θα συμβεί αρκετά σπάνια ώστε να είναι αποδεκτό και ενισχύει το σύστημα στο σύνολό του. Αποθήκευση κωδικών πρόσβασης / επαλήθευση συνδέσεων Αυτό μπορεί τελικά να είναι κοινή γνώση μετά από όλες τις πολύ-δημοσιευμένες παραβιάσεις και διαρροές δεδομένων χρηστών που είδαμε τα τελευταία χρόνια, αλλά πρέπει να ειπωθεί: Μην αποθηκεύετε κωδικούς πρόσβασης σε καθαρό κείμενο στη βάση δεδομένων σας. Οι βάσεις δεδομένων των χρηστών παραβιάζονται, διαρρέουν ή συλλέγονται τακτικά μέσω SQL injection, και αν αποθηκεύετε ακατέργαστους κωδικούς πρόσβασης σε απλό κείμενο, αυτό σημαίνει ότι το παιχνίδι τελείωσε αμέσως για την ασφάλεια της σύνδεσής σας. Έτσι, αν δεν μπορείτε να αποθηκεύσετε τον κωδικό πρόσβασης, πώς ελέγχετε ότι ο συνδυασμός login+password που αποστέλλεται από τη φόρμα σύνδεσης είναι σωστός; Η απάντηση είναι ο κατακερματισμός με χρήση μιας συνάρτησης εξαγωγής κλειδιού. Κάθε φορά που δημιουργείται ένας νέος χρήστης ή αλλάζει ένας κωδικός πρόσβασης, παίρνετε τον κωδικό πρόσβασης και τον περνάτε από ένα KDF, όπως το Argon2, το bcrypt, το scrypt ή το PBKDF2, μετατρέποντας τον κωδικό πρόσβασης καθαρού κειμένου ("correcthorsebatterystaple") σε ένα μακρύ, τυχαίο αλφαριθμητικό, το οποίο είναι πολύ πιο ασφαλές να αποθηκεύσετε στη βάση δεδομένων σας. Για να επαληθεύσετε μια σύνδεση, εκτελείτε την ίδια συνάρτηση κατακερματισμού στον εισαγόμενο κωδικό πρόσβασης, αυτή τη φορά περνώντας το salt και συγκρίνετε την προκύπτουσα συμβολοσειρά κατακερματισμού με την τιμή που είναι αποθηκευμένη στη βάση δεδομένων σας. Τα Argon2, bcrypt και scrypt αποθηκεύουν ήδη το salt μαζί με το hash. Ανατρέξτε σε αυτό το άρθρο στο sec.stackexchange για πιο λεπτομερείς πληροφορίες. Ο λόγος που χρησιμοποιείται ένα salt είναι ότι ο κατακερματισμός από μόνος του δεν είναι επαρκής -- θα θέλετε να προσθέσετε ένα λεγόμενο 'salt' για να προστατεύσετε το hash από rainbow tables. Ένα salt ουσιαστικά εμποδίζει δύο κωδικούς πρόσβασης που ταιριάζουν ακριβώς να αποθηκευτούν ως η ίδια τιμή κατακερματισμού, αποτρέποντας έτσι τη σάρωση ολόκληρης της βάσης δεδομένων σε μία εκτέλεση, εάν ένας επιτιθέμενος εκτελεί επίθεση μαντείας κωδικού πρόσβασης. Ένας κρυπτογραφικός κατακερματισμός δεν πρέπει να χρησιμοποιείται για την αποθήκευση κωδικών πρόσβασης, επειδή οι επιλεγμένοι από τον χρήστη κωδικοί πρόσβασης δεν είναι αρκετά ισχυροί (δηλαδή συνήθως δεν περιέχουν αρκετή εντροπία) και μια επίθεση μαντεψιάς κωδικών πρόσβασης θα μπορούσε να ολοκληρωθεί σε σχετικά σύντομο χρονικό διάστημα από έναν επιτιθέμενο με πρόσβαση στους κατακερματισμούς. Για το λόγο αυτό χρησιμοποιούνται τα KDFs - αυτά ουσιαστικά "τεντώνουν το κλειδί", πράγμα που σημαίνει ότι κάθε μαντεψιά κωδικού πρόσβασης που κάνει ένας επιτιθέμενος προκαλεί πολλαπλές επαναλήψεις του αλγορίθμου κατακερματισμού, για παράδειγμα 10.000 φορές, γεγονός που αναγκάζει τον επιτιθέμενο να μαντέψει τον κωδικό πρόσβασης 10.000 φορές πιο αργά. Τα δεδομένα συνεδρίας - "Έχετε συνδεθεί ως Spiderman69" Αφού ο διακομιστής επαληθεύσει τη σύνδεση και τον κωδικό πρόσβασης με τη βάση δεδομένων των χρηστών σας και βρει μια αντιστοιχία, το σύστημα χρειάζεται έναν τρόπο για να θυμάται ότι το πρόγραμμα περιήγησης έχει πιστοποιηθεί. Αυτό το γεγονός θα πρέπει να αποθηκεύεται πάντα μόνο από την πλευρά του διακομιστή στα δεδομένα συνόδου. Εάν δεν είστε εξοικειωμένοι με τα δεδομένα συνόδου, δείτε πώς λειτουργούν: Μια μοναδική συμβολοσειρά που δημιουργείται τυχαία αποθηκεύεται σε ένα cookie που λήγει και χρησιμοποιείται για να παραπέμπει σε μια συλλογή δεδομένων - τα δεδομένα συνόδου - τα οποία αποθηκεύονται στον διακομιστή. Εάν χρησιμοποιείτε ένα πλαίσιο MVC, αυτό αναμφίβολα έχει ήδη αντιμετωπιστεί. Εάν είναι δυνατόν, βεβαιωθείτε ότι το cookie συνεδρίας έχει τις σημαίες secure και HTTP Only (Μόνο HTTP) ρυθμισμένες κατά την αποστολή του στο πρόγραμμα περιήγησης. Η σημαία HttpOnly παρέχει κάποια προστασία από την ανάγνωση του cookie μέσω επίθεσης XSS. Η σημαία secure διασφαλίζει ότι το cookie αποστέλλεται πίσω μόνο μέσω HTTPS και, επομένως, προστατεύει από επιθέσεις κατασκοπείας δικτύου. Η τιμή του cookie δεν πρέπει να είναι προβλέψιμη. Όταν παρουσιάζεται ένα cookie που παραπέμπει σε ανύπαρκτη σύνοδο, η τιμή του πρέπει να αντικαθίσταται αμέσως για την αποφυγή session fixation.
Τα Cookies μόνιμης σύνδεσης ("θυμηθείτε με" λειτουργικότητα) αποτελούν μια επικίνδυνη ζώνη: από τη μία πλευρά, είναι απολύτως εξίσου ασφαλή με τις συμβατικές συνδέσεις όταν οι χρήστες κατανοούν πώς να τα χειρίζονται, και από την άλλη πλευρά, αποτελούν τεράστιο κίνδυνο για την ασφάλεια στα χέρια απρόσεκτων χρηστών, οι οποίοι μπορεί να τα χρησιμοποιούν σε δημόσιους υπολογιστές και να ξεχνούν να αποσυνδεθούν, και οι οποίοι μπορεί να μην γνωρίζουν τι είναι τα cookies του προγράμματος περιήγησης ή πώς να τα διαγράψουν. Προσωπικά, μου αρέσουν τα μόνιμα logins για τους ιστότοπους που επισκέπτομαι τακτικά, αλλά ξέρω πώς να τα χειρίζομαι με ασφάλεια. Αν είστε βέβαιοι ότι οι χρήστες σας γνωρίζουν το ίδιο, μπορείτε να χρησιμοποιείτε μόνιμα logins με καθαρή συνείδηση. Αν όχι - λοιπόν, τότε μπορείτε να υιοθετήσετε τη φιλοσοφία ότι οι χρήστες που είναι απρόσεκτοι με τα διαπιστευτήρια σύνδεσής τους το έφεραν πάνω τους αν τους παραβιάσουν. Δεν είναι σαν να πηγαίνουμε στα σπίτια των χρηστών μας και να ξεριζώνουμε όλα αυτά τα Post-It σημειώματα με τους κωδικούς πρόσβασης που έχουν τοποθετήσει στην άκρη των οθονών τους. Φυσικά, ορισμένα συστήματα δεν έχουν την πολυτέλεια να χακάρουν οποιουσδήποτε λογαριασμούς- για τέτοια συστήματα, δεν υπάρχει κανένας τρόπος να δικαιολογήσετε την ύπαρξη μόνιμων συνδέσεων. Αν αποφασίσετε να εφαρμόσετε μόνιμα cookies σύνδεσης, να πώς θα το κάνετε:
Μην εφαρμόζετε 'μυστικές ερωτήσεις'. Το χαρακτηριστικό 'μυστικές ερωτήσεις' είναι ένα αντι-πρότυπο ασφάλειας. Διαβάστε το έγγραφο από τον σύνδεσμο νούμερο 4 της λίστας MUST-READ. Μπορείτε να ρωτήσετε τη Σάρα Πέιλιν γι' αυτό, αφού ο λογαριασμός ηλεκτρονικού ταχυδρομείου της Yahoo! παραβιάστηκε κατά τη διάρκεια μιας προηγούμενης προεδρικής εκστρατείας επειδή η απάντηση στην ερώτηση ασφαλείας της ήταν... "Wasilla High School"! Ακόμη και με ερωτήσεις που καθορίζονται από τον χρήστη, είναι πολύ πιθανό οι περισσότεροι χρήστες να επιλέξουν ένα από τα δύο:
Έχω ήδη αναφέρει γιατί δεν πρέπει ποτέ να χρησιμοποιείτε ερωτήσεις ασφαλείας για τη διαχείριση ξεχασμένων/χαμένων κωδικών πρόσβασης χρηστών- είναι επίσης αυτονόητο ότι δεν πρέπει ποτέ να στέλνετε στους χρήστες τους πραγματικούς κωδικούς πρόσβασης με e-mail. Υπάρχουν τουλάχιστον δύο ακόμη πολύ συνηθισμένες παγίδες που πρέπει να αποφύγετε σε αυτόν τον τομέα:
Αρχικά, θα'θελήσετε να διαβάσετε αυτό το μικρό άρθρο για έναν έλεγχο της πραγματικότητας: Οι 500 πιο συνηθισμένοι κωδικοί πρόσβασης Εντάξει, ίσως η λίστα να μην είναι'η κανονική λίστα με τους πιο συνηθισμένους κωδικούς πρόσβασης σε οποιοδήποτε σύστημα οπουδήποτε ποτέ, αλλά είναι'μια καλή ένδειξη για το πόσο κακώς επιλέγουν οι άνθρωποι τους κωδικούς πρόσβασης όταν δεν υπάρχει επιβαλλόμενη πολιτική. Επιπλέον, η λίστα φαίνεται τρομακτικά κοντά στο σπίτι σας όταν τη συγκρίνετε με τις δημόσια διαθέσιμες αναλύσεις των πρόσφατα κλεμμένων κωδικών πρόσβασης. Έτσι: Χωρίς ελάχιστες απαιτήσεις για την ισχύ του κωδικού πρόσβασης, το 2% των χρηστών χρησιμοποιεί έναν από τους 20 πιο συνηθισμένους κωδικούς πρόσβασης. Που σημαίνει: Αν ένας εισβολέας έχει μόλις 20 προσπάθειες, 1 στους 50 λογαριασμούς στον ιστότοπό σας θα είναι δυνατό να σπάσει. Για την ανατροπή αυτού του γεγονότος απαιτείται ο υπολογισμός της εντροπίας ενός κωδικού πρόσβασης και στη συνέχεια η εφαρμογή ενός κατωφλίου. Το Εθνικό Ινστιτούτο Προτύπων και Τεχνολογίας (NIST) Special Publication 800-63 έχει μια σειρά από πολύ καλές προτάσεις. Αυτό, όταν συνδυάζεται με ανάλυση λεξικού και διάταξης πληκτρολογίου (για παράδειγμα, το 'qwertyuiop' είναι κακός κωδικός πρόσβασης), μπορεί να απορρίψει το 99% όλων των κακώς επιλεγμένων κωδικών πρόσβασης σε επίπεδο 18 bit εντροπίας. Ο απλός υπολογισμός της ισχύος του κωδικού πρόσβασης και η επίδειξη ενός οπτικού μετρητή ισχύος στον χρήστη είναι καλή, αλλά ανεπαρκής. Αν δεν επιβληθεί, πολλοί χρήστες πιθανότατα θα το αγνοήσουν. Και για μια αναζωογονητική άποψη σχετικά με τη φιλικότητα προς τον χρήστη των κωδικών πρόσβασης υψηλής εντροπίας, συνιστάται ανεπιφύλακτα το Password Strength xkcd του Randall Munroe's. Χρησιμοποιήστε το Have I Been Pwned API του Troy Hunt's για να ελέγξετε τους κωδικούς πρόσβασης των χρηστών σε σχέση με τους κωδικούς πρόσβασης που έχουν παραβιαστεί σε δημόσιες παραβιάσεις δεδομένων.
Πρώτον, ρίξτε μια ματιά στους αριθμούς: Password Recovery Speeds - How long will your password stand up Αν δεν έχετε το χρόνο να κοιτάξετε τους πίνακες σε αυτόν τον σύνδεσμο, εδώ'είναι η λίστα τους:
ως κανόνας, ωστόσο, θα έλεγα: όσο πιο αυστηρή είναι η πολιτική κωδικών πρόσβασης, τόσο λιγότερο πρέπει να ενοχλείτε τους χρήστες με καθυστερήσεις. Εάν απαιτείτε ισχυρούς (αλφαριθμητικά με ευαισθησία στην πεζότητα + απαιτούμενοι αριθμοί και σύμβολα) κωδικούς πρόσβασης 9+ χαρακτήρων, θα μπορούσατε να δώσετε στους χρήστες 2-4 προσπάθειες κωδικού πρόσβασης χωρίς καθυστέρηση πριν ενεργοποιήσετε το throttling. Η επίθεση DoS σε αυτό το τελικό σύστημα στραγγαλισμού σύνδεσης θα ήταν πολύ ανέφικτη. Και ως τελική πινελιά, επιτρέπετε πάντα τη διέλευση μόνιμων (cookie) συνδέσεων (ή/και μιας μορφής σύνδεσης με CAPTCHA), ώστε οι νόμιμοι χρήστες να μην καθυστερούν καν ενώ η επίθεση βρίσκεται σε εξέλιξη. Με αυτόν τον τρόπο, η πολύ ανέφικτη επίθεση DoS γίνεται μια εξαιρετικά ανέφικτη επίθεση. Επιπλέον, είναι λογικό να κάνουμε πιο επιθετικό throttling στους λογαριασμούς διαχειριστών, αφού αυτοί είναι τα πιο ελκυστικά σημεία εισόδου.
ΜΕΡΟΣ VII: Κατανεμημένες επιθέσεις ωμής βίας
Παρεμπιπτόντως, οι πιο προχωρημένοι επιτιθέμενοι θα προσπαθήσουν να παρακάμψουν τον περιορισμό σύνδεσης με 'την εξάπλωση των δραστηριοτήτων τους':
Τα διαπιστευτήρια μπορούν να παραβιαστούν, είτε από exploits, είτε από κωδικούς πρόσβασης που έχουν καταγραφεί και χαθεί, είτε από φορητούς υπολογιστές με κλειδιά που έχουν κλαπεί, είτε από χρήστες που εισάγουν συνδέσεις σε ιστότοπους phishing. Οι συνδέσεις μπορούν να προστατευθούν περαιτέρω με τον έλεγχο ταυτότητας δύο παραγόντων, ο οποίος χρησιμοποιεί παράγοντες εκτός ζώνης, όπως κωδικούς μίας χρήσης που λαμβάνονται από μια τηλεφωνική κλήση, ένα μήνυμα SMS, μια εφαρμογή ή ένα dongle. Αρκετοί πάροχοι προσφέρουν υπηρεσίες ελέγχου ταυτότητας δύο παραγόντων. Ο έλεγχος ταυτότητας μπορεί να ανατεθεί πλήρως σε μια υπηρεσία ενιαίας σύνδεσης, όπου ένας άλλος πάροχος χειρίζεται τη συλλογή διαπιστευτηρίων. Αυτό μεταθέτει το πρόβλημα σε ένα αξιόπιστο τρίτο μέρος. Τόσο η Google όσο και το Twitter παρέχουν υπηρεσίες SSO βασισμένες σε πρότυπα, ενώ το Facebook παρέχει μια παρόμοια ιδιόκτητη λύση.
Ο μόνος πρακτικός τρόπος για την 100% ασφαλή αποστολή διαπιστευτηρίων είναι η χρήση SSL. Η χρήση JavaScript για την κατακερματισμό του κωδικού πρόσβασης δεν είναι ασφαλής. Συνήθεις παγίδες για τον κατακερματισμό κωδικού πρόσβασης από την πλευρά του πελάτη:
Μην αποθηκεύετε ποτέ τους κωδικούς πρόσβασης ως απλό κείμενο στη βάση δεδομένων. Ούτε καν αν δεν σας ενδιαφέρει η ασφάλεια του δικού σας ιστότοπου. Υποθέστε ότι κάποιοι από τους χρήστες σας θα επαναχρησιμοποιήσουν τον κωδικό πρόσβασης του online τραπεζικού τους λογαριασμού. Έτσι, αποθηκεύστε τον κατακερματισμένο κωδικό πρόσβασης και πετάξτε τον αρχικό. Και βεβαιωθείτε ότι ο κωδικός πρόσβασης δεν εμφανίζεται στα αρχεία καταγραφής πρόσβασης ή στα αρχεία καταγραφής εφαρμογών. Το OWASP συνιστά τη χρήση του Argon2 ως πρώτη επιλογή για νέες εφαρμογές. Εάν αυτό δεν είναι διαθέσιμο, θα πρέπει να χρησιμοποιείται αντ' αυτού το PBKDF2 ή το scrypt. Και τέλος, αν κανένα από τα παραπάνω δεν είναι διαθέσιμο, χρησιμοποιήστε το bcrypt. Οι κατακερματισμοί από μόνοι τους είναι επίσης ανασφαλείς. Για παράδειγμα, πανομοιότυποι κωδικοί πρόσβασης σημαίνουν πανομοιότυπους κατακερματισμούς - αυτό καθιστά τους πίνακες αναζήτησης κατακερματισμών έναν αποτελεσματικό τρόπο για την ταυτόχρονη παραβίαση πολλών κωδικών πρόσβασης. Αντ' αυτού, αποθηκεύστε τον αλατισμένο κατακερματισμό. Το salt είναι μια συμβολοσειρά που προστίθεται στον κωδικό πρόσβασης πριν από τον κατακερματισμό - χρησιμοποιήστε διαφορετικό (τυχαίο) salt ανά χρήστη. Το salt είναι μια δημόσια τιμή, οπότε μπορείτε να το αποθηκεύσετε μαζί με το hash στη βάση δεδομένων. Δείτε εδώ για περισσότερες πληροφορίες σχετικά με αυτό. Αυτό σημαίνει ότι δεν μπορείτε'να στείλετε στους χρήστες τους ξεχασμένους κωδικούς τους (επειδή έχετε μόνο το hash). Μην επαναφέρετε τον κωδικό πρόσβασης του χρήστη'αν δεν έχετε πιστοποιήσει τον χρήστη (οι χρήστες πρέπει να αποδείξουν ότι είναι σε θέση να διαβάζουν τα μηνύματα ηλεκτρονικού ταχυδρομείου που αποστέλλονται στην αποθηκευμένη (και επικυρωμένη) διεύθυνση ηλεκτρονικού ταχυδρομείου).
Οι ερωτήσεις ασφαλείας είναι ανασφαλείς - αποφύγετε τη χρήση τους. Γιατί; Οτιδήποτε κάνει μια ερώτηση ασφαλείας, το κάνει καλύτερα ένας κωδικός πρόσβασης. Διαβάστε το PART III: Χρήση μυστικών ερωτήσεων στην απάντηση του @Jens Roland εδώ σε αυτό το wiki.
Αφού συνδεθεί ο χρήστης, ο διακομιστής στέλνει στο χρήστη ένα cookie συνεδρίας. Ο διακομιστής μπορεί να ανακτήσει το όνομα χρήστη ή το id από το cookie, αλλά κανείς άλλος δεν μπορεί να δημιουργήσει ένα τέτοιο cookie (TODO εξήγηση μηχανισμών). Τα cookies μπορούν να υποκλαπούν: είναι τόσο ασφαλή όσο το υπόλοιπο μηχάνημα του πελάτη και οι άλλες επικοινωνίες. Μπορούν να διαβαστούν από το δίσκο, να ανιχνευθούν στην κυκλοφορία του δικτύου, να αφαιρεθούν από μια επίθεση cross-site scripting, να διαρρηχθούν από ένα δηλητηριασμένο DNS, ώστε ο πελάτης να στέλνει τα cookies του σε λάθος διακομιστές. Μην στέλνετε μόνιμα cookies. Τα cookies θα πρέπει να λήγουν στο τέλος της συνεδρίας του πελάτη (κλείσιμο του προγράμματος περιήγησης ή αποχώρηση από τον τομέα σας). Εάν θέλετε να κάνετε autologin στους χρήστες σας, μπορείτε να ορίσετε ένα μόνιμο cookie, αλλά θα πρέπει να διαφέρει από ένα cookie πλήρους συνεδρίας. Μπορείτε να ορίσετε μια πρόσθετη σημαία ότι ο χρήστης έχει συνδεθεί αυτόματα και ότι πρέπει να συνδεθεί πραγματικά για ευαίσθητες λειτουργίες. Αυτό είναι δημοφιλές στους ιστότοπους αγορών που θέλουν να σας παρέχουν μια απρόσκοπτη, εξατομικευμένη εμπειρία αγορών, αλλά εξακολουθούν να προστατεύουν τα οικονομικά σας στοιχεία. Για παράδειγμα, όταν επιστρέφετε για να επισκεφθείτε το Amazon, σας εμφανίζει μια σελίδα που μοιάζει σαν να έχετε συνδεθεί, αλλά όταν πηγαίνετε να κάνετε μια παραγγελία (ή να αλλάξετε τη διεύθυνση αποστολής, την πιστωτική σας κάρτα κ.λπ.), σας ζητούν να επιβεβαιώσετε τον κωδικό πρόσβασής σας. Από την άλλη πλευρά, οι οικονομικοί ιστότοποι, όπως οι τράπεζες και οι πιστωτικές κάρτες, έχουν μόνο ευαίσθητα δεδομένα και δεν θα πρέπει να επιτρέπουν την αυτόματη είσοδο ή μια λειτουργία χαμηλής ασφάλειας.
Πρώτον, μια ισχυρή προειδοποίηση ότι αυτή η απάντηση δεν είναι η καλύτερη δυνατή για αυτή ακριβώς την ερώτηση. Σίγουρα δεν πρέπει να είναι η κορυφαία απάντηση!
Θα προχωρήσω και θα αναφέρω το προτεινόμενο BrowserID της Mozilla (ή ίσως ακριβέστερα, το Verified Email Protocol) στο πνεύμα της εύρεσης ενός μονοπατιού αναβάθμισης προς καλύτερες προσεγγίσεις για τον έλεγχο ταυτότητας στο μέλλον.
Θα το συνοψίσω ως εξής:
@
domain" είναι συνοπτική και υποστηρίζεται από ένα ευρύ φάσμα πρωτοκόλλων και σχημάτων URI. Ένα τέτοιο αναγνωριστικό είναι, βέβαια, το πιο παγκοσμίως αναγνωρισμένο ως διεύθυνση ηλεκτρονικού ταχυδρομείου.Αυτό δεν είναι αυστηρά "έλεγχος ταυτότητας βάσει φόρμας για ιστότοπους". Είναι όμως μια προσπάθεια μετάβασης από τον τρέχοντα κανόνα του ελέγχου ταυτότητας βάσει φόρμας σε κάτι πιο ασφαλές: έλεγχος ταυτότητας με υποστήριξη από το πρόγραμμα περιήγησης.