Ho un APK Android che carica in file di contenuti archiviati localmente protetti dalla crittografia AES e voglio mantenere la chiave di crittografia segreta da tutti gli utenti. Solo l'app stessa dovrebbe essere in grado di leggere la chiave.
La mia domanda è questa: qual è la migliore prassi corrente per impedire a tutti gli utenti di accedere alla chiave di crittografia?
Opzioni che ho trovato finora:
1) La chiave di crittografia è archiviata nella memoria interna dell'app
2) La chiave di crittografia è codificata in modo rigido nell'app in una forma altamente offuscata
3) La chiave di crittografia è richiesta dall'app da un server remoto che restituisce la chiave di crittografia su SSL. La richiesta viene autenticata dal server utilizzando una chiave API che a sua volta è codificata nell'APK (anch'essa altamente offuscata).
Sono consapevole del fatto che il sistema operativo Android impedisce alle app di accedere ai dati di altre app (quando non sono memorizzate sulla scheda SD), quindi la chiave potrebbe essere memorizzata nella memoria interna dell'app, ma non posso fare affidamento su questo perché gli utenti con i telefoni radicati possono semplicemente leggere tutto. Quindi l'opzione 1 è fuori.
Nessuna delle restanti opzioni offre sicurezza, solo oscurità, e sono consapevole che l'hard-coding delle chiavi segrete all'interno dell'APK è un po 'no-no.
L'opzione 2 ha almeno il vantaggio di essere molto più semplice da implementare.
L'opzione 3 offre il vantaggio della stessa chiave di crittografia che risiede solo temporaneamente in memoria e non viene mai memorizzata in modo permanente sul dispositivo. Tuttavia, un utente malintenzionato dovrebbe senza dubbio guardare al gestore di risposta dell'app per qualsiasi segno della chiave di crittografia. C'è questo, e la chiave API è codificata nell'app, quindi è rilevabile da un utente malintenzionato.
Ci sono delle opzioni migliori?
Modifica Per quanto riguarda l'uso delle chiavi derivate da password: il contenuto è crittografato fuori app (cioè l'app non ha mai bisogno di crittografare, solo decifrare) usando una chiave predeterminata, quindi l'uso di una chiave derivata da password generata da password / PIN utente non funzionerà come la chiave risultante non corrisponderebbe alla chiave di crittografia. Inoltre, l'UX verrebbe influenzato negativamente da questo passo aggiuntivo della password: vogliamo caricare e decrittografare il contenuto in modo silenzioso in background, se necessario.