我想从Android上的用户那里获取密码字符串。
我不希望这个字符串在用户输入过程中的任何时刻存储在Java String中,也不希望它存储在我的代码中以char或byte数组到达的位置。
之所以出现这种情况,是因为Sun禁止将Java字符串用于敏感数据。 “String类型的对象是不可变的,即没有定义允许您在使用后更改(覆盖)或清零String内容的方法。此功能使String对象不适合存储安全敏感信息,如用户密码。您应该始终在char数组中收集和存储安全敏感信息。“ http://docs.oracle.com/javase/1.5.0/docs/guide/security/jce/JCERefGuide.html#PBEEx
所以我不能使用EditText,因为它在内部使用了字符串(即使它返回一个可编辑的,可以想象是由char []或Char []支持?)。
从用户接受char数组的最简单方法是什么?我猜一个Canvas,我在那里听关键事件?
答案 0 :(得分:7)
我没有在内部看到使用String的EditText.java(API 17)。它只是2页长的代码。当然,EditText继承的TextView.java在文件中有9k行。你仍然不会在内部使用String看到TextView.java,但是它有自己的CharSequence CharWrapper实现。 (TextView.java行#8535 API 17)。这里有方法调用getChars。正如您将注意到buf
从mChars
复制而来的是char []而不是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);
}
现在你所要做的就是调用getChar并传递char []来填充。
int pl = mPasswordEt.length();
char[] password = new char[pl];
mPasswordEt.getText().getChars(0, pl, password, 0);
您在不使用String的情况下拥有所需的char[] password
。完成后,您可以从内存中清除它,如下所示。
Arrays.fill(password, ' ');
答案 1 :(得分:0)
您的应用程序可能会遇到两种情况:
所有应用程序都在其环境中进行了适当的沙盒处理。在这种情况下,您不必担心密码,因为其他进程无法访问您的进程内存,无论是否存在字符串或byte []数组。
有一个超级用户访问的流氓应用程序。在这种情况下,您也不应该担心字符串,因为有太多的地方可以拦截您的密码,因此字符串应该接近需要担心的事物列表的底部。
答案 2 :(得分:-1)
Editable
实现CharSequence
,根据文档,它是“char
值的可读序列”。