Sobes.tech
Middle

Τι είναι το HMAC και πώς χρησιμοποιείται;

sobes.tech AI

Απάντηση από AI

HMAC (Hash-based Message Authentication Code) είναι ένας μηχανισμός για τον έλεγχο της ακεραιότητας και αυθεντικότητας ενός μηνύματος χρησιμοποιώντας ένα μυστικό κλειδί και μια κρυπτογραφική συνάρτηση κατακερματισμού.

Αλγόριθμος λειτουργίας:

  1. Δημιουργία εσωτερικών και εξωτερικών κλειδιών από το μυστικό κλειδί και σταθερές (ipad, opad).
  2. Υπολογισμός εσωτερικού hash: hash(μυστικό κλειδί XOR ipad + μήνυμα).
  3. Υπολογισμός εξωτερικού 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.