Creazione corretta della chiave hash_hmac

2

Sto cercando, ma non riesco a trovare, alcune informazioni definitive su quanto tempo rendere segreto e quali caratteri sono utilizzabili nella creazione di una firma HMAC in PHP usando SHA256.

Ho trovato alcune informazioni on stackoverflow ma non sono ancora sicuro di quanto tempo dovrebbe essere la chiave. In questo contesto è 1 carattere 1 bit? La mia chiave dovrebbe essere a-f0-9 e 256 caratteri?

Sto solo cercando di ottenere che la firma del messaggio sia fatta correttamente. Grazie.

    
posta Erik 20.09.2012 - 16:45
fonte

3 risposte

2

HMAC usa come chiave una sequenza di byte arbitrari e di lunghezza arbitraria. Alcune implementazioni di HMAC / SHA-256 possono (indebitamente) rifiutare chiavi più lunghe di 32 byte.

La tua chiave dovrebbe essere tale che sia troppo difficile trovarla con una ricerca esauriente con probabilità di successo non trascurabile. Se la tua chiave proviene da una strong fonte di byte casuali (ad esempio /dev/urandom ), allora sono sufficienti 16 byte. Se la chiave proviene da un dispositivo di calcolo biologico (cioè il cervello di un essere umano), allora si torna all'intera problematica delle password (che è meglio evitare se possibile).

    
risposta data 20.09.2012 - 16:58
fonte
1

La funzione hash_hmac prende l'input binario, cioè le stringhe fatte di byte non elaborati. La codifica dei caratteri non dovrebbe entrare in gioco.

Ad esempio, se si dovesse usare SHA256 per calcolare la chiave HMAC, da una password, si farebbe qualcosa del genere:

// second parameter selects raw bytes or ASCII hex for output (false = hex, true = raw)
$hmac_key = hash("sha256", $password, true);
// last parameter is, again, whether or not to output raw bytes
echo hash_hmac("sha256", $data, $hmac_key, false);

Supponendo che la password sia "polinomiale", la variabile $hmac_key dovrebbe essere:

61890d2331f470cb4caeda6035ae27809bee14a42ba3e024ebcfeec9086764d0

Si noti che questa è una rappresentazione esadecimale del contenuto della variabile - in realtà conterrà byte non elaborati. Ora supponiamo che il nostro messaggio sia "Salve!". Il risultato è il seguente:

e075d7284eb03baedabb7c27ae1e9f271e763b67c776f3894417f310378da10b

(il precedente è stato generato da QuickHash )

Gli schemi HMAC richiedono che la lunghezza della chiave sia uguale alla dimensione del blocco dell'hash. Alcune implementazioni utilizzano un algoritmo hash per produrre la dimensione corretta se l'input è maggiore o minore della dimensione del blocco. Di solito l'algoritmo hash utilizzato è la versione non HMAC di qualunque cosa tu stia usando. Non sono sicuro che PHP lo faccia e (se lo fanno) quale metodo usano.

    
risposta data 20.09.2012 - 16:55
fonte
1

Dipende dal livello di sicurezza desiderato. Si consiglia di utilizzare SHA256 algo con e una chiave lunga almeno 256 bit per raggiungere un livello di sicurezza a 128 bit (ad esempio contro gli attacchi di compleanno). Stavi citando dei personaggi ma è importante notare che una chiave è binaria e non dovresti limitarti a caratteri leggibili dall'uomo.

    
risposta data 22.09.2012 - 10:40
fonte

Leggi altre domande sui tag