Come posso convalidare che i dati sensibili al tempo provengano da un'app mobile e non vengano falsificati?

4

Nella nostra applicazione, un utente seleziona le risposte alle domande. Il loro punteggio si basa sul tempo impiegato per rispondere a ogni domanda fino a un decimo di secondo. Il server è responsabile del calcolo e della memorizzazione del punteggio, ma ovviamente non può registrare il tempo esatto trascorso a causa della latenza.

In qualche modo, l'app mobile dovrà inviare al server il tempo necessario per rispondere alla domanda in base al proprio orologio. Come faccio a verificare che il valore di tale chiamata API non venga falsificato?

Immagino che, per lo meno, possiamo avere una stringa che è codificata in entrambe le applicazioni che crittografa / decrittografa i timestamp (AES è buono per questo?) ma questo non è sicuro al 100% come qualcuno potrebbe riuscire a ottenere quella stringa attraverso la decompilazione o qualsiasi altra cosa.

Dopodiché, potremmo misurare la latenza in una richiesta di test quando comunichiamo per la prima volta con l'app mobile. Quindi possiamo assicurarci che i tempi inviati siano all'interno di una finestra ragionevole basata su tale latenza. Per me questo sembra un po 'schizzinoso e impreciso. Sarebbe difficile decidere quale sarebbe la finestra dato che i valori sono così piccoli. Ad esempio, se sono necessari "5 s" per rispondere a una domanda con latenza di ~ 200 ms, la finestra 6 è la finestra? 7? 10? Se la finestra è troppo grande, la contraffazione varrebbe comunque la pena. Troppo piccolo e potresti incasinare gli utenti legittimi che hanno appena avuto un secondo di ritardo o altro.

C'è una soluzione robusta? La crittografia / decrittografia sarebbe "abbastanza sicura"?

    
posta Logan Serman 01.05.2014 - 01:38
fonte

2 risposte

2

Come altri hanno notato non puoi mai fidarti del cliente , mai. Puoi renderlo difficile per le persone ma ci saranno sempre attacchi che possono eseguire:

  • Aumenta artificialmente la misura del tempo di andata e ritorno (RTT)
  • Estrai chiavi di crittografia
  • Modifica gli orologi locali

Monitoraggio di comportamento sospetto / irregolarità temporali può essere possibile anche se estremamente difficile. Ad esempio, quali sono le tipiche RTT per le persone in una determinata rete / posizione e qual è la varianza tipica in questo? (ad esempio rilevamento di anomalie statistiche: link )

Una combinazione di difficoltà e individuazione di anomalie sarebbe probabilmente la migliore che si possa fare in modo che qualcuno faccia un grande sforzo, e poi i loro punteggi cancellati e il conto sospeso per un po '- simile al fallimento di un test antidoping. ..

    
risposta data 31.07.2014 - 13:28
fonte
0

Non utilizzerei la crittografia simmetrica, per la ragione che dici: si potrebbe estrarre questa chiave. È possibile memorizzare gli intervalli di tempo localmente e inviarli utilizzando la crittografia asimmetrica;

  1. la richiesta viene crittografata utilizzando la chiave pubblica dei server; quindi non si può a un MitM cambiare i loro timestamp.
  2. il tuo cliente "firma" la richiesta, quindi sei sicuro * che provenga dal client.

*: puoi essere sicuro solo fino a quando qualcuno non esegue il reverse engineering della loro applicazione ed estrai la chiave privata dalla tua app. Il modo migliore (se non solo) ancora una volta sarebbe quello di offuscare questa informazione; crea una chiave sull'inizializzazione dell'app, memorizzala crittografata / codificata / offuscata ... e impiega tecniche anti debugging.

Anche se si estrae la chiave, è possibile revocare il certificato dell'utente e non compromettere il resto.

    
risposta data 01.05.2014 - 07:11
fonte

Leggi altre domande sui tag