Se questo è per le app native , puoi provare quanto segue,
- Archivia una chiave di accesso nel tuo pacchetto di app. Nessuno a parte il proprietario dell'app (te stesso) può avere questo.
- Modifica la tua API in modo che solo le richieste con la chiave di accesso impostata nell'intestazione abbiano esito positivo.
- Utilizza HTTPS in modo che nessuno possa leggere la chiave di accesso crittografata.
Se non utilizzi HTTPS, puoi ancora hash manualmente la chiave di accesso con qualcosa nell'intestazione (solo la logica del server e della app sa come) in modo che l'uomo nel mezzo non possa fingere di essere la tua app.
Se questo è per applicazioni web pure,
Per prima cosa suggerirei di avvolgere l'app web pura all'interno di un'app nativa (a.k.a. Hybrid app) in modo da poter ottenere la protezione descritta sopra, raggruppando una chiave segreta all'interno dell'app. Lo sviluppo di un'app nativa con una singola vista web all'interno non dovrebbe costare troppo.
Tuttavia, se ciò non è possibile, la tua app rimane una pura app web - questa è un'opzione potenziale,
- Quando il server serve l'app Web, fornire un codice di accesso.
- Quando l'app Web effettua chiamate API, è necessario fornire una versione hash della chiave di accesso.
- In che modo gli hash delle app Web dipendono dalla logica implementata in codici miniati + offuscati.
- L'API di back-end quindi convalida l'hash applicando la stessa logica nascosta alla chiave di accesso archiviata per calcolare l'hash e verificare se corrisponde.
- Puoi modificare la logica nascosta e la chiave di accesso con la frequenza necessaria per ridurre la possibilità che qualcuno ottenga l'hash giusto.
Ovviamente non è a prova di proiettile, ma come sapete, non esiste una sicurezza perfetta e questo probabilmente raggiunge lo scopo (e si spera che risponda al conto). Direi che l'ibrido è più economico però.