Υπάρχει μια κοινή παρανόηση ότι το hash και η κρυπτογράφηση είναι το ίδιο πράγμα. Δεν είναι. Ο κατακερματισμός είναι μη αναστρέψιμος. Πάρτε για παράδειγμα το ακόλουθο παράδειγμα:
$ echo -n Password123 | md5sum
42f749ade7f9e195bf475f37a44cafcb -
Περνάμε τη συμβολοσειρά "Password123" στον αλγόριθμο MD5 (algo), ο οποίος εκτελεί μαθηματικές πράξεις και επιστρέφει τον παραγόμενο δεκαεξαδικό κωδικοποιημένο κατακερματισμό. Ο μόνος τρόπος για να αποκτήσετε την ίδια τιμή εξόδου κατακερματισμού είναι να εισαγάγετε το algo αρχικά. Υπάρχουν συγκρούσεις, αλλά μπορούμε να τις συζητήσουμε αργότερα.
Οι περισσότεροι αλγόριθμοι κατακερματισμού εξάγουν μια δεκαεξαδική κωδικοποιημένη δυαδική συμβολοσειρά σταθερού μήκους. Άλλοι, όπως αυτό το παράδειγμα, χρησιμοποιούν συμβολοσειρές κωδικοποιημένες στο base64 ως έξοδο. Σημειώστε ότι το μήκος είναι πάντα το ίδιο:
{SHA} uNF8eZRJ8jmr8WTjyocRJPVpe7w=
{SHA}lqdu/Zr6o2dgIER8Up1/7lcUtgw=
{SHA}qYUOwLMlDEuukA5HCT4LR1kQzco=
{SHA}MXZBCpyWJ7TTs1w2kgGJslwNwTg=
{SHA}2sAPLaUh9Mz0bI+XxKEg7qyABe8=
TL; Dr.
Δεν θέλω να μιλήσω πολύ για την κρυπτογράφηση (γιατί αυτά τα πράγματα είναι για βιβλία), αλλά είναι σημαντικό να μπορείτε να διακρίνετε τις συμβολοσειρές κατακερματισμού από τις κρυπτογραφημένες συμβολοσειρές. Η κρυπτογράφηση συνήθως γεμίζει μια συμβολοσειρά που ικανοποιεί ένα συγκεκριμένο μήκος πριν συμβεί η κρυπτογράφηση. Απαιτεί επίσης ένα κλειδί (ή κωδικό πρόσβασης) για την αποκρυπτογράφηση. Εάν χρησιμοποιείται κρυπτογραφημένος κωδικός πρόσβασης, η συμβολοσειρά θα αλλάξει ανάλογα με το μήκος της εισαγωγής. Εάν βλέπετε ένα σωρό κωδικών πρόσβασης κρυπτοκειμένου που ποικίλλουν σε μήκος, πιθανότατα έχετε να κάνετε με κρυπτογράφηση αντί για κατακερματισμό. Παράδειγμα AES-256-CBC Κρυπτογραφημένη συμβολοσειρά και σχετικό απλό κείμενο (με κλειδί "ASDF"):
foobar | U2FsdGVkX19G+KtytNHdj6yH2AVvX26pEmtunS/PRnU= foobarfoobar | U2FsdGVkX18sPpIvN6nVh68lOUCcb3gR2fKbCCnBxog= foobarfoobarfoobar | U2FsdGVkX1/EOnUt57TCW4Rh0EdNnWX+lDatuQv2xEXXeAeowW0XG/EXJUe9aSUz $ cat κρυπτογραφημένοι_κωδικοί πρόσβασης U2FsdGVkX19G+KtytNHdj6yH2AVvX26pEmtunS/PRnU= U2FsdGVkX18sPpIvN6nVh68lOUCcb3gR2fKbCCnBxog= U2FsdGVkX1/EOnUt57TCW4Rh0EdNnWX+lDatuQv2xEXXeAeowW0XG/EXJUe9aSUz $ for i in `cat κρυπτογραφημένοι_κωδικοί πρόσβασης`; do echo $i | openssl enc -base64 -d -aes-256-cbc -pass pass:asdf; ηχώ; Έγινε ΦΟΟΜΠΑΡ foobarfoobar foobarfoobarfoobar
Τώρα ίσως σκεφτείτε: ίσως έχετε δίκιο. Ωστόσο, το βασικό υλικό πρέπει να είναι προσβάσιμο στο σύστημα Σημαίνει ότι ουσιαστικά ένας κύριος κωδικός πρόσβασης απλού κειμένου βρίσκεται κάπου - είτε ως κλειδί RSA είτε κωδικός πρόσβασης είτε σε ένα αρχείο, ενσωματωμένο σε μια βάση δεδομένων, σκληρά κωδικοποιημένο σε μια εφαρμογή ή κωδικός πρόσβασης κάπου στη μνήμη. pfft, κανείς' δεν πρόκειται να χρησιμοποιήσει το asdf ως κλειδί για την κρυπτογράφηση των κωδικών πρόσβασης των χρηστών του'
Χρησιμοποιήστε την ίδια συμβολοσειρά για το MD5:
foobar | 3858f62230ac3c915f300c664312c63f foobarfoobar | 59faa421729e846dd800dce59943bfc0 foobarfoobarfoobar | 1352aadab322d1a033c27964be0965db
Ο κωδικός πρόσβασης κατακερματισμού απέχει πολύ από την τέλεια, στην πραγματικότητα είναι λίγο κακός, αλλά είναι χειρότερος από την κρυπτογράφηση λόγω αυτού που προσπαθεί να επιτύχει. Οι χρήστες επιλέγουν τις απόλυτες ελάχιστες απαιτήσεις πιο συχνά από ό,τι όχι και μπορούν επίσης να το χρησιμοποιήσουν σε πολλαπλούς ιστότοπους. Πολλά "hacks" δεν είναι στην πραγματικότητα τίποτα άλλο από επιθέσεις επαναχρησιμοποίησης διαπιστευτηρίων. Εάν ο αρχικός συμβιβασμός ήταν η χρήση κρυπτογράφησης, τότε η μόνη προσπάθεια που πρέπει να κάνει ένας εισβολέας είναι να βρει το κλειδί για την αποκρυπτογράφηση όλων των κωδικών πρόσβασης. Για τους κατακερματισμούς, πρέπει τουλάχιστον να καταβάλουν προσπάθεια για να τα σπάσουν. Όταν χρησιμοποιείται με σύγχρονους αλγόριθμους όπως sha512crypt, bcrypt, scrypt ή argon2, το hash μπορεί να απαιτήσει μεγάλη προσπάθεια για να σπάσει.
Salting είναι η προσθήκη μιας συμβολοσειράς στον κωδικό πρόσβασης πριν από τον κατακερματισμό. Το αλάτι για κάθε κατακερματισμό θα πρέπει να είναι μοναδικό, συνήθως επιλεγμένο τυχαία, καθώς η εστίαση είναι να κάνετε την ίδια τιμή κατακερματισμού "κωδικού πρόσβασης" απλού κειμένου διαφορετική κάθε φορά. Αυτό δυσκολεύει τη ζωή των password crackers, επειδή για να ελέγξουν τη λέξη "password" για κάθε χρήστη από τους 1.000 χρήστες, ο καθένας έχει ένα μοναδικό αλάτι και πρέπει να το κάνουν 1.000 φορές - μία φορά ανά χρήστη/αλάτι. Αυτό σημαίνει επίσης ότι δεν μπορούν να χρησιμοποιήσουν αποτελεσματικά προμεταγλωττισμένα λεξικά ή πίνακες ουράνιου τόξου (συνήθως...) επειδή απαιτούν ένα προσαρμοσμένο αλάτι ανά αλάτι.
Ο ιστότοπος μερικές φορές το χαλάει και χρησιμοποιεί καθολικό αλάτι για όλους τους χρήστες. Αυτό είναι αντίθετο με τον σκοπό.
Ακολουθούν οι αλατισμένες τιμές κατακερματισμού SHA1:
b353977827f67a4ae0318f3a9447fae1c13d9d90:b8d18ca
|___________________________________________|
hash { } | αλάτι
|
διαχωριστήςΤο απλό κείμενο αυτού του κατακερματισμού είναι "κωδικός πρόσβασης". Η τιμή αλατιού του είναι "b8d18ca" και χρησιμοποιεί το API του SHA1 ($salt.$pass). Αυτό σημαίνει ότι ο αλγόριθμος παίρνει το απλό κείμενο του κωδικού πρόσβασης, δημιουργεί αλάτι και το προσθέτει μπροστά από το απλό κείμενο. Όταν ένας ιστότοπος ή μια εφαρμογή προσπαθεί να επαληθεύσει τον κωδικό πρόσβασής σας Στο μέλλον, θα λάβει τον κωδικό πρόσβασής σας απλού κειμένου ως είσοδο, θα διαβάσει την τιμή αλατιού στον αποθηκευμένο κατακερματισμό, θα την προσθέσει μπροστά από τον κωδικό πρόσβασης της επιλογής σας και θα συγκρίνει την προκύπτουσα τιμή κατακερματισμού με την αποθηκευμένη τιμή κατακερματισμού. Cracking Εάν δεν γνωρίζετε ότι μέρος του είναι αλάτι, ο κατακερματισμός θα παράγει το ακόλουθο απλό κείμενο:
b8d18capassword
Δεδομένου ότι ο αλγόριθμος κάνει εισαγωγή απλού κειμένου, το αλάτι και οι τιμές κατακερματισμού που δημιουργούνται μπορούν να παραμείνουν διαφανείς στον χρήστη. Κατά τη διάρκεια της πυρόλυσης, εάν ο αλγόριθμος είναι αλάτι, πρέπει να γνωρίζουμε το αλάτι, ώστε να μπορέσουμε να το παρέχουμε κατά τη δημιουργία του υποψήφιου απλού κειμένου.
Εάν εφαρμοστεί σωστά, η αλάτωση μπορεί να κάνει τη ρωγμή πιο χρονοβόρα. Χρησιμοποιώντας τυχαίο αλάτι, αναγκάζετε το Cracker να χάσει χρόνο προσπαθώντας να σπάσει τις τιμές κατακερματισμού που δεν ταιριάζουν με το αλάτι. Αυτό είναι περίπου η προσπάθεια που απαιτείται για την ολοκλήρωση της ταχύτητας συσκευής / αριθμού_αλατιών, καθώς πρέπει να δημιουργήσουμε έναν υποψήφιο για κάθε αλάτι. Αν το αλάτι είναι στατικό, τότε οι μαθηματικές πράξεις είναι οι ίδιες...speed_of_device / 1. Ένας άλλος τρόπος προβολής Αυτός:
μας GTX 980 cracks SHA1($salt.$pass) at 3576,8 MH/s or 3,5 δισεκατομμύρια υποψήφιοι ανά δευτερόλεπτο Το hashlist μας περιέχει 1000 μοναδικά άλατα 3.500.000.000 / 1000 = 3.500.000 υποψήφιοι ανά δευτερόλεπτο
Αυτό είναι τρεις τάξεις μεγέθους πιο αργό, με απώλεια 99,9%. Όταν χρησιμοποιείτε στατικό αλάτι, μοιάζει με εξής:
GTX μας 980 ρωγμές SHA1($salt.$pass) at 3576,8 MH/s ή 3,5 δισεκατομμύρια υποψήφιοι ανά δευτερόλεπτο Το hashlist μας περιέχει 1 μοναδικό αλάτι 3.500.000.000 / 1 = 3.500.000.000 υποψήφιοι ανά δευτερόλεπτο
Αν αυτό δεν έχει νόημα, συνεχίστε να διαβάζετε και θα έχουμε ένα όμορφο διάγραμμα αργότερα...
Μια άλλη κοινή βελτίωση σε σύγκριση με απλά "κατακερματίστε αυτό το απλό κείμενο" είναι ότι "κατακερματίστε αυτό το απλό κείμενο, στη συνέχεια κατακερματίστε αυτό το αποτέλεσμα και στη συνέχεια κατακερματίστε αυτό το αποτέλεσμα" επαναλαμβάνεται χιλιάδες φορές. Αυτό επιτρέπει στο πρόγραμμα σπασίματος κωδικού πρόσβασης να κάνει χιλιάδες φορές όταν δοκιμάζετε έναν μόνο υποψήφιο κωδικό πρόσβασης. Αυτό ονομάζεται επανάληψη, βρόχος ή μεταβλητό κόστος. Ορισμένοι αλγόριθμοι κατακερματισμού κωδικού πρόσβασης χρησιμοποιούν σκληρά κωδικοποιημένους γύρους επανάληψης. Άλλα Git. καθιστά το ρυθμιζόμενο σε μέρος του ίδιου του κατακερματισμού. Για παράδειγμα, το md5crypt() χρησιμοποιεί MD5, συμπεριλαμβανομένου του αλατιού, και κάνει βρόχο ακριβώς 1000 φορές. sha512crypt() Χρησιμοποιεί το sha512, συμπεριλαμβανομένου ενός αλατιού και βρόχου για τον ρυθμιζόμενο αριθμό φορών (η προεπιλογή είναι 5.000). Η επανάληψη
επηρεάζει κυρίως το κόστος υπολογιστικού κύκλου του αλγορίθμου κατακερματισμού, όχι τη χρήση μνήμης ή άλλους παράγοντες. Αυτές είναι επίσης σημαντικές επιθέσεις όταν σχεδιάζονται βελτιστοποιημένα για να αντέχουν ορισμένους τύπους τύπων κατακερματισμού, αλλά αυτό είναι πολύ ζιζάνιο για να το συζητήσουμε εδώ.
Ας δούμε μερικά παραδείγματα για να καταδείξουμε την επίδραση της επιλογής αλγορίθμου κατακερματισμού, είτε πρόκειται για αλατισμένο, χρησιμοποιώντας πολλαπλές επαναλήψεις κ.λπ. Ας υποθέσουμε ότι ένας εισβολέας συλλέγει κατακερματισμούς 1.000 χρηστών Από κάποια μολυσμένη ιστοσελίδα που θέλουν απλώς να πραγματοποιήσουν μια απλή επίθεση, δοκιμάζοντας κάθε κωδικό πρόσβασης Hash - 143 εκατομμύρια υποψήφιοι κωδικοί πρόσβασης.
Ο τύπος κατακερματισμού που χρησιμοποιεί ένας μολυσμένος ιστότοπος θα έχει τεράστιο αντίκτυπο στον απαιτούμενο χρόνο. Ο εισβολέας περνάει από την επίθεση. Αυτό είναι ένα διάγραμμα για το πόσα (σχετικά, κατά προσέγγιση) χρειάζονται δευτερόλεπτα για να ολοκληρωθεί αυτή η επίθεση, ανάλογα με τον τύπο του κατακερματισμού που χρησιμοποιείται, όπου Τυπική κάρτα γραφικών:
Λοιπόν, αυτό δεν χρησιμεύει! Ο ισχυρότερος τύπος κατακερματισμού είναι πολύ πιο αργός, αλλά πιο γρήγορος Ο τύπος απλά συνθλίβεται μέχρι να μην υπάρχει τίποτα. Ας δοκιμάσουμε ξανά την ίδια κλίμακα δεδομένων χρησιμοποιώντας το λογαριθμικό χρόνο του άξονα Χ. Όταν οι ράβδοι μετακινούνται από αριστερά προς τα δεξιά, θα αυξήσουν το 10 σε δύναμη:
Έτσι μερικά σημεία είναι: Όταν θέλετε να σπάσετε κάποιους κατακερματισμούς κωδικών πρόσβασης, ο μονός γύρος είναι ευκολότερος από τον πολλαπλό γύρο και χωρίς αλάτι παρά με αλάτι. Αντίθετα, όταν ορισμένες εταιρείες ή ιστότοποι ανακοινώνουν παραβίαση δεδομένων που περιέχουν δεδομένα χρήστη, α) ο κωδικός πρόσβασης είναι κατά προτίμηση κατακερματισμένος, όχι μόνο απλό κείμενο. β) είναι κατά προτίμηση αλατισμένα και όχι απλώς κατακερματισμένα. γ) Είναι καλύτερο να χρησιμοποιούν ισχυρό αλατισμένο κατακερματισμό πολλαπλών γύρων και όχι μόνο έναν γύρο.
Πριν προσπαθήσετε να σπάσετε έναν δεδομένο κατακερματισμό κωδικού πρόσβασης, εναπόκειται στον σπαστή να καταλάβει ποιος αλγόριθμος κατακερματισμού χρησιμοποιείται για την εφαρμογή του. Η αναγνώριση των τύπων κατακερματισμού είναι συνήθως απλή, αλλά όχι πάντα. Οι κράκερ συνήθως κάνουν θεμελιωμένες εικασίες με βάση ενδείξεις, όπως το μήκος και τη μορφή του κατακερματισμού. Σε τελική ανάλυση, ο μόνος τρόπος για να βεβαιωθείτε ότι η εικασία τύπου κατακερματισμού είναι σωστή είναι αν ο κατακερματισμός είναι σπασμένος.
Εδώ και εδώ παρέχονται μερικοί εξαιρετικοί πόροι για αυτήν την εργασία, όλοι δείχνουν πώς μοιάζουν οι κοινές τιμές κατακερματισμού.
Το πακέτο "hash-identifier" (διαθέσιμο εδώ) διατίθεται στο Kali Linux, το οποίο βοηθά στην αναγνώριση άγνωστων τύπων κατακερματισμού.
Σύγκρουση εμφανίζεται όταν δύο διαφορετικές εισόδους προκαλούν την ίδια έξοδο κατακερματισμού. Είναι κακό (προφανώς). Όσον αφορά τους κωδικούς πρόσβασης, αυτό μπορεί να σημαίνει ότι μπορεί να μην έχω σπάσει τον πραγματικό σας κωδικό πρόσβασης, αλλά επειδή βρήκα μια είσοδο που παράγει την ίδια τιμή κατακερματισμού, μπορώ να χρησιμοποιήσω μια τιμή απλού κειμένου για να εξαπατήσω το σύστημα να πιστεύει ότι ο κωδικός πρόσβασης είναι νόμιμος.
Το Microsoft Office χρησιμοποιεί έναν αλγόριθμο που είναι επιρρεπής σε συγκρούσεις εδώ και χρόνια στην προστασία των εγγράφων του. Δεν είναι ασυνήθιστο να βρείτε πολλαπλές συγκρούσεις για έναν μόνο κατακερματισμό, όλες αυτές οι συγκρούσεις ξεκλειδώνουν το έγγραφο.
Μόλις εντοπιστεί μια σύγκρουση, ο αλγόριθμος στην πραγματικότητα καταστρέφεται. Αν συμβεί μία φορά, στατιστικά είναι πολύ πιθανό να συμβεί και πάλι. Το μόνο που μας εμποδίζει είναι ο χρόνος και η ικανότητα επεξεργασίας. Καθώς οι αλγόριθμοι γίνονται πιο ισχυροί, απαιτείται περισσότερη ικανότητα και χρόνος για τη δημιουργία υποψήφιων αλγορίθμων και τη σύγκριση των εξόδων κατακερματισμού για την αναζήτησή τους. Ως αποτέλεσμα, οι σχεδιαστές γίνονται όλο και καλύτεροι στη δημιουργία αλγορίθμων που είναι λιγότερο επιρρεπείς σε συγκρούσεις.