为什么要在字符串上使用 char[] 数组在Java中存储密码?
1.字符串是不可变的:字符串在Java中是不可变的,因此如果密码以纯文本形式存储,它将在内存中可用,直到垃圾收集器将其清除,并且由于字符串在字符串池中用于可重用性,因此很有可能它将长时间保留在内存中,这是一种安全威胁。字符串是不可变的,并且无法更改字符串的内容,因为任何更改都会产生新的字符串。
使用数组,数据可以在其工作完成后显式擦除数据。数组可以被覆盖,密码不会出现在系统的任何地方,甚至在垃圾收集之前。
2. 安全性:任何有权访问内存转储的人都可以找到明文密码,这是使用加密密码而不是明文密码的另一个原因。因此,将密码存储在字符数组中显然可以降低窃取密码的安全风险。
3. 日志文件安全:使用数组,可以显式擦除数据,覆盖数组,密码不会出现在系统的任何地方。
使用纯字符串,将密码意外打印到日志、监视器或其他不安全位置的可能性要高得多。 char[] 不太容易受到攻击。
Java
//Java program to illustrate preferring char[] arrays
//over strings for passwords in Java
public class PasswordPreference
{
public static void main(String[] args)
{
String strPwd = "password";
char[] charPwd = new char[] {'p','a','s','s','w','o','r','d'};
System.out.println("String password: " + strPwd );
System.out.println("Character password: " + charPwd );
}
}
输出:
String password: password
Character password: [C@15db9742
4. Java建议: Java有类似 javax.swing 的 JPasswordField 等方法作为返回 String 的方法 public String getText() 从Java 2 已弃用,取而代之的是返回 Char Array 的 public char[] getPassword()。