Sono un po 'confuso sul flusso di lavoro, quindi fammi sapere se sono fuori.
Credo che la situazione sia che comunichi con un servizio. Fai una richiesta al servizio e risponde, firmando la risposta con un HMAC. Successivamente, verifichi che HMAC sia corretto per garantire che la richiesta sia originata dal servizio (autenticità) e che non sia stata modificata da un intermediario (integrità).
Affinché un HMAC sia efficace, la chiave deve essere segreta . Se la chiave non è segreta, un utente malintenzionato può eseguire la modifica del messaggio o fingere di essere il servizio in modo tale che il destinatario non può dire che comunica di ricevere messaggi modificati o di non parlare con il partner desiderato. E se sei disposto a rinunciare all'integrità e all'autenticità, non ha senso usare l'HMAC. Quindi, la chiave HMAC deve essere segreta per essere efficace.
Esattamente quali protezioni sono appropriate per mantenere la chiave segreta dipende dall'applicazione. Ad esempio, l'archiviazione in una tabella di database può comportare l'esposizione se la tua applicazione presenta una vulnerabilità SQL Injection . Ciò mi sembra rischioso se si dispone di un'architettura che potrebbe essere vulnerabile a SQLi (considererei qualsiasi app che richiede l'input dell'utente e la utilizza come parte di una query SQL come potenzialmente vulnerabile a SQLi). La memorizzazione della chiave in un file su disco potrebbe essere vulnerabile a attacco di attraversamento del percorso .
Alla fine, nessun sistema sarà perfetto. Dovrai mettere a punto la quantità di sicurezza per la sensibilità della tua applicazione. Un trucco è combinare più misure di sicurezza , ad esempio, memorizzando una chiave HMAC crittografata nel database e memorizzandola la chiave per decodificarlo da qualche altra parte (forse un file al di fuori della tua web root). Quindi un utente malintenzionato dovrebbe ottenere sia la chiave crittografata HMAC che la sua chiave di decrittografia per eseguire un attacco riuscito. Quanto più è possibile separare la chiave HMAC e la sua chiave di decrittografia, tanto più sicura sarà la tua app (e meno conveniente diventerà l'implementazione e l'uso).