Sto sviluppando un proprio protocollo per lo scambio sicuro di messaggi. Ogni messaggio contiene i seguenti campi: HMAC, ora, sale e messaggio stesso. HMAC è calcolato su tutti gli altri campi utilizzando la chiave segreta conosciuta.
Il protocollo dovrebbe proteggere dagli attacchi di risposta. In caso di intervallo di tempo elevato, il record "time" protegge dall'attacco di replay (entrambi i lati dovrebbero avere orologi sincronizzati). Ma per proteggersi da attacchi replay su brevi intervalli di tempo (gli orologi non sono troppo precisi) sto pianificando di sostituire il campo "salt" con contatore crescente ogni volta, quando viene inviato un nuovo messaggio. La parte ricevente getterà via messaggi con valore contatore inferiore o uguale al contatore dei messaggi precedente.
Cosa sto facendo male?
Il valore iniziale del contatore può essere diverso (posso usare l'identificatore della parte come valore iniziale), ma sarà noto all'attaccante (identificatore della parte trasmesso in forma non crittografata). ( Cos'è un sale abbastanza buono per un SaltedHash? )
Ma l'attaccante può precomputare le tabelle arcobaleno per il contatore + 1, contatore + 2, contatore + 3 ... se non userò sale veramente casuale?