Prima di tutto, non ho una solida esperienza nella sicurezza delle informazioni e ho solo bisogno di alcune linee guida di base per la mia domanda. Ho postato la stessa domanda su crittografia stackexchange, ma questo sembra essere il posto più appropriato.
Quindi ci sono un'applicazione Android e un server HTTP (S) remoto. Per accedere alle funzionalità del server, l'applicazione deve ricevere un token (generato per ogni singolo dispositivo in base all'id del dispositivo) e per eseguire questa app è necessario fornire una chiave API valida.
Supponiamo che la comunicazione con il server sia sicura e che il pericolo principale per un attacco sia quello di decodificare l'applicazione. Non esiste una difesa al 100% contro il reverse engineering, ma l'eseguibile dex dell'app (virtual machine bytecode) viene offuscato utilizzando strumenti specializzati.
Quindi la domanda è quale sia il modo migliore per memorizzare la chiave API?
Attualmente sto considerando due opzioni:
- La chiave API è memorizzata all'interno della parte di codice nativo dell'applicazione, no in testo semplice, ma crittografato con un algoritmo molto complesso e quindi più difficile da decodificare rispetto al bytecode VM. Quindi ho bisogno di un metodo per eliminare l'attacco di replay, in cui un utente malintenzionato può semplicemente chiamare a specifica funzione nativa e ottenere la chiave. Assumiamo che tutti i nativi il codice è una casella nera per un utente malintenzionato.
- Non utilizzare affatto una chiave API fissa, ma usa una sorta di API dinamica chiave per autenticare sul server per ricevere un token. Inoltre implementa tutte le informazioni relative alla sicurezza nel codice nativo.