Middle
Wat is HMAC en hoe wordt het gebruikt?
sobes.tech AI
Antwoord van AI
HMAC (Hash-based Message Authentication Code) is een mechanisme om de integriteit en authenticiteit van een bericht te controleren met behulp van een geheime sleutel en een cryptografische hashfunctie.
Werking:
- Vorming van interne en externe sleutels uit de geheime sleutel en constanten (
ipad,opad). - Berekening van de interne hash:
hash(geheime sleutel XOR ipad + bericht). - Berekening van de externe hash:
hash(geheime sleutel XOR opad + interne hash). Dit is HMAC.
Gebruik:
- Authenticatie van API-verzoeken: De server en de client delen een gedeelde geheime sleutel. De client berekent de HMAC voor de gegevens van het verzoek en stuurt deze in de header. De server berekent de HMAC met dezelfde gegevens en sleutel en vergelijkt deze met de verzonden waarde. Als ze overeenkomen, wordt het verzoek als authentiek beschouwd.
- Controle van gegevensintegriteit: Als de HMAC van het bericht overeenkomt met de opnieuw berekende HMAC, kan men er zeker van zijn dat de gegevens niet tijdens de overdracht zijn gewijzigd.
- Gebruik in JSON Web Tokens (JWT): HMAC wordt vaak gebruikt als algoritme voor digitale handtekeningen (HS256, HS384, HS512) om de integriteit van de tokengegevens te waarborgen.
Voorbeeld van implementatie (pseudocode):
function hmacSHA256(key, message) {
// Padding-constanten
const blockSize = 64; // voor SHA-256
const ipad = 0x36;
const opad = 0x5c;
// Voorbereiding van de sleutel
let paddedKey = key;
if (key.length > blockSize) {
paddedKey = sha256(key);
}
while (paddedKey.length < blockSize) {
paddedKey += 0x00;
}
// Interne hash
const innerPaddedKey = xor(paddedKey, ipad);
const innerHash = sha256(innerPaddedKey + message);
// Externe hash (HMAC)
const outerPaddedKey = xor(paddedKey, opad);
const hmac = sha256(outerPaddedKey + innerHash);
return hmac;
}
// In echte bibliotheken is de implementatie geoptimaliseerd en verschillend
Het belangrijkste verschil met eenvoudige hashing met sleutel (hash(sleutel + bericht) of hash(bericht + sleutel)) is dat HMAC bestand is tegen length extension-aanvallen, omdat het twee hash-fases gebruikt met verschillende padding-constanten.