Perché la funzione scrypt node.js usa HMAC in questo modo?

8

In base alla documentazione , la funzione di hash scrypt funziona in questo modo:

The hash function does the following:

  • Adds random salt.
  • Creates a HMAC to protect against active attack.
  • Uses the scrypt key derivation function to derive a hash for a key.

Hash Format

All hashes start with the word "scrypt". Next comes the scrypt parameters used in the key derivation function, followed by random salt. Finally, a 256 bit HMAC of previous content is appended, with the key for the HMAC being produced by the scrypt key derivation function. The result is a 768 bit (96 byte) output:

  1. bytes 0-5: The word "scrypt"
  2. bytes 6-15: Scrypt parameters N, r, and p
  3. bytes 16-47: 32 bits of random salt
  4. bytes 48-63: A 16 bit checksum
  5. bytes 64-95: A 32 bit HMAC of bytes 0 to 63 using a key produced by the scrypt key derivation function.

Bytes 0 to 63 are left in plaintext. This is necessary as these bytes contain metadata needed for verifying the hash. This information not being encrypted does not mean that security is weakened. What is essential in terms of security is hash integrity (meaning that no part of the hashed output can be changed) and that the original password cannot be determined from the hashed output (this is why you are using scrypt - because it does this in a good way). Bytes 64 to 95 is where all this happens.

La mia domanda è: perché usa l'hash scrypt come chiave per l'algoritmo HMAC piuttosto che semplicemente restituendo direttamente l'hash dello scrypt? Quale ulteriore protezione fornisce? Menziona "attacchi attivi" ma non fornisce dettagli.

    
posta ChrisD 07.05.2015 - 08:23
fonte

2 risposte

17

Ho creato il modulo Node Scrypt.

HMAC aggiunge ulteriore sicurezza. Usandolo si presta anche a utilizzare lo schema come intestazione in un formato di file crittografato (come avviene in tarsnap) e non solo nel database di un server di autenticazione. Inoltre, Colin Percival (che ha creato lo scrypt) utilizza questo schema per verificare (in realtà l'ho appena copiato da lui).

Per spiegare perché viene utilizzato HMAC, facciamo un rapido riassunto. Quando si cripta qualcosa usando la funzione di derivazione della chiave scrypt, viene prodotto un risultato di 96 byte con la seguente suddivisione:

 bytes 0-5: The word "scrypt"
 byte 6: 0
 byte 7: logN
 bytes 8-11: r
 bytes 12-15: p
 bytes 16-47: salt (which is 32 bytes)
 bytes 48-63: A 16 byte SHA256 checksum (hash) of the contents of bytes 0 to 47
 bytes 64-95: A 32 byte HMAC hash of bytes 0 to 63 with the key being the scrypt cryptographic hash

È fondamentale che i byte da 0 a 47 siano in chiaro (non alterati o criptati in alcun modo). Per garantire ciò, esiste un checksum SHA256 da 16 byte. Ora, mentre lo SHA può essere usato in modo abbastanza efficace come somma di controllo (specialmente in questo caso), non può difendersi da un attacco attivo, il che significa che qualcuno ha preso possesso del carico utile, sostituendo i propri valori. Per esempio, potrei prendere in mano il carico utile, calcolare il mio logN, r e p come pure il mio checksum e poi passarlo come originale.

Per evitare che ciò accada, gli ultimi 32 byte sono HMAC. HMAC è usato per garantire l'integrità dei messaggi (ad esempio, le guardie contro chiunque modifichi attivamente un carico utile) ed è un cavallo di battaglia dell'arsenale crittografico (leggi: è sicuro e sicuro da usare). HMAC richiede una chiave e usiamo l'hash scrypt come chiave.

Se gli ultimi 32 byte fossero solo un hash di scritatura, nulla avrebbe impedito a un aggressore attivo di essere in grado di compromettere tutto e sostituire il proprio hash di scrypt. L'HMAC protegge contro. Non serve solo come mezzo per verificare l'hash scrypt, ma controlla anche l'integrità dell'intero schema.

BTW: le persone potrebbero chiedersi perché sia richiesto il checksum (byte da 48 a 63). Bene, se ci pensate, dobbiamo calcolare l'hash scrypt in modo che possa essere usato come chiave per l'HMAC. Quindi il checksum aggiunge un ulteriore livello di controllo: se non viene eseguito il pan out, la verifica restituisce immediatamente false senza andare oltre.

    
risposta data 08.06.2015 - 06:37
fonte
2

Viene spiegato più avanti nella documentazione:

If your interested in this module is to produce hashes to store passwords, then I strongly encourage you to use the hash function. The key derivation function does not produce any message authentication code to ensure integrity. You will also have to store the scrypt parameters separately. Lastly, there is no native verify function included in this module.

Se tutto ciò che vuoi è derivare una chiave usando l'algoritmo scrypt, puoi farlo con la funzione KDF incluso anche in questo pacchetto.

La cosiddetta funzione di hash in questo pacchetto è un wrapper in cima alla funzione di hash scrypt originale.

    
risposta data 07.05.2015 - 13:33
fonte

Leggi altre domande sui tag