android - 在不使用字符串的情况下从用户那里获取一个字符数组

标签 android string security textview

我想从 Android 用户那里获取密码字符串。

我不希望这个字符串在从用户键入它到它到达我的代码中的字符或字节数组中的任何时候都存储在 Java 字符串中。

这是因为 Sun 禁止将 Java 字符串用于敏感数据。 “String 类型的对象是不可变的,即没有定义允许您在使用后更改(覆盖)或清零 String 内容的方法。此功能使 String 对象不适合存储安全敏感信息,例如用户密码。您应该始终收集安全敏感信息并将其存储在字符数组中。” http://docs.oracle.com/javase/1.5.0/docs/guide/security/jce/JCERefGuide.html#PBEEx

所以我不能使用 EditText,因为它在内部使用字符串(即使它返回一个可以想象得到 char[] 或 Char[] 支持的 Editable?)。

从用户那里接受字符数组的最简单方法是什么?我猜我在 Canvas 上监听关键事件?

最佳答案

我没有看到 EditText.java (API 17) 在内部使用字符串。它只有 2 页长的代码。当然,EditText继承的TextView.java在文件中有9k行。您仍然不会看到 TextView.java 在内部使用 String,但它自己实现了 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);

您拥有所需的 char[] 密码,但未使用 String。使用完它后,您可以按如下方式将其从内存中清除。

Arrays.fill(password, ' ');

关于android - 在不使用字符串的情况下从用户那里获取一个字符数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10393951/

相关文章:

android - 学习 Activity Intent 数据随机返回,为什么?

java - android:translationY 属性隐藏 Edittext 的下边框

android - 检测绕Y轴的旋转 Android Java

javascript - 匹配不包含某个子串的子串

security - 为什么在生产中使用使用 MakeCert 工具制作的证书不好?

php - SQL语句存储在单独的文件夹中

android - Android Gradle Read超时

将 int 转换为十六进制格式的字符串

c - 如何在 C 中创建用户定义类型?

php - session 注入(inject)?