在不使用String的情况下从用户获取char数组

时间:2012-05-01 05:32:31

标签: android string security textview

我想从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,我在那里听关键事件?

3 个答案:

答案 0 :(得分:7)

我没有在内部看到使用String的EditText.java(API 17)。它只是2页长的代码。当然,EditText继承的TextView.java在文件中有9k行。你仍然不会在内部使用String看到TextView.java,但是它有自己的CharSequence CharWrapper实现。 (TextView.java行#8535 API 17)。这里有方法调用getChars。正如您将注意到bufmChars复制而来的是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)

您的应用程序可能会遇到两种情况:

  1. 所有应用程序都在其环境中进行了适当的沙盒处理。在这种情况下,您不必担心密码,因为其他进程无法访问您的进程内存,无论是否存在字符串或byte []数组。

  2. 有一个超级用户访问的流氓应用程序。在这种情况下,您也不应该担心字符串,因为有太多的地方可以拦截您的密码,因此字符串应该接近需要担心的事物列表的底部。

答案 2 :(得分:-1)

Editable实现CharSequence,根据文档,它是“char值的可读序列”。

相关问题