2012-05-01 55 views
9

我想从Android上的用户获取密码字符串。从用户获取字符数组而不使用字符串

我不希望该字符串存储在Java字符串中的任何时刻,从用户输入它到它到达我的代码中的字符或字节数组。

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

所以我不能使用的EditText,因为使用字符串内部(即使它返回一个可编辑其可以想见,通过的char []或字符[]备份?)。

从用户接受字符数组的最简单方法是什么?我在猜测一个关于重要事件的Canvas?

+0

使用CharSequence,也许? – Sparky

+0

我建议你读这个,如果你还没有准备好:http://www.mail-archive.com/[email protected]/msg01647.html –

+0

感谢您的链接的讨论。讨论反映了Lenik提供的观点。我在他的建议附带的评论中的原因折扣。 –

回答

-1

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

+0

是的,不幸的是,这样做字符串和String是什么是内部使用的EditText –

0

有两种可能的情况下,你的应用程序可能会遇到:

  1. 所有的应用程序都是正确的沙箱在他们的环境。在这种情况下,你不应该担心你的密码,因为其他进程不能访问你的进程内存,不管是否有字符串或byte []数组。

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

+1

这一分析同样适用于桌面和服务器系统,不是吗?然而,Oracle发布了指导,不要将Strings用于安全敏感数据。他们提供了一个API来获取char []中的密码。我认为我们应该考虑将coredumps作为泄漏字符串数据的主要方式。这不需要根和沙箱的渗透。 –

+1

由于大多数android IME在内部使用字符串,因此您可能不仅需要实现'EditText',还需要实现'BrainWave-to-byte []'功能。 – lenik

+0

仅当您建议通过IME过滤安全敏感数据时。基本上,通过指向更大的安全漏洞来回应关于安全漏洞的调查是所有论点中最不引人注目的。它没有解决最初的问题,它只是说“我已经想到更糟的事情了”。我同意。你有。 –

6

我在内部看不到使用字符串的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); 

你所需char[] password不使用字符串。完成处理后,可以按照以下步骤从内存中清除它。

Arrays.fill(password, ' '); 
相关问题