Non appena si rilascia l'applicazione, potrebbe essere retroingegnerizzata. Ciò significa che non c'è nulla che tu possa fare per essere protetto al 100% se la stessa applicazione (stessi binari, stesse impostazioni) è distribuita a tutti i tuoi utenti.
Se puoi personalizzare l'applicazione per ogni utente, allora hai forse la possibilità di non vietare ad altre applicazioni di usare la tua API, ma almeno limitare questa applicazione in base al numero di richieste che può fare all'API.
Immagina il seguente schema:
- Il client si connette e invia il proprio identificativo univoco (un identificatore per utente).
- Il server risponde inviando una richiesta crittografata con una chiave pubblica. Questa chiave pubblica è associata all'identificatore univoco precedentemente inviato.
- Il client risolve la sfida decodificando i dati utilizzando una chiave privata e invia il segreto decrittografato in chiaro al server.
- Il server verifica che il segreto inviato corrisponda a quello originariamente generato.
Lo sviluppatore che hackererà la tua applicazione e otterrà correttamente la chiave privata sarebbe in grado di utilizzare la tua API dalla sua stessa applicazione, ma sarà identificatore come se stesso per il tuo server.
Se lo stesso utente può fare 10.000 richieste all'API al giorno e in media, un utente attivo effettua 2 000 richieste al giorno, significa che questo sviluppatore sarebbe in grado di utilizzare la sua applicazione da solo e magari di darla ai suoi amici, ma non sarebbe in grado, diciamo, di venderlo a migliaia di persone, solo perché funzionerà solo per pochi minuti al mattino.
Anche se questo aiuta, non è nemmeno una prova al 100%. Cosa succede se l'hacker trova un modo per estrarre la chiave privata dalla tua app quando la sua app è installata sul dispositivo?
Nota a margine che non risponde alla tua domanda, ma potrebbe comunque essere utile: non pensare a un'API come strumento per il tuo prodotto principale (applicazione mobile). Pensalo come un prodotto di prima classe , un prodotto che può essere pagato. Lo stesso modello viene utilizzato da anni da Amazon e Google, inizia a essere attivamente utilizzato da Microsoft con Azure, ecc.
Non appena consideri l'API non come uno strumento secondario ridotto in schiavitù per le tue splendide nuove app mobili, ma il prodotto reale, allo stesso livello di qualsiasi applicazione che l'utente vede effettivamente, inizi a pensare meno a come proteggere l'API contro l'utilizzo da parte di altre app e altro sulla monetizzazione dell'API stessa. Tale API può essere utilizzata dalle tue app che sono i suoi clienti o qualsiasi altra app, sviluppata liberamente da chiunque. Ciò ha diversi vantaggi:
Creare un'API in modo che venga utilizzata solo dalle tue applicazioni è difficile e costoso. Questa volta e denaro possono essere utilizzati per qualcosa di più utile.
Aprire la tua API al pubblico può avere un grande vantaggio sia per te che per il mondo. Immagina di essere un grande architetto e un grande sviluppatore, quindi hai creato un'API sorprendentemente eccezionale, ma le tue capacità di visual designer fanno schifo e davvero non capisci nulla sul design dell'interazione, ecc. Se nascondi l'API, l'unica la cosa che la gente saprà è che hai creato un'applicazione mobile inutilizzabile e brutta. Se la tua API è pubblica, altri sviluppatori saranno attratti dalla sua qualità e scriveranno ottime applicazioni per te, offrendoti un sacco di soldi.
Non puoi mai immaginare come altre persone possano usare le tue API. Questo è quello che è successo con Kinect. Inizialmente, Microsoft ha creato Kinect per i giochi. Quando Microsoft ha aperto l'API al pubblico, non avrebbe mai immaginato che sarebbe stata utilizzata qualche anno dopo da applicazioni scientifiche, settore sanitario, ecc. È simile per le API Web: più sviluppatori lo usano, più le idee sarebbero diffuse.