Ho un'architettura client / server che invia periodicamente pacchetti UDP molto piccoli (circa 10 byte) avanti e indietro, che mi piacerebbe autenticare senza un grande sovraccarico di larghezza di banda o elaborazione. Nota che non mi interessa un avversario che vede il testo in chiaro, solo che mi piacerebbe impedire loro di modificare e ritrasmettere i pacchetti.
Ecco il processo che sto immaginando:
- L'utente si autentica con un nome utente / password su HTTPS. Niente di straordinario qui.
- Il server risponde con un messaggio di successo e N byte (forse circa 32 byte) di dati casuali generati crittograficamente. Sia il client che il server ricordano questa stringa di dati come
common_secret
. - A questo punto la connessione HTTPS viene chiusa e tutte le ulteriori comunicazioni avverranno tramite piccoli pacchetti UDP, utilizzando questo schema per l'autenticazione:
-
packet = plaintext + sha2(plaintext + common_secret)
- Alla ricezione di un pacchetto, il server calcolerà lo stesso
sha2
dal testo in chiaro e il suocommon_secret
, e verificherà che corrisponda all'hash alla fine del pacchetto.
Un avversario non sarà in grado di costruire un pacchetto valido senza conoscere common_secret
. Si tratta di uno schema di autenticazione valido?