Πώς η Devise διατηρεί ασφαλείς τους κωδικούς πρόσβασης της εφαρμογής Rails

Το Devise είναι μια απίστευτη λύση ελέγχου ταυτότητας για Rails με περισσότερες από 40 εκατομμύρια λήψεις. Ωστόσο, δεδομένου ότι αφαιρεί τις περισσότερες από τις κρυπτογραφικές λειτουργίες, δεν είναι πάντα εύκολο να καταλάβουμε τι συμβαίνει πίσω από τα παρασκήνια.

Μία από αυτές τις αφαιρέσεις καταλήγει στην επιμονή ενός encrypted_passwordαπευθείας στη βάση δεδομένων. Γι 'αυτό ήμουν πάντα περίεργος για το τι αντιπροσωπεύει πραγματικά. Ακολουθεί ένα παράδειγμα:

$2a$11$yMMbLgN9uY6J3LhorfU9iuLAUwKxyy8w42ubeL4MWy7Fh8B.CH/yO

Αλλά τι σημαίνει αυτή η ασυναρτησία;

Η Devise χρησιμοποιεί το Bcrypt για να αποθηκεύει με ασφάλεια πληροφορίες. Στον ιστότοπό του αναφέρεται ότι χρησιμοποιεί τον « αλγόριθμο κατακερματισμού κωδικού πρόσβασης OpenBSD bcrypt (), επιτρέποντάς σας να αποθηκεύετε εύκολα έναν ασφαλή κατακερματισμό των κωδικών πρόσβασης των χρηστών σας ». Αλλά τι ακριβώς είναι αυτό το κατακερματισμό; Πώς λειτουργεί και πώς διατηρεί τους αποθηκευμένους κωδικούς πρόσβασης ασφαλείς;

Αυτό θέλω να σας δείξω σήμερα.

Ας εργαστούμε προς τα πίσω - από το αποθηκευμένο κατακερματισμό στη βάση δεδομένων σας έως τη διαδικασία κρυπτογράφησης και αποκρυπτογράφησης.

Αυτό το κατακερματισμό $2a$11$yMMbLgN9uY6J3LhorfU9iuLAUwKxyy8w42ubeL4MWy7Fh8B.CH/yOαποτελείται στην πραγματικότητα από διάφορα στοιχεία:

  • Έκδοση Bcrypt ( 2a) - η έκδοση του αλγορίθμου bcrypt () που χρησιμοποιείται για την παραγωγή αυτού του κατακερματισμού (αποθηκεύεται μετά το πρώτο $σημάδι)
  • Κόστος ( 11) - ο συντελεστής κόστους που χρησιμοποιείται για τη δημιουργία του κατακερματισμού (αποθηκεύεται μετά το δεύτερο $σημάδι)
  • Αλάτι ( $2a$11$yMMbLgN9uY6J3LhorfU9iu) - μια τυχαία συμβολοσειρά που όταν συνδυάζεται με τον κωδικό πρόσβασής σας το καθιστά μοναδικό (πρώτοι 29 χαρακτήρες)
  • Checksum ( LAUwKxyy8w42ubeL4MWy7Fh8B.CH/yO) - το πραγματικό τμήμα κατακερματισμού του αποθηκευμένου encrypted_password(υπόλοιπο συμβολοσειρά μετά τους 29 χαρακτήρες)

Ας εξερευνήσουμε τις 3 τελευταίες παραμέτρους:

  • Όταν χρησιμοποιείτε το Devise, η Costτιμή ορίζεται από μια μεταβλητή κλάσης που ονομάζεται τεντώματα και η προεπιλεγμένη τιμή είναι 11. Καθορίζει τον αριθμό των φορών που ο κωδικός πρόσβασης έχει κατακερματιστεί. ( Στον αρχικοποιητή devise.rb, μπορείτε να το διαμορφώσετε σε χαμηλότερη τιμή για το περιβάλλον δοκιμής, ώστε η δοκιμαστική σουίτα να εκτελείται πιο γρήγορα. ) *
  • Το αλάτι είναι η τυχαία συμβολοσειρά που χρησιμοποιείται για να συνδυαστεί με τον αρχικό κωδικό πρόσβασης. Αυτό κάνει τον ίδιο κωδικό πρόσβασης να έχει διαφορετικές τιμές όταν αποθηκεύεται κρυπτογραφημένο. ( Δείτε περισσότερα παρακάτω για ποιο λόγο έχει σημασία και τι είναι το Rainbow Table Attack s.) **
  • Το άθροισμα ελέγχου είναι ο πραγματικός δημιουργημένος κατακερματισμός του κωδικού πρόσβασης αφού συνδυαστεί με το τυχαίο αλάτι.

Όταν ένας χρήστης εγγράφεται στην εφαρμογή σας, πρέπει να ορίσει έναν κωδικό πρόσβασης. Προτού αποθηκευτεί αυτός ο κωδικός πρόσβασης στη βάση δεδομένων, δημιουργείται ένα τυχαίο αλάτι μέσω του BCrypt :: Engine.generate_salt (κόστος) λαμβάνοντας υπόψη τον συντελεστή κόστους που αναφέρθηκε προηγουμένως. (Σημείωση: εάν pepperέχει οριστεί η τιμή της μεταβλητής κλάσης, θα προσθέσει την τιμή της στον κωδικό πρόσβασης πριν την αλάτισή της.)

Με αυτό το αλάτι (π.χ. $2a$11$yMMbLgN9uY6J3LhorfU9iu, το οποίο περιλαμβάνει τον συντελεστή κόστους) θα καλέσει BCrypt :: Engine.hash_secret (κωδικός πρόσβασης, αλάτι) που υπολογίζει το τελικό κατακερματισμό που θα αποθηκευτεί χρησιμοποιώντας το παραγόμενο αλάτι και τον κωδικό πρόσβασης που έχει επιλέξει ο χρήστης. Αυτό το τελικό κατακερματισμό (για παράδειγμα $2a$11$yMMbLgN9uY6J3LhorfU9iuLAUwKxyy8w42ubeL4MWy7Fh8B.CH/yO) θα αποθηκευτεί με τη σειρά του στη encrypted_passwordστήλη της βάσης δεδομένων.

Αλλά αν αυτός ο κατακερματισμός δεν είναι αναστρέψιμος και το αλάτι δημιουργείται τυχαία στην BCrypt::Password.createκλήση από BCrypt::Engine.generate_salt(cost), πώς μπορεί να χρησιμοποιηθεί για την είσοδο στον χρήστη;

Εκεί είναι χρήσιμα αυτά τα διαφορετικά συστατικά κατακερματισμού. Αφού βρει την εγγραφή που ταιριάζει με το email που παρέχεται από τον χρήστη για να συνδεθεί, ο κρυπτογραφημένος κωδικός πρόσβασης ανακτάται και αναλύεται στα διάφορα στοιχεία που αναφέρονται παραπάνω ( έκδοση Bcrypt , Κόστος , Αλάτι και Checksum ).

Μετά από αυτήν την αρχική προετοιμασία, ακολουθεί τι συμβαίνει στη συνέχεια:

  1. Ανάκτηση του κωδικού πρόσβασης εισαγωγής ( 1234)
  2. Λήψη του αλατιού του αποθηκευμένου κωδικού πρόσβασης ( $2a$11$yMMbLgN9uY6J3LhorfU9iu)
  3. Δημιουργήστε τον κατακερματισμό από τον κωδικό πρόσβασης και το αλάτι χρησιμοποιώντας την ίδια έκδοση bcrypt και συντελεστή κόστους ( BCrypt::Engine.hash_secret(“1234”, “$2a$11$yMMbLgN9uY6J3LhorfU9iu”))
  4. Ελέγξτε εάν το αποθηκευμένο κατακερματισμό είναι το ίδιο με το υπολογισμένο στο βήμα 3 ( $2a$11$yMMbLgN9uY6J3LhorfU9iuLAUwKxyy8w42ubeL4MWy7Fh8B.CH/yO)

Και έτσι η Devise αποθηκεύει με ασφάλεια τους κωδικούς πρόσβασης και σας προστατεύει από μια σειρά από επιθέσεις, ακόμη και αν η βάση δεδομένων σας έχει παραβιαστεί.

Ελάτε σε επαφή με στο Twitter @ alvesjtiago και ενημερώστε μου αν βρήκατε αυτό το άρθρο ενδιαφέρον! Ευχαριστούμε που το διαβάσατε.

PS: Σε καμία περίπτωση δεν είμαι ειδικός σε θέματα ασφάλειας ή κρυπτογραφίας, οπότε παρακαλούμε επικοινωνήστε αν βρείτε κάτι λάθος Ελπίζω ότι απλοποιώντας μερικές από τις έννοιες θα είναι ευκολότερο να κατανοήσουμε τι συμβαίνει.

Σας ευχαριστούμε @filipepina, @ivobenedito, @jackveiga, @joao_mags και @pedrosmmoreira για τις κριτικές και τις προτάσεις. Αυτό το άρθρο είναι επίσης διαθέσιμο στη διεύθυνση //blog.tiagoalves.me/how-does-devise-keep-your-passwords-safe.

Περισσότερες πληροφορίες σχετικά με ορισμένα από τα θέματα.

Συντελεστής κόστους *

  • Κίνδυνοι του προεπιλεγμένου συντελεστή κόστους bcrypt
  • Προτεινόμενος αριθμός γύρων για το bcrypt

Επιθέσεις επιτραπέζιου ουράνιου τόξου **

  • Τραπέζι ουράνιου τόξου - Wikipedia
  • Τι είναι τα τραπέζια του ουράνιου τόξου και πώς χρησιμοποιούνται;