Quali sono i requisiti per la chiave segreta HMAC?

41

Sto creando un servizio HTTP REST che sarà disponibile solo su tls.

Per scopi di autenticazione, ho intenzione di generare un token JWT per ogni utente utilizzando HMAC HS256 . Ho bisogno di una chiave segreta per HMAC.

Quali sono i requisiti per chiave segreta ?

Ho bisogno di una lunga serie di caratteri casuali? O una stringa a lunghezza fissa? O che cosa?

    
posta ivstas 05.08.2015 - 12:49
fonte

4 risposte

34

Ho aggiunto la mia risposta qui perché ritengo che quelli esistenti non indirizzino direttamente la tua domanda abbastanza per i miei gusti.

Diamo un'occhiata a RFC 4868 (riguardante IPSec, tuttavia copre la funzione HMAC-SHA256 che intendi da usare - em mine ):

Block size: the size of the data block the underlying hash algorithm operates upon. For SHA-256, this is 512 bits, for SHA-384 and SHA-512, this is 1024 bits.

Output length: the size of the hash value produced by the underlying hash algorithm. For SHA-256, this is 256 bits, for SHA-384 this is 384 bits, and for SHA-512, this is 512 bits.

Come note WhiteWinterWolf , più lungo di B è sconsigliato perché il valore deve essere sottoposto a hash con SHA-256 prima ( vale a dire 512 bit in questo caso) e meno di L è scoraggiato (256 bit in questo caso). Tuttavia, una chiave a 256 bit è eccessiva poiché qualsiasi cosa di 128 bit o superiore non può essere forzata brutale nella vita corrente di nessuno, anche se ogni computer nel mondo stava lavorando per craccarlo.

Quindi raccomanderei una chiave a 128 bit, generata con un generatore di numeri pseudocasuali crittograficamente sicuro (CSPRNG). Se si desidera archiviare questo come testo, è possibile rappresentare una chiave a 128 bit generando una stringa esadecimale casuale di 32 caratteri, oppure in alternativa è possibile generare 16 byte casuali e quindi eseguirli tramite una funzione base64.

    
risposta data 07.08.2015 - 12:05
fonte
9

La RFC 2104 che definisce le funzioni HMAC risponde a questa domanda:

The key for HMAC can be of any length (keys longer than B bytes are first hashed using H). However, less than L bytes is strongly discouraged as it would decrease the security strength of the function. Keys longer than L bytes are acceptable but the extra length would not significantly increase the function strength. (A longer key may be advisable if the randomness of the key is considered weak.)

Keys need to be chosen at random (or using a cryptographically strong pseudo-random generator seeded with a random seed), and periodically refreshed. (Current attacks do not indicate a specific recommended frequency for key changes as these attacks are practically infeasible. However, periodic key refreshment is a fundamental security practice that helps against potential weaknesses of the function and keys, and limits the damage of an exposed key.)

Per informazioni, la seguente notazione è utilizzata in questo estratto:

We assume H to be a cryptographic hash function where data is hashed by iterating a basic compression function on blocks of data. We denote by B the byte-length of such blocks (B=64 for all the above mentioned examples of hash functions), and by L the byte-length of hash outputs (L=16 for MD5, L=20 for SHA-1).

    
risposta data 05.08.2015 - 13:49
fonte
9

In base a RFC 7518 - JSON Web Algorithms (JWA):

A key of the same size as the hash output (for instance, 256 bits for "HS256") or larger MUST be used with this algorithm. (This requirement is based on Section 5.3.4 (Security Effect of the HMAC Key) of NIST SP 800-117 (sic) [NIST.800-107], which states that the effective security strength is the minimum of the security strength of the key and two times the size of the internal hash value.)

Quindi nel caso di JWT, DEVE usare una chiave di almeno 256 bit con HS256.

    
risposta data 31.12.2016 - 20:17
fonte
1

EDIT: risposta sbagliata. Non cancellato per preservare il thread dei commenti.

Le chiavi di input utente HMAC più lunghe degli algoritmi di hash specifici vengono prima ridotte. (Eseguendo i tasti lunghi attraverso l'hash e usando l'hash come chiave effettiva.)

SHA256 emette hash a 256 bit. Quello è 32 byte. Quindi suggerisco di generare chiavi segrete HMAC a 256 bit. (Usando un generatore casuale protetto da crittografia.) Le chiavi non offriranno più sicurezza aggiuntiva.

    
risposta data 05.08.2015 - 13:07
fonte

Leggi altre domande sui tag