It is secure to use the shared secret as the key for a HMAC? is it
better to derive one key for all of the messages that are going to be
HMACed or a key for each message?
Se usi la chiave solo per HMAC, puoi usare la chiave singola per più messaggi in modo sicuro . Molti protocolli di autenticazione che emettono token utilizzano una chiave per la firma di più token. JWT è uno di questi esempi. .NET ha la sua implementazione.
Ma tieni presente che nel caso in cui sia necessario crittografare e quindi HMAC il messaggio, è necessario utilizzare due chiavi diverse . È possibile ricavare questi due da un'unica chiave master condivisa. Vedi questo e questo .
C'è un approccio migliore però. Puoi utilizzare la GCM per la crittografia che farà esattamente quello che ti serve con un single chiave condivisa. Assicurati di usarlo correttamente, in particolare per quanto riguarda IV . Studia anche gli svantaggi e vedi se ti riguardano.
Is it safe to use the shared secret as the key for the symmetric
encryption after the shared secret has been exchanged using PKI?
Sì, questo è un approccio utilizzato in SSL / TLS per esempio .