Ho un'app che utilizza un server API e non voglio avere altro che essere in grado di usare quell'API. So che questo non è del tutto possibile, ma voglio fare quello che posso.
Non penso che il mio attuale metodo per ottenere questo risultato sia il più grande e mi piacerebbe recuperarlo e ricominciare da capo. Ecco come funziona:
- L'app preleva una stringa da un set che chiamerò "entropia".
- Usando quella stringa fa un hash della data UTC corrente usando l'entropia come sale
- Invia quell'hash al server API che crea l'hash utilizzando ogni possibile entropia dal set fino a quando trova una corrispondenza
- Se trova una corrispondenza, viene generata una chiave API per l'app e restituita.
Il server memorizza la stringa entropy, la chiave API, così come IDFV in un database.
Quando l'app effettua una richiesta, invia la propria chiave API, IDFV e un token al portatore. Il token bearer è un hash dell'URL con la stringa entropy come salt.
Quando il server riceve una richiesta:
- Seleziona la stringa entropy dal database utilizzando la chiave API e IDFV come parametri di ricerca.
- Genera il proprio portatore usando l'URL a cui risponde e l'entryopy da quanto sopra seleziona.
- Verifica che le stringhe di entropia corrispondano
Se la query select non restituisce nulla, o se i portatori non corrispondono, il server restituirà un 403 e non procederà.
I problemi di cui sono preoccupato sono:
- Se l'utente ha una data errata sul proprio dispositivo, la registrazione fallirà. Allo stesso modo,
- Se il server ha una data errata, la registrazione fallirà
- Se l'app inizia la registrazione alle 23:59:59 e c'è un ritardo di 1 secondo sul server (che su 3G è del tutto plausibile), la registrazione fallirà
- Con un elenco codificato di stringhe entropiche, l'app può essere decompilata e le stringhe estratte
- Con solo un numero limitato di stringhe entropiche è possibile trovarle tutte con un tempo sufficiente.
Alcune delle cose che ho preso in considerazione:
- Tutte le richieste e le risposte vengono pubblicate su HTTPS
- Il server API limita le richieste per ostacolare i tentativi di forza bruta
- Il server API è dietro a CloudFlare per fare anche una prevenzione di attacco di base.
Quello che voglio sapere è quale sarebbe un modo migliore per fare ciò che non richiede alcuna interazione utente aggiuntiva? L'app per iOS è costruita usando Objective-C e il server API è costruito usando Ruby.