2012-05-01 4 views
9

Desidero acquisire una stringa di password dall'utente su Android.Ottenere un array di caratteri dall'utente senza utilizzare una stringa

Non voglio che questa stringa venga memorizzata in una stringa Java in qualsiasi punto del processo dal momento in cui l'utente la digita, nel punto in cui arriva nel mio codice in un array di caratteri o di byte.

La ragione di ciò è l'ingiunzione di Sun di utilizzare Java Strings per dati sensibili. "Gli oggetti di tipo String sono immutabili, ovvero non ci sono metodi definiti che consentono di modificare (sovrascrivere) o azzerare il contenuto di una stringa dopo l'uso Questa caratteristica rende gli oggetti String inadatti per la memorizzazione di informazioni sensibili alla sicurezza come l'utente password. Dovresti sempre raccogliere e archiviare le informazioni sensibili per la sicurezza in un array di caratteri. " http://docs.oracle.com/javase/1.5.0/docs/guide/security/jce/JCERefGuide.html#PBEEx

quindi non posso usare EditText, perché utilizza stringhe internamente (anche se si restituisce un modificabile, che, concettualmente, potrebbe essere sostenuta da char [] o Char []?).

Qual è il modo più semplice per accettare un array di caratteri dall'utente? Immagino una tela su cui ascolto gli eventi chiave?

+0

Utilizzare un CharSequence, forse? – Sparky

+0

Ti suggerisco di leggere questo se non l'hai già fatto: http://www.mail-archive.com/[email protected]/msg01647.html –

+0

Grazie per il link a quella discussione. La discussione rispecchia l'argomento offerto da Lenik in basso.Scordo quello per le ragioni nel commento aggiunto al suo suggerimento. –

risposta

-1

Editable strumenti CharSequence, che, secondo i documenti, è una "sequenza leggibile di valori char".

+0

Sì, sfortunatamente, così anche String, e String è ciò che viene usato internamente in EditText –

0

ci sono due possibili situazioni l'applicazione potrebbe incontrare:

  1. Tutte le applicazioni sono correttamente sand-boxed nel loro ambiente. In questo caso non dovresti preoccuparti delle tue password, perché altri processi non possono accedere alla tua memoria di processo, non importa se ci sono archi di stringhe o di byte [].

  2. C'è un'applicazione canaglia con accesso superutente. In questo caso non dovresti preoccuparti nemmeno delle stringhe, perché ci sono troppi posti per intercettare le tue password, quindi le stringhe dovrebbero essere vicine al fondo della lista delle cose di cui preoccuparsi.

+1

Tale analisi si applicherebbe ugualmente a sistemi desktop e server, non sarebbe? Eppure Oracle ha emanato la guida per non utilizzare le stringhe per i dati sensibili alla sicurezza. E hanno fornito un'API per ottenere passwds in un carattere []. Penso che dovremmo considerare i coredump come il modo principale per perdere dati String. Ciò non richiede né la penetrazione di root né quella di sandbox. –

+1

Poiché la maggior parte degli IME Android utilizzano stringhe internamente, potrebbe essere necessario implementare non solo la funzionalità "EditText", ma anche quella "BrainWave-to-byte []". – lenik

+0

Solo se si propone di filtrare i dati sensibili per la sicurezza tramite un IME. Fondamentalmente, rispondere a un'inchiesta su un buco di sicurezza puntando a un buco di sicurezza più grande è il meno convincente di tutti gli argomenti. Non affronta il problema originale, dice semplicemente "Ho pensato a qualcosa di peggio". Sono d'accordo. Hai. –

6

Non vedo EditText.java (API 17) utilizzando la stringa internamente. È solo un codice lungo 2 pagine. Ovviamente, TextView.java da cui EditText ha ereditato ha 9k linee nel file. Non vedrai ancora TextView.java utilizzando la stringa internamente ma con la sua implementazione di CharWrapper per CharSequence. (TextView.java line # 8535 API 17). Qui hai il metodo call getChars. Come si noterà che buf viene copiato da mChars che è char [] e non String.

private char[] mChars; 
    public void getChars(int start, int end, char[] buf, int off) { 
     if (start < 0 || end < 0 || start > mLength || end > mLength) { 
      throw new IndexOutOfBoundsException(start + ", " + end); 
     } 

     System.arraycopy(mChars, start + mStart, buf, off, end - start); 
    } 

Ora tutto ciò che dovete fare è chiamare getchar e passare lungo il char [] da compilare.

  int pl = mPasswordEt.length(); 
      char[] password = new char[pl]; 
      mPasswordEt.getText().getChars(0, pl, password, 0); 

Hai desiderato char[] password senza l'utilizzo di corde. Dopo aver finito di lavorarci, puoi cancellarlo dalla memoria come segue.

Arrays.fill(password, ' ');