Ho un classico problema di sicurezza in cui Alice deve dimostrare la propria identità a Bob ma con requisiti e vincoli piuttosto insoliti a causa di un contesto M2M .
EDIT in grassetto
Il canale di comunicazione utilizzato tra Alice e Bob ha le seguenti caratteristiche:
- solo Alice può inviare messaggi a Bob (Bob non può parlare con Alice) I messaggi
- di Alice sono lunghi 4 byte
- Bob interrompe l'ascolto durante 10 minuti dopo aver ricevuto 10 messaggi
- Alice deve dimostrare la propria identità utilizzando un solo messaggio, se possibile
Altri requisiti specifici sono:
- Alice ha una CPU bassa & memoria , Bob ha una CPU elevata & memoria risorse
- Il messaggio deve includere l'identità di Alice, ma senza la necessità di nasconderlo
- Esiste un numero illimitato di entità Bob
- C'è < 4000 entità come Alice che possono autenticare qualsiasi Bob
- Gli attacchi di replica devono essere ragionevolmente prevenuti (un replay può essere possibile durante alcuni minuti dopo l'emissione ma non di più)
- Va bene che Bob venga ingannato dalla forza bruta, a patto che ci sia bisogno di tempo all'avversario per farlo (cioè diversi giorni di calcolo o di nuovo tentativo)
Ecco cosa mi è venuto in mente per il messaggio Alice 4 bytes:
bits 1-20 = truncate(HMAC(date.format(dd/MM/yy hh:mm)),20)
bits 21-32 = Alice ID (12bits = 4096 IDs)
Quando Bob riceve il messaggio, se consentiamo la deviazione di X minuti tra l'orologio di Alice e quello di Bob, Bob calcola
truncate(HMAC(date.format(dd/MM/yy hh:mm)),20)
per X / 2 minuti dopo e prima della ricezione. Quindi, ad es. X = 10 minuti, Bob calcola 10 valori. Se uno di questi valori corrisponde all'emissione di Alice, Alice viene autenticata.
L'avversario ha X / 2 ^ 20 possibilità di generare in modo casuale il buon messaggio. Poiché Bob ascolta solo 10 messaggi ogni 10 minuti, in media occorrono circa 73 giorni se la matematica è corretta (per X = 10 minuti), il che va bene.
L'attacco di riproduzione è possibile durante X / 2 minuti.
Le maggiori possibilità di collisione introdotte dal troncamento dell'HMAC a 20 bit non compromettono la chiave privata né riducono il livello di sicurezza del processo AFAIK.
Sono uno sviluppatore, non un ragazzo di sicurezza, la mia soluzione è ragionevole e la mia analisi è corretta? Ne vedi uno migliore?