Ασφαλής αποθήκευση κωδικών - Black d@ck

Ασφάλεια Διαδικτυακών Εφαρμογών
Ασφαλής αποθήκευση κωδικών
Γιώργος Χατζησωφρονίου
12/11/2012
Πανεπιστήμιο Πειραιώς
Τμήμα Πληροφορικής
Στόχοι παρουσίασης
●
●
Εξερεύνηση των προβλήματων στην αποθήκευση
κωδικών.
Παρουσίαση γνωστών τεχνικών επίθεσης κωδικών.
●
●
●
●
●
Brute Force
Dictionary attacks
Lookup tables
Όλα μέσα από παραδείγματα
Παρουσίαση και κατανόηση των βασικών πρακτικών
ασφαλείας κωδικών.
●
●
●
Κρυπτογραφικές συναρτήσεις κατακερματισμού (hash functions)
Αλατισμένοι κωδικοί
HMAC
Ασφάλεια Web Εφαρμογών - Ασφαλής αποθήκευση κωδικών
●
●
Θα θεωρήσουμε ότι έχουμε να κάνουμε με
διαδικτυακές εφαρμογές που έχουν χρήστες και
κατά συνέπεια κωδικούς.
Παράδειγμα βάσης δεδομένων χρηστών:
Username
RigasTK
twin3
psilos
stathis
Password
1481991
fosb44
l0v3m1x
gunsnroses
Birth
14/8/1991
13/7/1988
18/2/1990
25/7/1991
Ασφάλεια Web Εφαρμογών - Ασφαλής αποθήκευση κωδικών
....
...
...
...
...
Η εφαρμογή μου είναι απαραβίαστη!
Κανείς δεν έχει πρόσβαση στη βάση δεδομένων
για να διαρεύσουν οι κωδικοί των χρηστών μου.
Οι κωδικοί των χρηστών σου είναι...
σε απλό κείμενο;
Ασφάλεια Web Εφαρμογών - Ασφαλής αποθήκευση κωδικών
Κρυπτογραφικές Συναρτήσεις Κατακερματισμού
●
●
●
Συναρτήσεις που μετατρέπουν ένα αλφαριθμητικό (plain
text) σε ένα σταθερού μεγέθους “αποτύπωμα” (hash) που
δεν μπορεί να αντιστραφεί εύκολα.
Αν η είσοδος αλλάξει έστω και λίγο, το hash που θα
παραχθεί θα είναι τελείως διαφορετικό.
Μας επιτρέπουν να αποθηκεύουμε με ασφάλεια κωδικούς
αλλά ταυτόχρονα μπορούμε να εξακριβώσουμε ότι ο
κωδικός που εισάγει ένας χρήστης είναι αληθής.
pass1234
Κρυπτογραφική
Συνάρτηση
Κατατεμαχισμού
Ασφάλεια Web Εφαρμογών - Ασφαλής αποθήκευση κωδικών
b4af804009cb036a4ccdc33431ef9ac9
Υλοποίηση ενός hash-based συστήματος
●
Την ώρα της εγγραφής (registration):
hash(password) και
αποθήκευση στη
password σε απλό κείμενο
Server
●
Database
Την ώρα της αυθεντικοποίησης (login):
hash(password) και
σύγκριση με αυτό στη
password σε απλό κείμενο
Server
Ασφάλεια Web Εφαρμογών - Ασφαλής αποθήκευση κωδικών
Database
Υλοποίηση ενός hash-based συστήματος
●
Στη βάση δεδομένων δεν υπάρχουν οι κωδικοί.
●
Υπάρχουν μόνο τα hashes.
Username
RigasTK
twin3
psilos
stathis
Password
1481991
fosb44
l0v3m1x
gunsnroses
Username
RigasTK
twin3
psilos
stathis
Ασφάλεια Web Εφαρμογών - Ασφαλής αποθήκευση κωδικών
Password
4fe420822903f560cd81d
1b0431848ad2dbcb0f
943a99bb5743912e95b4
123a943312f95c9
Ωραία. Πλέον δεν έχω κωδικούς σε καθαρό κείμενο
στο σύστημά μου. Ακόμη και αν ο επιτιθέμενος
αποκτήσει πρόσβαση, θα ανακτήσει τα hashes και
όχι τους κωδικούς.
Είσαι σίγουρος;
Χρησιμοποίησες md5...
Ασφάλεια Web Εφαρμογών - Ασφαλής αποθήκευση κωδικών
MD5
●
●
Ευρείως διαδεδομένη συνάρτηση
κατακερματισμού.
Πρέπει να αποφεύγεται.
●
●
Υπάρχουν πολύ καλύτερες που προτείνονται να χρησιμοποιηθούν.
Σπάσιμο md5
●
●
Έστω το hash 21232f297a57a5a743894a0e4a801fc3
Από ποιο αλφαριθμητικό προέκυψε;
Ασφάλεια Web Εφαρμογών - Ασφαλής αποθήκευση κωδικών
Επίθεση Brute Force
●
Έλεγχος όλων των πιθανών αλφαριθμητικών:
Md5('a') = 0cc175b9c0f1b6a831c399e269772661
Md5('b') = 92eb5ffee6ae2fec3ad71c777531578f
…
Md5('aa') = 4124bc0a9335c27f086f24ba207a4912
Md5('ab') = 187ef4436122d1cc2f40dc2b92f0eba0
…
●
Εύκολο να σπάσουν κωδικοί με λίγους χαρακτήρες.
Για μεγαλύτερα αλφαριθμητικά χρειάζεται μεγάλη εώς
τεράστια υπολογιστική ισχύ.
●
●
Έχει σίγουρο αποτέλεσμα.
●
●
Σίγουρα κάποια στιγμή θα βρεθεί ο ζητούμενος κωδικός.
(Παράδειγμα)
Ασφάλεια Web Εφαρμογών - Ασφαλής αποθήκευση κωδικών
Επίθεση Λεξικού
Εξετάζουμε συστηματικά τα hashes από ένα αρχείο (λεξικό)
που περιέχει λέξεις, φράσεις, κοινούς κωδικούς,
συνδυασμούς και άλλα αλφαριθμητικά.
●
Md5('accent') = 727b79a9a430ccddcf9260a381d5ab10
Md5('apple') = 1f3870be274f6c49b3e31a0c6728957f
…
Md5('apple1234') = 903010ac03abcc015f3f5227a392bd91
...
●
To λεξικό ανακτεί αλφαριθμητικά από πολλές πηγές:
●
●
●
●
●
Εξάγοντας λέξεις από τεράστια κειμένα
Από κωδικούς που έχουν διαρρεύσει
Αντικατάσταση λέξεων σε leet speak (hello σε h3110)
Ευκολό να σπάσουν απλές λέξεις και συνδυασμοί.
(Παράδειγμα)
Ασφάλεια Web Εφαρμογών - Ασφαλής αποθήκευση κωδικών
Αργές Συναρτήσεις Κατακερματισμού
H brute force και η dictionary attack έχουν νόημα
μόνο επειδή η md5 παράγει γρήγορα hashes.
●
●
●
Ένα αλφαριθμητικό 6 χαρακτήρων σπάει σε περίπου 40 δευτερόλεπτα.
Τί θα γίνει εάν χρησιμοποιήσω μια πιο αργή
συνάρτηση;
●
●
Η ταυτοποίηση του χρήστη θα καθυστερεί λίγο παραπάνω.
Η brute force και η dictionary attack θα παίρνουν πολύ περισσότερη ώρα.
Ασφάλεια Web Εφαρμογών - Ασφαλής αποθήκευση κωδικών
Αργές Συναρτήσεις Κατακερματισμού
Κάνουν την παραγωγή του hash πολύ αργή έτσι ώστε η
επίθεση Brute Force και η επίθεση λεξικού να είναι πολύ
αργές για να αξίζουν τον κόπο.
●
●
Η bcrypt και η PBKDF2 είναι εξαιρετικές επιλογές.
●
●
Περιέχουν έναν παράγοντα εργασίας που μπορεί να αυξηθεί και να
μεγαλώσει το χρόνο παραγωγής του hash.
Έλεγχος σε ένα μήχανημα με GPU 625 MHz:
●
●
●
●
Κρυπτογραφούμε το αλφαριθμητικό “hello”
Ορίζοντας τον work factor στο 12, η bcrypt κάνει 0,3 δευτερόλεπτα
Η md5 κάνει λιγότερο από ένα μικροδευτερόλεπτο
Αντί να σπάσω με brute force ένα εξαψήφιο αλφαριθμητικό σε 40 δευτερόλεπτα, θα
χρειαστώ τουλάχιστον... 12 χρόνια!
Ασφάλεια Web Εφαρμογών - Ασφαλής αποθήκευση κωδικών
Αντικατέστησα την md5 με την bcrypt για να υπολογίζω
τα hashes στην εφαρμογή μου. Τώρα τα hashes μου
ανατρέπονται δύσκολα και οι κωδικοί είναι ασφαλής.
Εεεεεμμμ... Τα hashes σου είναι
ανάλατα;
Ασφάλεια Web Εφαρμογών - Ασφαλής αποθήκευση κωδικών
Πίνακες Αναζήτησης
Αναζήτηση σε διαδικτυακές βάσεις δεδομένων στις οποίες
έχουν αποθηκεύτει τεράστιες λίστες πιθανών κωδικών
μαζί με τα αντίστοιχα md5 hashes τους.
●
●
●
●
●
Ο λιγότερο βάναυσος τρόπος.
●
●
Lookup tables: Προυπολογισμένα hashes με τους αντίστοιχους κωδικούς
Reverse Lookup tables: Αντιστοιχίες hashes με ονόματα χρηστών.
Rainbow tables: Σαν τα lookup tables με τη διαφορά ότι θυσιάζουν ταχύτητα για κάνουν τα
tables μικρότερα.
Δεν υπολογίζουμε κανένα hash.
(Παράδειγμα)
Ασφάλεια Web Εφαρμογών - Ασφαλής αποθήκευση κωδικών
Password
Hash
mypass91
4fe420822903f560cd81
fos1234
1b0431848ad2dbcb0f
c0n4nn
123a943312f95c9
….
….
Salted Passwords
Οι πίνακες αναζήτησης δουλεύουν επειδή κάθε κωδικός
αντιστοιχεί στο ίδιο hash
●
●
●
Δύο χρήστες με ίδιο κωδικό, έχουν το ίδιο hash.
Ιδέα
●
Μπορούμε να τυχαιοποιήσουμε τα hashes προσθέτοντας ένα string (salt) στον
κωδικό πριν καλέσω την Κρυπτογραφική Συνάρτηση Κατατεμαχισμού.
Ασφάλεια Web Εφαρμογών - Ασφαλής αποθήκευση κωδικών
Salted Passwords
●
Παράδειγμα αλατισμένων κωδικών
hash("hello") = 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824
hash("hello" + "QxLUF1bgIAdeQX") = 9e209040c863f84a31e719795b2577523954739fe5ed3b58a75cff2127075ed1
hash("hello" + "bv5PehSMfV11Cd") = d1d3ec2e6f20fd420d50e2642992841d8338a314b8ea157c9e18477aaef226ab
●
Δημιουργείτε ένα τελείως διαφορετικό hash κάθε φορά
●
Ο επιτιθέμενος δεν γνωρίζει ποιο είναι το αλάτι και θα μπορεί να
δημιουργηθεί lookup ή rainbow table γι' αυτό το σκοπό.
Username
Password
RigasTK
4fe420822903f560cd81d
twin3
1b0431848ad2dbcb0f
zyloGR
943a99bb5743912e95b4
Username
RigasTK
twin3
zyloGR
Ασφάλεια Web Εφαρμογών - Ασφαλής αποθήκευση κωδικών
Salt
Password
xLUF1
f560cd8104318
bgIAde
3312f90431848a
SMfV11
e42082248ad2db
HMAC
●
Το τελευταίο βήμα για να ασφαλίσουμε τους κωδικούς μας.
●
Προσθέτουμε ένα μυστικό κλειδί στο hash
●
●
●
Το κλειδί πρέπει να κρατείτε ασφαλές.
●
●
●
Μόνο κάποιος που ξέρει το κλειδί μπορεί να εξακριβώσει έναν κωδικό.
Ο επιτιθέμενος θα χρειαστεί και το κλειδί για να σπάσει τον κωδικό.
Σε κάποιον εξωτερικό server
Να έχει ημερομηνία λήξης
Ανατρέπουμε ολοκληρωτικά brute force και dictionary
attacks.
Ασφάλεια Web Εφαρμογών - Ασφαλής αποθήκευση κωδικών
HMAC
●
●
H HMAC είναι το αποτέλεσμα μίας
κρυπτογραφικής συνάρτησης κατακερματισμού με
ένα μυστικό κλειδί.
Οποιαδήποτε hash function μπορεί να
χρησιμοποιηθεί για τον υπολογισμό ενός HMAC.
Key
pass1234
HMAC-MD5
Ασφάλεια Web Εφαρμογών - Ασφαλής αποθήκευση κωδικών
b4af804009cb036a4ccdc33431ef9ac9
Συνοψίζοντας...
✔
✔
✔
✔
Αποφεύγουμε την MD5.
Αποφεύγουμε γρήγορες συναρτήσεις. Αντί για αυτές
χρησιμοποιούμε την bcrypt ή την PBKDF2
Αλατίζουμε τους κωδικούς πριν τους αποθηκεύσουμε.
Χρησιμοποιούμε το HMAC με κλειδιά έξω από τη βάση
δεδομένων.
Ασφάλεια Web Εφαρμογών - Ασφαλής αποθήκευση κωδικών
Τώρα οι κωδικοί μου είναι επιτέλους
καλά προστατευμένοι!
Ερωτήσεις;
Ασφάλεια Web Εφαρμογών - Ασφαλής αποθήκευση κωδικών