La chiave segreta per HMAC sotto forma di caratteri UTF8 è sufficiente?

3

C'è una popolare libreria JWT su nuget. Sto analizzando un'applicazione che utilizza quella libreria e memorizza una chiave segreta come una stringa. Nel codice della libreria vedo che utilizza MS HMACSHA256 che accetta l'array di byte come chiave. Quindi la libreria fa Encoding.UTF8.GetBytes(key) per passare la chiave segreta alla libreria.

Poiché la codifica UTF8 significa di solito una struttura (ad esempio alcune sequenze di byte non corrispondono a nessuno dei caratteri stampabili), rispetto a qualche Base64 che può avere una sequenza di byte casuale, non significa che questa chiave è più prevedibile che dovrebbe essere?

Può essere ancora abbastanza sicuro, a patto che sia stata generata la chiave corretta, e come dovrebbe essere generata in questo caso?

    
posta Ilya Chernomordik 08.02.2016 - 12:49
fonte

1 risposta

2

Suppongo qui che key sia qualcosa di statico a livello di sistema, e non qualcosa che sceglie un singolo utente - se è così, è molto strano che sia letto come UTF-8 piuttosto che Base64 perché UTF-8 sarà un meccanismo di archiviazione inefficiente per la chiave in quanto non utilizzerà lo spazio chiavi completo. Lo metterei all'ingenuità dello sviluppatore piuttosto che a qualcosa di fuori ragione.

Questo metodo avrebbe più senso se fosse per una chiave scelta dall'utente, in quanto potrebbero aver inserito caratteri unicode come chiave, e quindi se è memorizzato e letto come UTF-8 può quindi essere messo in una chiave- funzione di stretching come PBKDF2. Qui l'obiettivo non è una memorizzazione efficiente, sarebbe semplicemente fare in modo che una chiave scelta dall'utente abbia abbastanza entropia per essere utile.

won't it mean that this key is more predictable that it should be?

Quando il tasto entra nella funzione HMAC, viene cancellato insieme al messaggio. Il fatto che provenga da una stringa UTF-8 non dovrebbe rendere più prevedibili gli HMAC risultanti, né dovrebbe rendere più semplice la forzatura della chiave. Finché la stringa originale ha abbastanza entropia all'inizio, non importa quale formato è stata convertita per la memorizzazione.

Can it still be secure enough provided the proper generation of this key, and how should it be generated in this case?

Da questa risposta , sarebbe raccomandato un valore casuale a 128 bit generato tramite un generatore di numeri pseudo casuali crittograficamente sicuro per la chiave. Il CSPRNG genererebbe una sequenza di byte, quindi potrebbe essere Base64'd e quindi memorizzato come UTF-8, anche se lo spazio delle chiavi non viene mai riempito completamente. Sarebbe meglio se il passaggio UTF-8 potesse essere completamente rimosso, anche perché aggiunge complessità non necessaria.

    
risposta data 08.02.2016 - 20:44
fonte

Leggi altre domande sui tag