Tengo una clave secreta k
y el mensaje m
. Envío m || HMAC(m, k)
a otra parte, que puede verificar la integridad de m, asumiendo que conocen k
.
Supongamos que tengo varios mensajes m1
, m2
, etc. ¿Cuál de las dos construcciones siguientes es mejor desde una perspectiva de seguridad global?
m1 || HMAC(m1, k) || m2 || HMAC(m1 || m2, k) || ...
o
m1 || HMAC(m1, k) || m2 || HMAC(m2, k) || ...
Obviamente, no necesitaré concatenar realmente m1 || m2
para generar HMAC(m1 || m2, k)
. Simplemente continúo usando el estado del HMAC a medida que se firman cada vez más mensajes. Así que el primer modo de operación es en realidad más eficiente y lo que preferiría usar. En el segundo caso, tengo que restablecer el estado HMAC antes del siguiente mensaje.
En lo que respecta al receptor, la primera autenticación de mensajes falla, ese es el final de la conversación. Por lo tanto, no gano nada al tener un HMAC válido para m2
si no se pudo autenticar m1
.
¿Es una de las construcciones inherentemente más segura que la otra? ¿Podría el primer modo de operación filtrar alguna información sobre la clave (en teoría)?