Ich möchte eine Passwort-Zeichenfolge vom Benutzer auf Android erwerben.
Ich möchte nicht, dass diese Zeichenfolge in einer Java-Zeichenfolge zu irgendeinem Zeitpunkt im Prozess gespeichert wird, von dem Zeitpunkt an, an dem der Benutzer sie eingibt, bis zu dem Punkt, an dem sie in einem Code- oder Byte-Array ankommt.
Der Grund dafür ist Suns einstweilige Verfügung gegen die Verwendung von Java-Strings für sensible Daten. "Objekte des Typs String sind unveränderlich, dh es sind keine Methoden definiert, die es erlauben, den Inhalt eines Strings nach der Verwendung zu ändern (überschreiben) oder zu löschen. Dieses Feature macht String-Objekte ungeeignet für die Speicherung von sicherheitsrelevanten Informationen wie Benutzerkennwörter: Sie sollten sicherheitsrelevante Informationen immer in einem char-Array sammeln und speichern. " Ссылка
Also kann ich EditText nicht verwenden, weil das intern Strings verwendet (obwohl es ein Editable zurückgibt, das möglicherweise von char [] oder Char [] unterstützt wird?).
Was ist der einfachste Weg, um ein char-Array vom Benutzer zu akzeptieren? Ich vermute ein Canvas, auf dem ich wichtige Ereignisse abhöre?
Ich sehe EditText.java (API 17) nicht intern mit dem String. Es ist nur 2 Seiten lang Code. Natürlich hat TextView.java, von dem EditText geerbt wurde, 9k Zeilen in der Datei. Sie werden TextView.java immer noch nicht mit dem String intern, sondern mit seiner eigenen Implementierung von CharWrapper für CharSequence sehen. (TextView.java Zeile # 8535 API 17). Hier haben Sie den Methodenaufruf getChars. Wie Sie feststellen werden, wird buf
von mChars
kopiert, was char [] und nicht String ist.
Jetzt müssen Sie nur noch getChar aufrufen und das char [] übergeben, um ausgefüllt zu werden.
%Vor% Sie haben die gewünschte char[] password
ohne Verwendung von String. Nachdem Sie damit fertig sind, können Sie es wie folgt aus dem Speicher löschen.
Es gibt zwei mögliche Situationen, auf die Ihre Anwendung stoßen könnte:
Alle Anwendungen sind in ihrer Umgebung ordnungsgemäß mit Sandboxing versehen. In diesem Fall sollten Sie sich keine Gedanken über Ihre Passwörter machen, da andere Prozesse nicht auf Ihren Prozessspeicher zugreifen können, unabhängig davon, ob sich Strings oder byte [] - Arrays darin befinden.
Es gibt eine Rogue-Anwendung mit Superuser-Zugriff. In diesem Fall sollten Sie sich auch keine Gedanken über Strings machen, da es zu viele Orte gibt, an denen Sie Ihre Passwörter abfangen können. Daher sollten Strings ganz unten in der Liste der Dinge sein, über die Sie sich Gedanken machen müssen.
Editable
implementiert CharSequence
, was laut den Dokumenten eine" lesbare Folge von char
-Werten "ist.