2013-07-10 12 views
6

Sto cercando di implementare la richiesta HMACSHA256 in un'API che sto costruendo. Da quello che ho capito da https://tools.ietf.org/html/rfc4868, è meglio che la chiave segreta sia lo stesso numero di bit dell'algoritmo di hash (cioè le chiavi segrete SHA256 dovrebbero essere 256 bit/32 byte).Genera una chiave HMACSHA256 avanzata in C#

Posso utilizzare uno dei tanti generatori di numeri casuali diversi per C# oppure esiste un modo specifico per generare questi tasti.

Infine, Amazon Web Services utilizza HMACSHA256, ma le chiavi segrete essi forniscono (almeno per me) è 320 bit/40 byte (quando il tasto viene convertito in byte usando UTF-8, vedi https://github.com/aws/aws-sdk-net/blob/master/AWSSDK/Amazon.Runtime/Internal/Auth/AWS4Signer.cs#L205-L232). C'è un motivo per utilizzare più del necessario dall'algoritmo di hashing dal momento che è troncato?

risposta

5

Se una chiave è più lungo del HMAC sostiene, sarà di solito essere hash per la dimensione corretta. Questo è principalmente per supportare chiavi leggibili dall'uomo di lunghezza arbitraria. Se stai generando una chiave in modo programmatico e non ne hai bisogno per essere leggibile, ti consigliamo di utilizzare RandomNumberGenerator. Questo è fondamentalmente ciò per cui è stato creato.

using System.Security.Cryptography; 

RandomNumberGenerator rng = RandomNumberGenerator.Create(); 

byte[] data = new byte[32]; 
rng.GetBytes(data); 
10

Un modo per generare una chiave (presumibilmente sicuro) è:

var hmac = new HMACSHA256(); 
var key = Convert.ToBase64String(hmac.Key); 
+1

Base64 non è la stessa di Hex, IE il nome della variabile è fuorviante. – Peter

+1

@Peter, grazie per averlo indicato, ho modificato il nome della variabile. – Omar