Middle
Τι είναι το HMAC και πώς χρησιμοποιείται;
sobes.tech AI
Απάντηση από AI
HMAC (Hash-based Message Authentication Code) είναι ένας μηχανισμός για τον έλεγχο της ακεραιότητας και αυθεντικότητας ενός μηνύματος χρησιμοποιώντας ένα μυστικό κλειδί και μια κρυπτογραφική συνάρτηση κατακερματισμού.
Αλγόριθμος λειτουργίας:
- Δημιουργία εσωτερικών και εξωτερικών κλειδιών από το μυστικό κλειδί και σταθερές (
ipad,opad). - Υπολογισμός εσωτερικού hash:
hash(μυστικό κλειδί XOR ipad + μήνυμα). - Υπολογισμός εξωτερικού hash:
hash(μυστικό κλειδί XOR opad + εσωτερικό hash). Αυτό είναι το HMAC.
Χρήσεις:
- Ταυτοποίηση αιτημάτων API: Ο διακομιστής και ο πελάτης μοιράζονται ένα κοινό μυστικό κλειδί. Ο πελάτης υπολογίζει το HMAC για τα δεδομένα του αιτήματος και το στέλνει στην επικεφαλίδα. Ο διακομιστής υπολογίζει το ίδιο HMAC με τα ίδια δεδομένα και κλειδί και το συγκρίνει με την αποσταλμένη τιμή. Αν ταιριάζουν, το αίτημα θεωρείται αυθεντικό.
- Έλεγχος ακεραιότητας δεδομένων: Αν το HMAC του μηνύματος ταιριάζει με το επανυπολογισμένο HMAC, μπορεί κανείς να είναι σίγουρος ότι τα δεδομένα δεν έχουν τροποποιηθεί κατά τη μετάδοση.
- Χρήση σε JSON Web Tokens (JWT): Το HMAC συχνά χρησιμοποιείται ως αλγόριθμος ψηφιακής υπογραφής (HS256, HS384, HS512) για την εξασφάλιση της ακεραιότητας των δεδομένων του token.
Παράδειγμα υλοποίησης (ψευδοκώδικας):
function hmacSHA256(key, message) {
// Σταθερές padding
const blockSize = 64; // για SHA-256
const ipad = 0x36;
const opad = 0x5c;
// Προετοιμασία κλειδιού
let paddedKey = key;
if (key.length > blockSize) {
paddedKey = sha256(key);
}
while (paddedKey.length < blockSize) {
paddedKey += 0x00;
}
// Εσωτερικό hash
const innerPaddedKey = xor(paddedKey, ipad);
const innerHash = sha256(innerPaddedKey + message);
// Εξωτερικό hash (HMAC)
const outerPaddedKey = xor(paddedKey, opad);
const hmac = sha256(outerPaddedKey + innerHash);
return hmac;
}
// Στα πραγματικά βιβλιοθήκες, η υλοποίηση είναι βελτιστοποιημένη και διαφέρει
Η βασική διαφορά από το απλό hash με κλειδί (hash(κλειδί + μήνυμα) ή hash(μήνυμα + κλειδί)) είναι ότι το HMAC είναι ανθεκτικό σε επιθέσεις επέκτασης μηνυμάτων, καθώς χρησιμοποιεί δύο φάσεις hash με διαφορετικές σταθερές padding.