Δημιουργία υπογεγραμμένου JSON Web Token (JWT)
- Πίνακας ελέγχου
- Τεκμηρίωση
- API
Τι είναι το JWT Builder;
Το JWT Builder είναι ένα διαδικτυακό εργαλείο που παράγει ένα υπογεγραμμένο JSON Web Token (JWT) από ένα ωφέλιμο φορτίο JSON και ένα μυστικό HMAC. Απευθύνεται σε προγραμματιστές που χρειάζονται για να δημιουργήσετε γρήγορα ένα διακριτικό δοκιμής για να ελέγξετε τη συμπεριφορά ενός API, προσομοιώστε μια περίοδο λειτουργίας έλεγχος ταυτότητας στο Postman ή αναπαράγετε ένα σφάλμα που σχετίζεται με τη λήξη ή το εύρος ενός διακριτικού.
Σε αντίθεση με τον αποκωδικοποιητή JWT μας, ο οποίος απλώς διαβάζει ένα διακριτικό
υπάρχον, το JWT Builder δημιουργεί ένα πλήρες διακριτικό: δημιουργεί την κεφαλίδα, κωδικοποιεί το
ωφέλιμο φορτίο, υπολογίζει την υπογραφή HMAC και συναρμολογεί τα πάντα σε συμπαγή μορφή header.payload.signature
αναμένεται από όλες τις βιβλιοθήκες JWT στην αγορά.
Γιατί να δημιουργήσετε ένα JWT;
Ένας κατασκευαστής JWT δεν προορίζεται να εκδίδει μάρκες παραγωγής. Είναι πάνω από όλα ένα εργαλείο για ανάπτυξη και δοκιμή. Εδώ είναι τα πιο συνηθισμένα σενάρια:
- Δοκιμές ενσωμάτωσης: παράγουν προβλέψιμα JWT για την εκτέλεση δοκιμών E2E που έπληξαν προστατευμένα τελικά σημεία χωρίς να βασίζονται στον πάροχο πραγματικής ταυτότητας.
- Mocks API: Αντικαταστήστε προσωρινά μια κλήση στο IdP με ένα υπογεγραμμένο JWT τοπικά με το ίδιο μυστικό δοκιμής.
- Τοπική ανάπτυξη: συνδεθείτε στο δικό σας backend δημιουργώντας μη αυτόματα ένα διακριτικό που περιέχει τις επιθυμητές αξιώσεις, χωρίς να χρειάζεται να περάσετε από ολόκληρη τη ροή OAuth2.
- Demos: απεικονίζουν ένα ταξίδι ελέγχου ταυτότητας ή μια ροή εργασίας με βάση δικαιώματα χωρίς να έχετε διαθέσιμο πραγματικό IdP.
- Αναπαραγωγή σφαλμάτων: πλαστογραφήστε ένα διακριτικό που έχει λήξει, ένα διακριτικό με
Λανθασμένο
aud, ένα διακριτικό χωρίς συγκεκριμένες αξιώσεις, για τον έλεγχο των διαδρομών σφάλματος του το API σας. - Εντοπισμός σφαλμάτων προσαρμοσμένου αναλυτή: εισάγετε JWT ειδικά κατασκευασμένα για δοκιμάστε έναν σπιτικό αναλυτή.
Σύνθεση ενός JWT
Ένα υπογεγραμμένο JWT αποτελείται από τρία τμήματα που χωρίζονται από μια τελεία, το καθένα κωδικοποιημένο μέσα
Base64URL (παραλλαγή του Base64 χωρίς padding και με -/_ στο
αντί για +//):
- Header: ένα αντικείμενο JSON που περιγράφει τον αλγόριθμο υπογραφής και τον τύπο του διακριτικού,
για παράδειγμα
{"alg":"HS256","typ":"JWT"}. Το JWT Builder το δημιουργεί αυτόματα από του αλγορίθμου που επιλέγετε. - Payload: ένα αυθαίρετο αντικείμενο JSON που περιέχει τις αξιώσεις του διακριτικού (subject, άδειες, ημερομηνίες λήξης). Αυτό είναι το μέρος που παρέχετε.
- Υπογραφή: ένα HMAC-SHA που υπολογίζεται κατά τη συνένωση
base64url(κεφαλίδα) + "." + base64url(payload)με το μυστικό κλειδί σας. Είναι αυτή που εγγυάται την ακεραιότητα του διακριτικού.
Χρησιμοποιήστε τις θήκες λεπτομερώς
- Mock API για δοκιμές E2E: η σουίτα Cypress ή Playwright πρέπει να καλέσει ένα API
που απαιτεί
Εξουσιοδότηση: Φορέας .... Αντί να ενορχηστρώνετε μια πλήρη σύνδεση στο κάθε δοκιμή, υπογράφουμε ένα JWT on the fly με το κοινό μυστικό και το εισάγουμε στην κεφαλίδα. - Επίδειξη SSO: παρουσιάστε μια ενοποιημένη διαδρομή ελέγχου ταυτότητας χωρίς να εξαρτάτε ενός διαδικτυακού IdP.
- Δοκιμαστικός εξοπλισμός: δημιουργήστε ένα ντετερμινιστικό JWT από ένα ωφέλιμο φορτίο που είναι γνωστό χρησιμεύει ως σταθερό εξάρτημα σε δοκιμές μονάδας.
- Διάγνωση προσαρμοσμένου αναλυτή: δοκιμή ενός σπιτικού αναλυτή JWT με διακριτικά εσκεμμένα ελάχιστο ή εσκεμμένα παράξενο (απαιτήσεις που λείπουν, απροσδόκητοι τύποι).
- Μάθηση: κατανοήστε συγκεκριμένα πώς είναι ενσωματωμένο ένα JWT τροποποίηση του ωφέλιμου φορτίου και παρακολούθηση της αλλαγής της υπογραφής.
Υποστηριζόμενοι αλγόριθμοι: HS256, HS384, HS512
Το εργαλείο μας υποστηρίζει τους τρεις τυπικούς αλγόριθμους HMAC της προδιαγραφής JWT (RFC 7519):
- HS256: HMAC με SHA-256. Υπογραφή 32 byte. Χρησιμοποιείται περισσότερο στην πράξη, καλός συμβιβασμός μεταξύ ταχύτητας και κρυπτογραφικής σταθερότητας. Συνιστάται από προεπιλογή.
- HS384: HMAC με SHA-384. Υπογραφή 48 byte. Προσαρμοσμένο σε πλαίσια που απαιτούν υψηλότερο περιθώριο ασφαλείας.
- HS512: HMAC με SHA-512. Υπογραφή 64 byte. Το πιο στιβαρό, στην τιμή ενός ελαφρώς μεγαλύτερου διακριτικού.
HMAC ή RSA;
Οι αλγόριθμοι HS* είναι συμμετρικοί: το ίδιο κλειδί χρησιμοποιείται για την υπογραφή και την επαλήθευση. Είναι γρήγορο και εύκολο, αλλά σημαίνει ότι κάθε υπηρεσία που μπορεί να επαληθεύσει ένα διακριτικό είναι επίσης ικανό να τα εκπέμψει. Εάν χρειάζεται να διαχωρίσετε αυτούς τους δύο ρόλους (ένας εκδότης, πολλαπλός καταναλωτές), στραφείτε στους αλγόριθμους RS256/RS384/RS512 (RSA, ασύμμετρος), το οποίο μπορείτε να επαληθεύσετε με τον επαληθευτή JWT.
Ασφάλεια: προστασία του μυστικού σας
Η ασφάλεια ενός JWT που είναι υπογεγραμμένο στο HMAC βασίζεται εξ ολοκλήρου στην εμπιστευτικότητα του μυστικού. Μερικοί βασικοί κανόνες:
- Χρησιμοποιήστε ένα μακρύ, τυχαίο μυστικό. Το RFC 7518 συνιστά τουλάχιστον το μέγεθος
της εξόδου του αλγορίθμου (32 byte για το HS256, 48 για το HS384, 64 για το HS512). Ένας κωδικός πρόσβασης
άνθρωπος όπως το
azerty123είναι ασήμαντα ωμή βία που μπορεί να επιτεθεί εκτός σύνδεσης. - Μην υπογράφετε ποτέ JWT από την πλευρά του πελάτη. Το μυστικό θα βρεθεί στον κωδικό Η JavaScript διανέμεται στο πρόγραμμα περιήγησης, εκτίθεται σε οποιονδήποτε χρήστη. Η υπογραφή πρέπει να παραμένει πάντα πλευρά διακομιστή.
- Αποθήκευση του μυστικού σε μια μεταβλητή περιβάλλοντος (π.χ.
JWT_SECRET), ποτέ σε αποθετήριο Git. Σκεφτείτε να χρησιμοποιήσετε ένα θησαυροφυλάκιο όπως το HashiCorp Vault, AWS Secrets Manager ή Symfony Secrets ανάλογα με τη στοίβα σας. - Γυρίστε το μυστικό τακτικά (περιστροφή του κλειδιού), ειδικά μετά από οποιοδήποτε περιστατικό ή αναχώρηση ενός ατόμου που είχε πρόσβαση στη διαμόρφωση.
- Το JWT Builder είναι για δοκιμή και εκμάθηση. Για την παραγωγή, χρησιμοποιήστε τη βιβλιοθήκη JWT του πλαισίου σας (lcobucci/jwt, firebase/php-jwt, jose-php).
Καλές πρακτικές αξιώσεων
Το ωφέλιμο φορτίο είναι ένα δωρεάν αντικείμενο JSON, αλλά το RFC 7519 ορίζει ένα σύνολο εγγεγραμμένων αξιώσεων ότι οι βιβλιοθήκες JWT ξέρουν πώς να ερμηνεύουν. Η συμπερίληψη των σωστών αξιώσεων καθιστά το διακριτικό σας φορητό και αποφεύγει τα ανεπαίσθητα σφάλματα:
- iss (εκδότης): αναγνωριστικό του εκδότη, για παράδειγμα
"https://api.example.com". - sub (subject): αναγνωριστικό του ενδιαφερόμενου προσώπου ή οντότητας, συχνά το αναγνωριστικό χρήστη.
- aud (κοινό): για ποιον προορίζεται το διακριτικό, για να αποτρέψει την επαναχρησιμοποίηση ενός διακριτικό σε άλλο API.
- λήξη (χρόνος λήξης): Χρονική σήμανση Unix μετά την οποία το διακριτικό δεν είναι πλέον έγκυρο. Να συμπεριλαμβάνεται πάντα, ακόμη και για ένα διακριτικό δοκιμής: ένα διακριτικό χωρίς λήξη είναι κακή συνήθεια που είναι δύσκολο να διορθωθεί μετά.
- nbf (όχι πριν): χρονική σήμανση πριν από την οποία το διακριτικό δεν είναι ακόμη έγκυρο. Χρήσιμο για την προέκδοση ενός διακριτικού που μπορεί να ενεργοποιηθεί αργότερα.
- iat (έκδοση στις): χρονική σήμανση έκδοσης, χρήσιμη για καταγραφή και ανάκληση.
- jti (JWT ID): μοναδικό αναγνωριστικό του διακριτικού, απαραίτητο για ανικανότητα και να εφαρμόσετε μια λίστα ανάκλησης.
Τυπικό παράδειγμα ωφέλιμου φορτίου
{
"iss": "https://api.example.com",
"sub": "user-12345",
"aud": "εφαρμογή για κινητά",
"iat": 1714723200,
"exp": 1714726800,
"jti": "9f2d6b1e-2c4a-4f8a-9c3a-87a2b8a4b7e1",
"scope": "read:profile write:profile"
}
Πώς να χρησιμοποιήσετε το εργαλείο
- Εισαγάγετε το ωφέλιμο φορτίο ως έγκυρο JSON. Είναι ένα αντικείμενο, οπότε ξεκινάει με
{και τελειώνει σε}. - Καθορίστε το μυστικό HMAC. Επιλέξτε μια μεγάλη, τυχαία συμβολοσειρά για μάρκες παραγωγής.
- Επιλέξτε τον αλγόριθμο: HS256 από προεπιλογή, HS384 ή HS512 σύμφωνα με τις ανάγκες σας.
- Κάντε κλικ στην επιλογή δημιουργία. Εμφανίζεται το υπογεγραμμένο JWT, έτοιμο για επικόλληση σε μια κεφαλίδα
Εξουσιοδότηση: Φορέας .... - Μπορείτε στη συνέχεια να επαληθεύσετε το διακριτικό με το ίδιο μυστικό επιβεβαιώστε τη συνοχή του μετ' επιστροφής ή αποκωδικοποιήστε για εκ νέου ανάγνωση το περιεχόμενό του.
Συχνές ερωτήσεις
Ποιον αλγόριθμο να επιλέξετε: HS256, HS384, HS512;
Για σχεδόν όλες τις περιπτώσεις, το HS256 είναι η σωστή επιλογή. Προσφέρει ένα επίπεδο απολύτως επαρκής ασφάλεια για μάρκες ελέγχου ταυτότητας, με συμπαγή υπογραφή (32 byte) και γρήγορος υπολογισμός. Τα HS384 και HS512 δικαιολογούνται μόνο σε πλαίσια ακριβείς κανονιστικές απαιτήσεις ή εάν διαχειρίζεστε μάρκες με πολύ μεγάλη διάρκεια ζωής. Το μέγεθος του Η υψηλότερη υπογραφή κάνει κάθε αίτημα HTTP βαρύτερο.
Πώς μπορώ να δημιουργήσω ένα ζεύγος RSA για να υπογράψω τα JWT μου;
Με το OpenSSL σε δύο εντολές: openssl genrsa -out private.pem 2048 για το κλειδί
ιδιωτικό και μετά openssl rsa -in private.pem -pubout -out public.pem για εξαγωγή
το δημόσιο κλειδί. Για νέες υπηρεσίες, προτείνουμε πλέον κλειδιά ασφαλείας.
3072 bit ή 4096 bit. Το ιδιωτικό κλειδί παραμένει στην πλευρά του αποστολέα. το δημόσιο κλειδί είναι
διανέμει ελεύθερα σε υπηρεσίες που πρέπει να επαληθεύσουν διακριτικά.
Ποιος είναι ο προτεινόμενος χρόνος λήξης;
Για ένα διακριτικό πρόσβασης: 5 έως 15 λεπτά. Για μια ένδειξη ανανέωσης: λίγες μέρες
λίγες εβδομάδες, αλλά με μηχανισμό ανάκλησης από την πλευρά του διακομιστή. Όσο περισσότερο είναι το διακριτικό
μακράς διάρκειας, τόσο μεγαλύτερο είναι το παράθυρο λειτουργίας σε περίπτωση διαρροής. Για δοκιμαστικά JWT, εσείς
μπορεί να πάρει μια πιο γενναιόδωρη διάρκεια, αλλά αποφύγετε το exp για αρκετά χρόνια:
καταλήγουν να διαρρέουν στα αποθετήρια του Git.
Μπορώ να υπογράψω με ένα πολύ σύντομο μυστικό κλειδί;
Τεχνικά ναι, αλλά αποθαρρύνεται έντονα. Ένα μυστικό HMAC μικρότερο από
Τα 16 byte είναι ασθενώς ανθεκτικά σε επιθέσεις ωμής βίας εκτός σύνδεσης και βρίσκονται στο
φύση των εργαλείων που σπάνε ένα JWT HS256 με χαμηλό μυστικό σε δευτερόλεπτα. Το
Το RFC 7518 συνιστά τουλάχιστον το μέγεθος της εξόδου του αλγορίθμου: 32 byte για το HS256,
48 για HS384, 64 για HS512. Δημιουργήστε τα μυστικά σας με
openssl rand -base64 64.
Γιατί απορρίπτεται το ωφέλιμο φορτίο μου;
Το ωφέλιμο φορτίο πρέπει να είναι ένα έγκυρο αντικείμενο JSON. Συνήθη λάθη: Μεμονωμένα εισαγωγικά αντί για
διπλάσιο, επιπλέον κόμμα πριν από το }, τιμή χωρίς εισαγωγικά για μια συμβολοσειρά. Επικύρωση
πρώτα το JSON σας με τον μορφοποιητή JSON.
Μπορεί το JWT που δημιουργείται να αποκρυπτογραφηθεί από κάποιον άλλο;
Ένα υπογεγραμμένο JWT δεν είναι κρυπτογραφημένο: το ωφέλιμο φορτίο είναι απλώς κωδικοποιημένο με Base64URL. Τα πάντα ο κόσμος μπορεί να το διαβάσει. Εάν το ωφέλιμο φορτίο περιέχει ευαίσθητα δεδομένα, χρησιμοποιήστε τη μορφή JWE (JSON Web Encryption) που προσθέτει κρυπτογράφηση. Το εργαλείο μας παράγει ένα JWS (μόνο υπογεγραμμένο).
Παράδειγμα αιτήματος
curl -X POST https://cdrn.fr/api/v1/tools/jwt-builder/execute \
-H "Content-Type: application/json" \
-d '{"payload":"...","secret":"...","algorithm":"HS256"}'
Σχήμα εισόδου
| Πεδίο | Τύπος | Απαιτείται | Προεπιλογή |
|---|---|---|---|
payload |
text | ✓ | – |
secret |
text | ✓ | – |
algorithm |
choice (HS256, HS384, HS512) | ✓ | HS256 |
Σημεία πρόσβασης
GET https://cdrn.fr/api/v1/tools- εμφανίζει όλα τα διαθέσιμα εργαλείαGET https://cdrn.fr/api/v1/tools/jwt-builder- ανακτά το σχήμα αυτού του εργαλείουPOST https://cdrn.fr/api/v1/tools/jwt-builder/execute- εκτελεί αυτό το εργαλείο με payload JSON