Ho una chiave segreta k
e messaggio m
. Invio m || HMAC(m, k)
a un'altra parte, che può verificare l'integrità di m, supponendo che sappia k
.
Supponiamo di avere più messaggi m1
, m2
e così via. Quale delle seguenti due costruzioni è meglio da una prospettiva di sicurezza generale:
m1 || HMAC(m1, k) || m2 || HMAC(m1 || m2, k) || ...
o
m1 || HMAC(m1, k) || m2 || HMAC(m2, k) || ...
Ovviamente, non ho bisogno di concatenare effettivamente m1 || m2
per generare HMAC(m1 || m2, k)
. Continuo semplicemente a utilizzare lo stato dell'HMAC man mano che vengono firmati sempre più messaggi. Quindi la prima modalità operativa è in realtà più efficiente e ciò che preferirei usare. Nel secondo caso, devo resettare lo stato HMAC prima del prossimo messaggio.
Per quanto riguarda il ricevitore, la prima volta che l'autenticazione del messaggio fallisce, è la fine della conversazione. Quindi non guadagno nulla avendo un HMAC valido per m2
se m1
non può essere autenticato.
Una delle costruzioni è intrinsecamente più sicura dell'altra? La prima modalità di funzionamento potrebbe far trapelare qualsiasi informazione sulla chiave (in teoria)?