Le migliori pratiche per proteggere i contenuti crittografati sull'app Android

4

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.

    
posta Darriuk 15.09.2016 - 15:07
fonte

2 risposte

2

Vuoi proteggerli nell'ambiente, che ha più fiducia della memoria della tua app (che può essere esposta in un modo o nell'altro).

Spesso i fornitori di sistemi operativi implementano l'archiviazione sicura delle chiavi per tali scopi. Non sapendo molto su Android, ho sentito Android Keystore System ( link ) è tale spazio di archiviazione che puoi usa per proteggere le chiavi e non è direttamente accessibile da un utente, per quanto possa giudicare dai documenti, quindi segue le tue richieste.

    
risposta data 15.09.2016 - 16:05
fonte
1

Come dichiarato da CommonsWare, lo scenario ideale dovrebbe averlo in modo che la chiave non sia archiviata sullo stesso dispositivo dell'hardware. Ma se la tua applicazione è locale al telefono, posso capire perché vuoi evitare questo.

Un modo per proteggere i dati consiste nel far derivare la chiave da una password / PIN immessa dall'utente e quindi non viene memorizzata affatto. Se viene immessa la password utente errata, i dati semplicemente non verranno decrittografati. Puoi offuscarlo ulteriormente memorizzandolo in un blob. A seconda del tipo di applicazione questo può essere ok, ma per alcune app si comprometterebbe seriamente l'esperienza dell'utente se dovessero inserire una password / PIN ogni volta.

    
risposta data 15.09.2016 - 16:02
fonte

Leggi altre domande sui tag