2014-06-10 4 views
12

Ho un'attività che richiede un nome utente e una password, quindi avvia un'altra attività nella mia app per completare una registrazione utente. Voglio inviare il nome utente + la password come intenti extra alla seconda attività. Qualcosa di simile:Sicurezza nell'invio di extra di intenti sensibili all'interno della mia app?

Intent intent = new Intent(activity, SecondActivity.class); 
intent.putExtra("u", username); 
intent.putExtra("p", password); 
startActivity(intent); 

ei miei definisce manifesto SecondActivity piace:

<activity 
    android:name="com.me.SecondActivity" 
    android:label=""> 
    <meta-data 
     android:name="android.support.PARENT_ACTIVITY" 
     android:value="com.me.FirstActivity" /> 
</activity> 

e adesso sto avendo dei dubbi circa la sicurezza di inviare gli extra come intento come questo nome utente + password - è possibile per un'altra app per intercettare l'invocazione di SecondActivity con un filtro intent spoofed? Oltre a ciò, mi chiedo che cosa accada con gli extra, sono mai persi su disco dal sistema operativo? Qualcuno potrebbe essere in grado di guardarli lì se è così.

Grazie

+0

Come si specifica l'attività da avviare direttamente Sono quasi sicuro che si sta passando qualsiasi forma di IntentFilters. – Schoentoon

risposta

8

La chiave qui è la distinzione tra Intenti impliciti e intenti espliciti. Il tuo esempio usa un Intento esplicito poiché stai specificando la classe esatta che vuoi eseguire. Questo va bene, perché gli Intenti espliciti non possono essere intercettati e rimarranno nella tua applicazione.

Gli intenti impliciti, tuttavia, aprono diversi possibili vettori di attacco. This article ne parla in modo più dettagliato. Raccomanderei fortemente di non usare Implicit Intents per trasmettere alcun tipo di informazione sensibile.

Dal Android Docs:

Intenti espliciti hanno specificato un componente (tramite setComponent (ComponentName) o setClass (Context, Class)), che fornisce la classe esatta da eseguire.

Gli Intenti impliciti non hanno specificato un componente; invece, devono includere abbastanza informazioni per il sistema per determinare quale dei componenti disponibili è meglio eseguire per tale scopo.

Come ho detto, per il tuo esempio nella domanda, passare la password tramite Intent è relativamente sicuro in quanto nessun'altra applicazione può intercettarlo in fase di runtime. Ma è importante notare che questo non è sempre il caso, e l'utilizzo di Intenti impliciti potrebbe teoricamente consentire l'Intercettazione dell'Intento ed esporre le informazioni sensibili.

Edit:

quanto per la persistenza Extra Intent al disco, sì, questo è un rischio. Tuttavia, tieni presente che se qualcuno ha accesso root sul dispositivo e lo sta utilizzando per cercare sul disco le informazioni sull'intento persistente, potrebbero esserci modi più semplici per ottenere le stesse informazioni. Qualunque cosa tu faccia, qualcuno con accesso root al dispositivo fisico sarà probabilmente in grado di togliere quella password, a meno che tu non faccia un po 'di ottima crittografia.

La mia raccomandazione su una prospettiva di sicurezza generale è cercare di non trattare le password direttamente in qualsiasi tipo di contesto a lungo termine o persistente. Le password devono essere utilizzate solo durante un processo di accesso e scartate immediatamente dopo (supponendo che si stia autenticando con un server).Pertanto, con l'uso normale dell'applicazione (un utente legittimo con una password reale), non devi preoccuparti di un attore malintenzionato che ispeziona la memoria del dispositivo, perché nel momento in cui l'attore malintenzionato ottiene una sospensione del dispositivo, il la password è stata rimossa da lungo tempo dalla memoria.

0

E 'possibile per applicazioni di terze parti di intercettare intenti a livello di sistema. Suggerisco di crittografare i dati prima di inviarli all'intento successivo e quindi decrittografarli una volta ricevuti.

+0

Per favore, fai notare come funziona per intercettare intenti espliciti. – neristance

+0

Mark Murphy ha scritto un eccellente breve riassunto: [Avviso: gli extra di Intensità di attività possono essere pubblici] (https://commonsware.com/blog/2011/06/30/warning-activity-intent-extras-public.html) –

0

La gestione delle password deve sempre essere un affare a brevissimo termine. Si consiglia di usarli solo per la richiesta di autenticazione e quindi scartarli. Venendo alle specifiche della tua domanda, ad esempio inviando la password tra le attività attraverso un intento esplicito, questo è sicuro nella misura in cui nessun'altra app sarà in grado di intercettarlo e visualizzare il valore. Tuttavia, il valore delle password deve essere mantenuto da qualche parte (memoria o disco) per passarlo alla tua attività secondaria. Se è mantenuto sul disco è abbastanza facile da recuperare. Se è mantenuto in memoria, un utente malintenzionato che ottiene l'accesso al dispositivo può eseguirne il root e quindi eseguire il dump della memoria per visualizzare i valori nella memoria. Pertanto non è consigliabile gestire le password in questo modo.

+0

, l'intento "extra" può essere letto accedendo all'oggetto baseIntent di RecentTaskInfo (leggibile da qualsiasi app con autorizzazione GET_TASKS). Sebbene questo sia ora deprecato, funziona su versioni precedenti. –

Problemi correlati