In senso stretto, l'uso del termine "firma" su HMAC è improprio; è diffuso, ma non è corretto: le firme riguardano algoritmi asimmetrici con una chiave pubblica e una privata, come RSA.
HMAC usa una chiave segreta (cioè un mucchio di byte arbitrari) che viene usata per calcolare il MAC e per verificarlo (in realtà è verificato ricalcandolo). Quindi, nel tuo problema, sì, il server deve memorizzare la chiave segreta o alcuni dati sufficienti per ripristinarlo.
Si noti che la chiave segreta K può essere derivata da la password in modo non invertibile. Per esempio. tramite una funzione di hash o, meglio ancora, con una funzione di derivazione chiave . Il server memorizzerà la chiave K "in chiaro" e la chiave di conoscenza K è sufficiente per produrre valori HMAC validi. Tuttavia, questo costringe un utente malintenzionato a utilizzare un software specifico per questo, non il client standard che richiede una password utente. A seconda del contesto e del modello di attacco, questo può o non può essere un miglioramento della sicurezza.
Un modo per ottenere ciò che stai cercando, ma con una complessità più elevata di un semplice HMAC, è quello di utilizzare SRP . SRP è un protocollo di scambio di chiavi asimmetrico con autenticazione reciproca basata su password, con le seguenti caratteristiche:
- Nessuna necessità di distribuzione di chiavi pubbliche (PKI, certificati ...).
- Il client autentica il server e server autentica il client, nello stesso passaggio, anche in presenza di attaccanti attivi (gli attaccanti "Man-In-The-Middle" vengono sconfitti).
- Nessun attaccante attivo o passivo apprende informazioni sufficienti per eseguire attacchi di dizionario offline (un attacco di dizionario indovina la password provando parole casuali; l'attacco è offline se può essere fatto senza interagire con l'onesto client o server per ogni ipotesi).
- Ciò che il server memorizza non è sufficiente per imparare la password o impersonare il client (ma consente attacchi di dizionari offline, il che è inevitabile).
La chiave che risulta dal protocollo SRP può quindi essere utilizzata per un algoritmo MAC come HMAC. Non ha bisogno di essere archiviato: è semplicemente tenuto nella RAM per tutta la durata della sessione.
SRP può essere integrato in TLS, come spiegato in RFC 5054 . Il modo più semplice e standard supportato di utilizzare SRP nel proprio contesto sarebbe quello di utilizzare HTTPS (ad esempio HTTP all'interno di un tunnel SSL / TLS) con la parte TLS che utilizza SRP per lo scambio di chiavi. GnuTLS è un'implementazione opensource di SSL / TLS che supporta SRP.