Estoy desarrollando un protocolo propio para el intercambio seguro de mensajes. Cada mensaje contiene los siguientes campos: HMAC, hora, sal y mensaje en sí. HMAC se calcula sobre todos los demás campos utilizando una clave secreta conocida.
El protocolo debería proteger contra el ataque de respuesta. En un intervalo de tiempo largo, el registro de "tiempo" protege contra el ataque de reproducción (ambos lados deben tener relojes sincronizados). Pero para protección contra ataques de repetición en cortos intervalos de tiempo (los relojes no son muy precisos) Estoy planeando reemplazar el campo "sal" con un contador que aumenta cada vez que se envía un nuevo mensaje. La parte receptora tirará los mensajes con un valor de contador menor o igual al contador del mensaje anterior.
¿Qué estoy haciendo mal?
El valor inicial del contador puede ser diferente (puedo usar el identificador de la parte como valor inicial), pero el atacante lo sabrá (el identificador de la parte se transmite en forma no cifrada). ( ¿Qué es una sal lo suficientemente buena para un SaltedHash? )
Pero el atacante puede calcular de antemano las tablas de arco iris para el contador + 1, el contador +2, el contador +3 ... ¿si no usaré sal realmente aleatoria?