Ασφάλεια κωδικού πρόσβασης
Ένας επιτιθέμενος που προσπαθεί να μπει σε μια εφαρμογή προστατευμένη με κωδικό (ένα κρυπτογραφημένο RAR, ένα email…) έχει αρκετές δυνατότητες να φτάσει στο αποτέλεσμα χωρίς να ξέρει τον κωδικό. Κάποιες απαιτούν μια δόση εξυπνάδας, ευρηματικότητας και γνώσεων, άλλες χρειάζονται λίγη τύχη και σωματική προετοιμασία. Ας συνοψίσουμε λοιπόν πρώτα ποιες δυνατότητες έχει ο επιτιθέμενος.
Πώς να σπάσεις τον κωδικό κάποιου
- Να βρεις αυτόν που ξέρει τον κωδικό (τον ιδιοκτήτη του email, για παράδειγμα) και να τον πάρεις από αυτόν – να τον πείσεις με ωραία λόγια, να τον δωροδοκήσεις, να τον ξυλοφορτώσεις. Αυτόν τον τρόπο δεν θα τον περιγράψω παρακάτω στο άρθρο :-).
- Να προσπαθήσεις να αποσπάσεις τον κωδικό από τον ιδιοκτήτη με κάποιον διακριτικό τρόπο, για παράδειγμα με ένα ψεύτικο mail, που με τον ειδικό όρο λέγεται phishing, στα ελληνικά «ηλεκτρονικό ψάρεμα». Η μέθοδος συνίσταται στο να στείλεις στον ιδιοκτήτη του λογαριασμού ένα email, όπου τον καλείς να σου στείλει πίσω το όνομα χρήστη και τον κωδικό του. Εξαρτάται μόνο από σένα πόσο αξιόπιστο θα φαίνεται το μήνυμα, γιατί το ίδιο το αίτημα μάλλον δεν θα αρκούσε, χρειάζεται να προσθέσεις και κάποια ιστορία. Συχνά συναντάμε την ιστορία ότι χάλασε η βάση δεδομένων και γι' αυτό καλούμε όλους τους χρήστες να δώσουν ξανά τον κωδικό και το όνομά τους, αλλιώς θα διαγράψουμε το γραμματοκιβώτιό τους κ.λπ. Αν το μήνυμα φαίνεται πραγματικά σοβαρό, το ποσοστό επιτυχίας δεν είναι συνήθως μικρό.
- Επίθεση λεξικού – κατεβάζουμε από το διαδίκτυο κάποια πακέτα με τους πιο συνηθισμένους κωδικούς και τους δοκιμάζουμε όλους. Αν έχουμε τύχη και ο ιδιοκτήτης έχει κάποιον πιο συχνό κωδικό, πράγματι τον βρίσκουμε εύκολα. Από αυτό προκύπτει το βασικό δίδαγμα – μην βάζεις κωδικούς που έχουν νόημα. Βάλε για παράδειγμα τον κωδικό agapi και σου εγγυώμαι ότι ο πρώτος τυχαίος πειρατής θα στον σπάσει σε λίγα δευτερόλεπτα. Αυτή είναι ίσως η πιο αποτελεσματική μέθοδος, αν έχεις πραγματικά μεγάλο λεξικό κωδικών, είσαι σε θέση να μαντέψεις τον κωδικό ενός μεγάλου μέρους των χρηστών χωρίς ιδιαίτερο κόπο.
- Η επίθεση ωμής βίας (brute force) είναι η πιο χοντροκομμένη μέθοδος. Συνίσταται στη δοκιμή όλων των δυνατών συνδυασμών κωδικών που υπάρχουν στον κόσμο. Το πρόγραμμα συνθέτει διαδοχικά γράμματα με βάση έναν ορισμένο αλγόριθμο και δοκιμάζει αν πέτυχε τον ζητούμενο κωδικό. Μόλις τον βρει, τον αποθηκεύει και τελειώνει. Αυτή τη μέθοδο θα την εξετάσουμε στη συνέχεια.
Ωμή βία
Ένα πρόγραμμα που χρησιμοποιεί αυτή τη μέθοδο απλώς δημιουργεί διάφορες διατάξεις λέξεων και δοκιμάζει αν τυχαίνει να πέτυχε τον κωδικό. Ας υπολογίσουμε πόσο μπορεί να κρατήσει μια τέτοια δοκιμή.
Ας υποθέσουμε ότι έχουμε έναν κωδικό με πέντε χαρακτήρες, που αποτελείται μόνο από μικρά γράμματα του αγγλικού αλφαβήτου (χωρίς ελληνικά γράμματα). Το πλήθος των γραμμάτων του αγγλικού αλφαβήτου είναι είκοσι έξι. Τώρα μπορούμε απλά να υπολογίσουμε πόσους διαφορετικούς κωδικούς μπορούμε να φτιάξουμε από πέντε τέτοια γράμματα. Θα χρησιμοποιήσουμε διατάξεις, αφού μας ενδιαφέρει η σειρά (ο κωδικός ilios δεν είναι ίδιος με τον sioli, παρότι αποτελούνται από τα ίδια γράμματα) και επιπλέον πρέπει να χρησιμοποιήσουμε διατάξεις με επαναλήψεις, επειδή τα γράμματα μπορούν να επαναλαμβάνονται στους κωδικούς. Και πάμε στον ίδιο τον υπολογισμό. Ο τύπος για τις διατάξεις με επαναλήψεις είναι νκ. Στη θέση του ν βάζουμε το πλήθος των γραμμάτων από τα οποία θα επιλέγουμε – το πλήθος των γραμμάτων του αγγλικού αλφαβήτου – και στη θέση του κ βάζουμε το πλήθος των γραμμάτων από τα οποία αποτελείται ο κωδικός, στην περίπτωσή μας πέντε. Μας βγαίνει 265, που είναι περίπου δώδεκα εκατομμύρια διαφορετικές διατάξεις. Είναι πολλά ή λίγα;
Αυτό εξαρτάται και από το μηχάνημα που έχουμε στη διάθεσή μας. Κάποιο παλιό σαράβαλο προλαβαίνει μέσα σε ένα δευτερόλεπτο λίγες συγκρίσεις, οι υπερσύγχρονοι υπολογιστές προλαβαίνουν δέκα χιλιάδες φορές περισσότερες. Εγώ σε αυτά τα παραδείγματα θα δουλέψω με την παραδοχή ότι ο υπολογιστής προλαβαίνει δέκα εκατομμύρια συγκρίσεις και αξιολογήσεις το δευτερόλεπτο. Ήδη θα καταλαβαίνει ο καθένας ότι έναν κωδικό πέντε χαρακτήρων ένας τέτοιος υπολογιστής θα τον ανακάλυπτε σε λιγότερο από δύο δευτερόλεπτα, κάτι που πραγματικά δεν είναι θετικό αποτέλεσμα. Αλλά ας μην τα παρατάμε.
Ενισχύουμε τον κωδικό
Ένας κωδικός πέντε χαρακτήρων πραγματικά δεν είναι ασφαλής ούτε στο ελάχιστο, κάποια πιο λογικά συστήματα δεν επιτρέπουν να διαλέξεις ούτε τόσο κοντό κωδικό. Λέγεται ότι ο κωδικός δεν πρέπει να είναι μικρότερος από οκτώ χαρακτήρες. Ας υπολογίσουμε τώρα πόσες διατάξεις υπάρχουν για κωδικό οκτώ χαρακτήρων. Όπως και στην προηγούμενη περίπτωση, θα θεωρήσουμε μόνο μικρά γράμματα του αγγλικού αλφαβήτου. Αντικαθιστούμε στον τύπο και μας βγαίνει 268, που είναι περίπου διακόσια δισεκατομμύρια διατάξεις. Αυτό είναι πιο ωραίος αριθμός. Ο υπολογιστής θα αξιολογούσε όλες τις διατάξεις σε λιγότερο από έξι ώρες. Είναι καλύτερα από πριν, αλλά ας δούμε πώς θα αυξανόταν η ισχύς του κωδικού, αν χρησιμοποιούσες και κεφαλαία γράμματα, ψηφία και ειδικούς χαρακτήρες όπως η κάτω παύλα, η παύλα κ.λπ.
Τα μικρά γράμματα είναι 26, τα κεφαλαία είναι επίσης 26, που δίνει συνολικά 52 χαρακτήρες. Σε αυτούς πρέπει να προσθέσουμε 10 ψηφία και κάποιους ειδικούς χαρακτήρες. Δεν επιτρέπονται παντού όλοι οι ειδικοί χαρακτήρες, γι' αυτό για απλότητα θα υπολογίσω μόνο με οκτώ ειδικούς χαρακτήρες, ώστε το πλήθος των χαρακτήρων να στρογγυλοποιηθεί σε ωραία 70. Το μήκος του κωδικού θα είναι πάλι οκτώ. Μετά την αντικατάσταση βγαίνει αυτός ο αριθμός: 708, που για να έχεις μια καλύτερη εικόνα είναι περίπου 5,8 · 1014, ολογράφως σχεδόν εξακόσια τρισεκατομμύρια διατάξεις. Αυτός είναι πια αρκετά επιβλητικός αριθμός. Ο υπολογιστής μας θα έλεγχε όλες τις διατάξεις σε δεκαέξι χιλιάδες ώρες! Δηλαδή λίγο λιγότερο από δύο χρόνια. Ο επιτιθέμενος θα έπρεπε να έχει πολύ μεγάλη τύχη, για να ανακαλύψει τον κωδικό σε εύλογο χρόνο. Επιπλέον θα έπρεπε να ξέρει το μήκος του κωδικού σου, διαφορετικά, αν δεν ήξερε το μήκος, θα έπρεπε να ελέγξει επιπλέον και τις διατάξεις με μικρότερο πλήθος γραμμάτων.
Κάποιοι άνθρωποι φοβούνται τόσο πολύ για τα δεδομένα τους, που χρησιμοποιούν αριθμητικούς κωδικούς. Αυτοί οι κωδικοί αντέχουν πολύ καλά στην επίθεση λεξικού, γιατί δύσκολα θα βρίσκεται σε κάποιο λεξικό συχνά χρησιμοποιούμενων κωδικών ακριβώς ο 41274390553. Δυστυχώς τέτοιοι κωδικοί, αν και αντέχουν στην επίθεση λεξικού, αντέχουν λιγότερο στην επίθεση ωμής βίας. Τα ψηφία είναι μόνο δέκα, δηλαδή το πλήθος των διατάξεων είναι πάντα 10κ. Την ισχύ του κωδικού τη διατηρεί μόνο το μήκος του. Ο προηγούμενος κωδικός οκτώ χαρακτήρων με όλα τα είδη χαρακτήρων είχε περίπου 5,8 · 1014 διατάξεις. Για να φτάσουμε τουλάχιστον το ίδιο με αριθμητικό κωδικό, θα έπρεπε αυτός να έχει δεκαπέντε ψηφία, σχεδόν διπλάσιους χαρακτήρες. Φαίνεται καθαρά ότι είναι αποτελεσματικότερο να διαλέγεις κοντύτερο κωδικό, αλλά με περισσότερα είδη χαρακτήρων.
Μην υποτιμάς τον επιτιθέμενο
Ο επιτιθέμενος μπορεί να είναι έξυπνος. Αφού διάβασες τις προηγούμενες γραμμές, ας πούμε ότι αποφάσισες να αλλάξεις τον τωρινό σου κωδικό «lemonada» τουλάχιστον σε «Lemonada», με το οποίο αυξάνεται πολλαπλάσια το πλήθος των δυνατών διατάξεων, αφού ο επιτιθέμενος πρέπει πλέον να συμπεριλάβει στον αλγόριθμο και τα κεφαλαία γράμματα. Όμως ο επιτιθέμενος μπορεί να υποθέσει ότι το κεφαλαίο γράμμα θα είναι μόνο στην πρώτη θέση, επειδή αυτό θυμόμαστε πιο εύκολα και δεν είναι συνήθεια να υπάρχει κεφαλαίο γράμμα στη μέση της λέξης. Έτσι θα γράψει έναν αλγόριθμο που θα ελέγχει όλες τις διατάξεις λέξεων με μικρά γράμματα και ενδεχομένως με ένα κεφαλαίο γράμμα αμέσως στην αρχή.
Ο αρχικός σου κωδικός είχε πολυπλοκότητα (εννοώ πόσες συνολικά διατάξεις θα μπορούσαν να υπάρχουν, αν τηρούσαμε την ίδια μορφή κωδικού – οκτώ μικρά γράμματα) 268. Αν ο επιτιθέμενος δεν σκεφτόταν, ο νέος κωδικός θα είχε πολυπλοκότητα 528, αλλά αν χρησιμοποιούσε τον αλγόριθμο που περιγράφηκε παραπάνω, ο κωδικός θα είχε πολυπλοκότητα 52 · 267. Στην πρώτη θέση του κωδικού μπορούν να εναλλάσσονται μικρά και κεφαλαία γράμματα, αυτά είναι συνολικά 52, και στις υπόλοιπες επτά θέσεις μπορούν να εναλλάσσονται πια μόνο μικρά γράμματα, που είναι ήδη η συνηθισμένη διάταξη με επαναλήψεις.
Επιπλέον ο επιτιθέμενος μπορεί, ας πούμε, να ξέρει ότι ο κωδικός σου αποτελείται από τέσσερα γράμματα και τέσσερα ψηφία, χωρίς ανακάτεμα, πάντα τα ψηφία το ένα μετά το άλλο και τα γράμματα το ένα μετά το άλλο. Την πολυπλοκότητα ενός τέτοιου κωδικού θα την υπολογίζαμε ως εξής: η πρώτη τετράδα γραμμάτων έχει συνολικά 264 διατάξεις, η δεύτερη τετράδα ψηφίων έχει 104 διατάξεις. Αυτά τα δύο αποτελέσματα στη συνέχεια τα πολλαπλασιάζουμε: 264 · 104. Αν ο επιτιθέμενος δεν ήξερε αν πρώτα έρχονται τα ψηφία ή τα γράμματα, θα έπρεπε το προηγούμενο αποτέλεσμα να το πολλαπλασιάσουμε ακόμη επί δύο.
Μπορείς ακόμη να δεις αυτούς τους πίνακες, όπου αναγράφονται οι ταχύτητες σπασίματος κωδικών.