fixmint
EL

Τι κρύβει ένα JWT και γιατί η αποκωδικοποίηση δεν είναι έλεγχος

Από · · 4 λεπτά ανάγνωση

Ένα JSON Web Token (JWT) είναι τρία κομμάτια κειμένου ενωμένα με τελείες: μια κεφαλίδα (header), ένα payload και μια υπογραφή. Τα δύο πρώτα είναι μόνο κωδικοποιημένα, όχι κρυπτογραφημένα, οπότε όποιος κατέχει το διακριτικό (token) μπορεί να τα διαβάσει. Η υπογραφή επιτρέπει σε έναν διακομιστή να ελέγξει ότι το token εκδόθηκε από αξιόπιστο φορέα και ότι κανείς δεν το άλλαξε. Η αποκωδικοποίηση ενός token σας λέει τι γράφει. Μόνο η επαλήθευσή του σας δείχνει αν μπορείτε να το εμπιστευτείτε.

Αποκωδικοποιητής JWTΈληξε το token, ή είναι έγκυρο;Κάντε το δωρεάν

Τα τρία μέρη

Ένα token μοιάζει με header.payload.signature. Το πρώτο μέρος του γνωστού παραδείγματος token από το jwt.io είναι:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9

Κάθε ένα από τα δύο πρώτα μέρη είναι JSON μετατραμμένο σε base64url, μια μορφή κειμένου που είναι ασφαλής για URL. Το πρώτο μέρος αποκωδικοποιείται σε:

{"alg":"HS256","typ":"JWT"}

Το payload του ίδιου παραδείγματος αποκωδικοποιείται σε:

{"sub":"1234567890","name":"John Doe","iat":1516239022}

Το payload περιέχει τα claims, δηλαδή δηλώσεις για τον χρήστη ή τη συνεδρία. Η υπογραφή υπολογίζεται από τα δύο πρώτα μέρη και ένα κλειδί, οπότε αν αλλάξετε έναν χαρακτήρα παύει να ταιριάζει. Το base64url αντιστρέφεται χωρίς κλειδί, γι' αυτό μην βάζετε ποτέ κωδικό πρόσβασης, ιδιωτικό κλειδί ή προσωπικά δεδομένα στο payload.

Καταχωρημένα claims

Το RFC 7519, το πρότυπο για τα JWT, δεσμεύει μερικά σύντομα ονόματα claims:

  • iss (issuer): ποιος δημιούργησε το token.
  • sub (subject): σε ποιον αναφέρεται το token, συνήθως ένα ID χρήστη.
  • aud (audience): η υπηρεσία για την οποία προορίζεται το token.
  • exp (expiration time): η στιγμή μετά την οποία το token δεν ισχύει.
  • nbf (not before): η νωρίτερη στιγμή κατά την οποία το token ισχύει.
  • iat (issued at): πότε δημιουργήθηκε το token.

Οι χρόνοι μετριούνται σε δευτερόλεπτα από 1 Ιανουαρίου 1970 UTC, που ονομάζεται χρόνος Unix. Το παράδειγμα δεν έχει exp, άρα σύμφωνα με το πρότυπο δεν λήγει ποτέ. Ένα πραγματικό token θα έπρεπε να έχει. Άλλα ονόματα, όπως role ή email, ανήκουν στην εφαρμογή.

Η αποκωδικοποίηση δεν είναι έλεγχος

Η αποκωδικοποίηση χωρίζει το token στις τελείες, αντιστρέφει το base64url και διαβάζει το JSON. Δείχνει τι δηλώνει το token, και το ίδιο κάνει και για ένα πλαστό token, γιατί ο καθένας μπορεί να γράψει οποιαδήποτε claims με οποιαδήποτε υπογραφή.

Η επαλήθευση υπολογίζει ξανά την υπογραφή με το σωστό κλειδί και ελέγχει ότι ταιριάζει. Ελέγχει επίσης ότι τα exp και nbf περικλείουν την τρέχουσα ώρα και ότι τα iss και aud είναι οι τιμές που περιμένει η υπηρεσία. Μια εφαρμογή που διαβάζει ένα claim role χωρίς επαλήθευση εμπιστεύεται όποιον έγραψε το token. Αυτό είναι ένα συνηθισμένο λάθος.

HS256, RS256 και ES256

Η τιμή alg ονομάζει τη μέθοδο. Τρεις είναι οι συνηθισμένες:

  • HS256 είναι HMAC με SHA-256. Ένα κοινό μυστικό υπογράφει και επαληθεύει, οπότε το μυστικό πρέπει να μένει στον διακομιστή που εκδίδει τα tokens.
  • RS256 είναι υπογραφή RSA με SHA-256. Ο εκδότης υπογράφει με ιδιωτικό κλειδί, και όποιος έχει το δημόσιο κλειδί μπορεί να επαληθεύσει. Άλλες υπηρεσίες μπορούν να ελέγχουν τα tokens χωρίς να μπορούν να τα δημιουργήσουν.
  • ES256 είναι υπογραφή ECDSA με την καμπύλη P-256 και SHA-256. Λειτουργεί όπως το RS256 με μικρότερα κλειδιά και υπογραφές.

Χρησιμοποιήστε το HS256 όταν μία υπηρεσία εκδίδει και ελέγχει τα δικά της tokens. Χρησιμοποιήστε το RS256 ή το ES256 όταν άλλες υπηρεσίες πρέπει να ελέγχουν tokens που δεν εξέδωσαν.

Προβλήματα που προέρχονται από την εμπιστοσύνη στην κεφαλίδα

Η κεφαλίδα γράφεται από όποιον στέλνει το token, οπότε ο επαληθευτής δεν πρέπει να την αφήνει να επιλέγει τους κανόνες.

  1. alg: none. Ένα token χωρίς υπογραφή μπορεί να δηλώσει "alg":"none". Κάποιες βιβλιοθήκες δέχονταν κάποτε τέτοια tokens και παρέκαμπταν τον έλεγχο. Ορίστε τους επιτρεπόμενους αλγορίθμους στον δικό σας κώδικα και ποτέ μην τους παίρνετε από το token.
  2. Σύγχυση αλγορίθμου. Ένας διακομιστής περιμένει RS256 και έχει ένα δημόσιο κλειδί. Ένας επιτιθέμενος στέλνει ένα HS256 token υπογεγραμμένο με εκείνο το δημόσιο κλειδί ως μυστικό HMAC. Ένας επαληθευτής που δέχεται όποιον αλγόριθμο δηλώνει η κεφαλίδα, το αποδέχεται. Δέστε κάθε κλειδί με έναν μόνο αλγόριθμο.
  3. Αδύναμα μυστικά. Ο επιτιθέμενος έχει την κεφαλίδα, το payload και την υπογραφή, άρα μπορεί να δοκιμάσει υποψήφια μυστικά εκτός σύνδεσης. Ένα σύντομο μυστικό ή μια συνηθισμένη λέξη πέφτει γρήγορα σε μια τέτοια λίστα. Το RFC 7518 ορίζει ότι ένα κλειδί HS256 θα πρέπει να έχει τουλάχιστον 256 bits και να είναι τυχαίο.

Επικόλληση token παραγωγής σε ιστότοπο

Ένα έγκυρο, μη ληγμένο token λειτουργεί για όποιον το κατέχει, μέχρι να λήξει. Αντιμετωπίστε το σαν κωδικό πρόσβασης. Πριν το επικολλήσετε σε έναν ιστότοπο, δείτε αν ο ιστότοπος το στέλνει σε διακομιστή. Ένα εργαλείο που τρέχει εξ ολοκλήρου στην καρτέλα του προγράμματος περιήγησης δεν έχει λόγο να το κάνει. Μπορείτε να ελέγξετε οποιαδήποτε σελίδα παρακολουθώντας τα αιτήματα δικτύου στα εργαλεία προγραμματιστή του προγράμματος περιήγησης.

Τα tokens συνήθως δεν μπορούν να ανακληθούν πριν λήξουν, εκτός αν ο διακομιστής κρατά λίστα. Αν διαρρεύσει ένα ενεργό token, ζητήστε από την υπηρεσία να ανακαλέσει τη συνεδρία ή να αλλάξει τα κλειδιά της. Όπου μπορείτε, χρησιμοποιήστε για αποσφαλμάτωση ένα token από περιβάλλον δοκιμών. Ο αποκωδικοποιητής JWT διαβάζει τα τρία μέρη στην καρτέλα του προγράμματος περιήγησής σας, και τίποτα από όσα επικολλάτε δεν αποστέλλεται πουθενά.

Webhooks: η ίδια ιδέα με κοινό μυστικό

Οι περισσότεροι πάροχοι webhook στέλνουν ένα HMAC του σώματος του αιτήματος, υπολογισμένο με ένα μυστικό που μοιράζεστε μαζί τους, σε μια κεφαλίδα. Ο παραλήπτης σας υπολογίζει το ίδιο HMAC και συγκρίνει τα δύο. Τα συνηθισμένα λάθη είναι μικρά. Το JSON ξαναμορφοποιείται πριν από το hashing, οπότε αλλάζουν τα bytes. Το μυστικό της δοκιμής χρησιμοποιείται σε κίνηση παραγωγής. Ή οι υπογραφές συγκρίνονται με απλή ισότητα συμβολοσειρών, κάτι που μπορεί να διαρρεύσει πληροφορίες χρονισμού. Χρησιμοποιήστε σύγκριση σταθερού χρόνου.

Ο έλεγχος υπογραφής webhook υπολογίζει την υπογραφή από το μυστικό και το σώμα που επικολλάτε, για GitHub, Stripe, Slack, Shopify ή οποιοδήποτε σχήμα HMAC, ώστε να δείτε αν ταιριάζουν οι δύο τιμές.

Σύντομες απαντήσεις

Είναι κρυπτογραφημένο ένα JWT;

Όχι. Ένα τυπικό JWT είναι υπογεγραμμένο, και όποιος μπορεί να διαβάσει την κεφαλίδα και το payload του. Μόνο η υπογραφή το προστατεύει από αλλαγές.

Τι συμβαίνει αν αλλάξω το payload;

Η υπογραφή παύει να ταιριάζει, οπότε ένας διακομιστής που κάνει επαλήθευση απορρίπτει το token. Η ανάγνωση των claims δεν ελέγχει την υπογραφή, οπότε ο αποκωδικοποιητής θα εξακολουθεί να δείχνει την τροποποιημένη σας έκδοση.

Μετάφραση από το Αγγλικό πρωτότυπο με τη βοήθεια τεχνητής νοημοσύνης.

Σχόλια

    Δεν υπάρχουν σχόλια ακόμη. Γίνετε οι πρώτοι.

    Η βαθμολογία σας (προαιρετικό)

    Το email σας δεν εμφανίζεται ούτε αποθηκεύεται ποτέ.

    Εξώφυλλο του Agentic AI in the BrowserAgentic AI in the Browser

    Περιπτώσεις χρήσης για ροές εργασίας τεχνητής νοημοσύνης που τρέχουν μέσα στον περιηγητή, με προτεραιότητα στο απόρρητο: η ίδια ιδέα του «κάνε το στη συσκευή σου» πάνω στην οποία βασίζεται το fixmint.

    $4.99Αγοράστε στο GumroadΣτα αγγλικά