Δημιουργός HMAC
Υπολογίστε HMAC-SHA1, SHA-256, SHA-384 ή SHA-512 με κλειδί κειμένου, hex ή Base64 και ελέγξτε υπογραφή webhook στο πρόγραμμα περιήγησής σας.
Το μήνυμα υπογράφεται ακριβώς όπως πληκτρολογήθηκε, κωδικοποιημένο σε UTF-8, μαζί με τα κενά και τις αλλαγές γραμμής.
- HMAC (hex)
- HMAC (Base64)
- Κεφαλίδα υπογραφής webhook (στυλ GitHub)
Η σύγκριση εκτελείται σε σταθερό χρόνο, όπως πρέπει να την κάνει ένας διακομιστής, ώστε ο χρόνος που απαιτείται να μην αποκαλύπτει πόσοι χαρακτήρες ταιριάζουν.
Πώς να υπολογίσετε ένα HMAC
- Επικολλήστε το Μήνυμα. Για ένα webhook, πρέπει να είναι το ακατέργαστο σώμα του αιτήματος, byte προς byte.
- Εισαγάγετε το Μυστικό κλειδί και επιλέξτε τη Μορφή κλειδιού: Κείμενο (UTF-8), Δεκαεξαδικό ή Base64.
- Διαλέξτε τον Αλγόριθμο: HMAC-SHA1, HMAC-SHA256, HMAC-SHA384 ή HMAC-SHA512.
- Το αποτέλεσμα ενημερώνεται καθώς πληκτρολογείτε· μπορείτε επίσης να πατήσετε Δημιουργία HMAC. Παίρνετε το HMAC (hex), το HMAC (Base64) και μια Κεφαλίδα υπογραφής webhook (στυλ GitHub), καθένα με κουμπί Αντιγραφή.
- Για να ελέγξετε μια υπογραφή που λάβατε, επικολλήστε την στο Σύγκριση με αναμενόμενη υπογραφή (hex, Base64 ή sha256=…). Το εργαλείο σας λέει αν ταιριάζει.
Το μήνυμα κωδικοποιείται σε UTF-8 ακριβώς όπως πληκτρολογήθηκε, μαζί με τα κενά και τις αλλαγές γραμμής. Ο υπολογισμός χρησιμοποιεί το Web Crypto API του προγράμματος περιήγησής σας· το μήνυμα και το κλειδί δεν φεύγουν ποτέ από τη συσκευή σας.
Τι είναι το HMAC
Το HMAC (hash-based message authentication code, RFC 2104) συνδυάζει ένα μυστικό κλειδί με μια συνάρτηση κατακερματισμού:
HMAC(K, m) = H((K′ ⊕ opad) ‖ H((K′ ⊕ ipad) ‖ m))
όπου K′ είναι το κλειδί συμπληρωμένο στο μέγεθος μπλοκ του hash (με κατακερματισμό πρώτα, αν είναι μεγαλύτερο) και τα ipad/opad είναι σταθερές. Μόνο όποιος γνωρίζει το κλειδί μπορεί να παράγει τον σωστό κωδικό για ένα μήνυμα και κάθε αλλαγή στο μήνυμα αλλάζει εντελώς τον κωδικό. Γι’ αυτό τα HMAC υπογράφουν webhooks, αιτήματα API (για παράδειγμα το AWS Signature Version 4) και JSON Web Token HS256.
Το HMAC δεν είναι κρυπτογράφηση: το μήνυμα δεν κρύβεται. Δεν είναι επίσης κατακερματισμός κωδικών πρόσβασης· για την αποθήκευση κωδικών χρησιμοποιήστε μια αργή συνάρτηση όπως ο bcrypt ή ο Argon2.
Το μήκος της εξόδου εξαρτάται από τον αλγόριθμο: 20 byte για το SHA-1, 32 για το SHA-256, 48 για το SHA-384 και 64 για το SHA-512. Το HMAC-SHA1 εξακολουθεί να θεωρείται ασφαλές ως MAC, αλλά για νέα συστήματα προτιμήστε το SHA-256. Συνιστάται τυχαίο κλειδί τουλάχιστον όσο μακρύ είναι η έξοδος (32 byte για το HMAC-SHA256)· τα κλειδιά hex ή Base64 σας επιτρέπουν να εισαγάγετε απευθείας τέτοια τυχαία byte.
Έλεγχος ενός webhook του GitHub
Το GitHub υπογράφει κάθε παράδοση με το μυστικό του webhook σας και στέλνει το αποτέλεσμα στην κεφαλίδα X-Hub-Signature-256 ως sha256= ακολουθούμενο από το HMAC-SHA256 σε hex του σώματος. Το παράδειγμα της τεκμηρίωσης του ίδιου του GitHub χρησιμοποιεί το μυστικό It's a Secret to Everybody και το σώμα Hello, World!· εισαγάγετέ τα εδώ με HMAC-SHA256 και η κεφαλίδα δείχνει:
X-Hub-Signature-256: sha256=757107ea0eb2509fc211221cce984b8a37570b6d7586c22c46f4379c8b043e17
Το πεδίο σύγκρισης δέχεται ολόκληρη τη γραμμή της κεφαλίδας, την τιμή sha256=… ή μια απλή υπογραφή hex ή Base64 (τα Stripe, Shopify και Slack χρησιμοποιούν παρόμοια σχήματα με δικές τους κεφαλίδες και υπογεγραμμένες συμβολοσειρές). Για SHA-384 και SHA-512 το εργαλείο δείχνει μια γενική κεφαλίδα X-Signature, αφού δεν υπάρχει κοινό πρότυπο.
Σύγκριση σε σταθερό χρόνο
Ένας διακομιστής που συγκρίνει υπογραφές με κανονική σύγκριση συμβολοσειρών σταματά στον πρώτο διαφορετικό χαρακτήρα. Μετρώντας τους χρόνους απόκρισης, ένας επιτιθέμενος θα μπορούσε να μαντέψει μια έγκυρη υπογραφή χαρακτήρα προς χαρακτήρα. Η σύγκριση σε αυτό το εργαλείο εξετάζει κάθε byte ανεξάρτητα από το αποτέλεσμα, όπως πρέπει να κάνει ένας διακομιστής με το crypto.timingSafeEqual στο Node.js, το hmac.compare_digest στην Python ή το hash_equals στην PHP.
Συχνές ερωτήσεις
Γιατί το HMAC μου διαφέρει από αυτό που υπολογίζει ο διακομιστής μου;
Οι συνηθισμένες αιτίες είναι διαφορετικό μήνυμα (ο διακομιστής υπογράφει το ακατέργαστο σώμα, ενώ εσείς επικολλήσατε JSON με άλλη μορφοποίηση ή διαφορετικές αλλαγές γραμμής), κλειδί σε λάθος Μορφή κλειδιού ή άλλος αλγόριθμος. Ακόμη και ένα επιπλέον κενό αλλάζει ολόκληρο το αποτέλεσμα.
Να είναι η έξοδος hex ή Base64;
Και τα δύο κωδικοποιούν τα ίδια byte. Το GitHub χρησιμοποιεί hex, ενώ πολλά άλλα API, όπως το Shopify, χρησιμοποιούν Base64. Χρησιμοποιήστε τη μορφή που περιμένει το σύστημα που λαμβάνει.
Μπορώ να χρησιμοποιήσω κενό κλειδί;
Το εργαλείο το δέχεται και σας προειδοποιεί: με κενό κλειδί, οποιοσδήποτε μπορεί να υπολογίσει το ίδιο HMAC, επομένως δεν αποδεικνύει τίποτα.
Είναι σπασμένο το HMAC-SHA1 όπως το SHA-1;
Οι επιθέσεις σύγκρουσης στο SHA-1 δεν σπάνε το HMAC-SHA1, που εξακολουθεί να θεωρείται ασφαλές ως MAC. Παραμένει υποστηριζόμενο για παλιά συστήματα, όπως η παλιά κεφαλίδα X-Hub-Signature, αλλά τα νέα συστήματα πρέπει να χρησιμοποιούν HMAC-SHA256 ή ισχυρότερο.
Είναι ασφαλές το μυστικό μου κλειδί εδώ;
Το κλειδί και το μήνυμα επεξεργάζονται μόνο στο πρόγραμμα περιήγησής σας και δεν στέλνονται πουθενά. Παρ’ όλα αυτά, χειριστείτε με προσοχή ένα μυστικό παραγωγής και αλλάξτε το αν πιστεύετε ότι εκτέθηκε.
Σχετικά εργαλεία
- Δημιουργός hash Δημιουργήστε hash MD5, SHA-1, SHA-256 και SHA-512 για κείμενο ή αρχεία οποιουδήποτε μεγέθους και επαληθεύστε αθροίσματα ελέγχου στο πρόγραμμα περιήγησής σας.
- Αποκωδικοποιητής JWT Αποκωδικοποιήστε κεφαλίδα και φορτίο JWT, δείτε τα exp, iat και nbf ως ημερομηνίες και επαληθεύστε υπογραφές HS256, RS256, ES256 τοπικά στον browser.
- Κωδικοποίηση και αποκωδικοποίηση Base64 Δωρεάν κωδικοποίηση και αποκωδικοποίηση Base64 με πλήρη υποστήριξη UTF-8 και επιλογή base64url. Λειτουργεί στο πρόγραμμα περιήγησής σας.
- Δημιουργός και έλεγχος bcrypt Δημιουργήστε hash bcrypt με συντελεστή κόστους από 4 έως 14, ελέγξτε έναν κωδικό πρόσβασης με υπάρχον hash και δείτε έκδοση, κόστος, salt και digest.