为什么字符[]优先于字符串的密码?

在Swing中,密码字段有一个getPassword() (返回char[] )方法,而不是通常的getText() (返回String )方法。 同样,我遇到了一个建议,不要使用String来处理密码。

为什么String在密码方面对安全构成威胁? 使用char[]会感觉不方便。


字符串是不可变的 。 这意味着一旦你创建了String ,如果另一个进程可以转储内存,就没有办法(除了反射),你可以在垃圾回收开始之前摆脱数据。

使用数组,您可以在完成数据后明确清除数据。 你可以用你喜欢的任何东西覆盖这个数组,甚至在垃圾收集之前密码也不会出现在系统的任何地方。

所以,是的,这是一个安全问题 - 但即使使用char[]只能减少攻击者的机会之窗,并且只能用于这种特定类型的攻击。

正如在注释中指出的那样,垃圾收集器移动的数组可能会在内存中留下数据的零散副本。 我相信这是针对特定实现的 - 垃圾收集器可能会清除所有内存,以避免这种情况。 即使这样做,仍然有char[]包含实际字符作为攻击窗口的时间。


虽然这里的其他建议似乎有效,但还有一个很好的理由。 使用普通String意外将密码打印到日志 ,监视器或其他不安全的地方的可能性会大大增加。 char[]不易受攻击。

考虑这个:

public static void main(String[] args) {
    Object pw = "Password";
    System.out.println("String: " + pw);

    pw = "Password".toCharArray();
    System.out.println("Array: " + pw);
}

打印:

String: Password
Array: [C@5829428e

引用官方文档时,Java密码体系结构指南对此进行了关于char[]String密码(关于基于密码的加密,但更一般地关于密码当然)的说明:

将密码收集并存储在java.lang.String类型的对象中似乎是合乎逻辑的。 然而,这里需要注意的是: String类型的Object是不可变的,也就是说,没有定义方法可以让你在使用后改变(覆盖)或者将String的内容清零。 此功能使String对象不适合存储安全敏感信息(如用户密码)。 您应该始终将安全敏感信息收集并存储在char数组中。

Java编程语言4.0版安全编码指南的准则2-2也提到了类似的内容(尽管它最初是在日志记录的上下文中):

准则2-2:不要记录高度敏感的信息

一些信息,如社会安全号码(SSN)和密码,非常敏感。 这些信息的保存时间不应超过必要的时间,即使是管理员也不能保存。 例如,它不应该被发送到日志文件,并且它的存在不应该通过搜索被检测到。 一些瞬态数据可能保存在可变数据结构中,如char数组,并在使用后立即清除。 清除数据结构已经降低了对典型的Java运行时系统的效率,因为对象被透明地传送给程序员。

本指南还对实施和使用不具备所处理数据的语义知识的低级库有影响。 作为一个例子,一个低级别的字符串解析库可能会记录它所处理的文本。 应用程序可以解析一个SSN与库。 这创造了SSN可供管理员访问日志文件的情况。

链接地址: http://www.djcxy.com/p/373.html

上一篇: Why is char[] preferred over String for passwords?

下一篇: How do I make the first letter of a string uppercase in JavaScript?