4 回答
TA贡献1806条经验 获得超5个赞
虽然这里的其他建议似乎有效,但还有另一个好的理由。简单地说,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
TA贡献1883条经验 获得超3个赞
引用官方文档时,Java Cryptography Architecture指南说明了这char[]
与String
密码(关于基于密码的加密,但当然更常见的是关于密码):
在类型的对象中收集和存储密码似乎是合乎逻辑的
java.lang.String
。但是,这里有一点需要注意:Object
类型的sString
是不可变的,即没有定义的方法允许你改变(覆盖)或清除String
后用法的内容。此功能使String
对象不适合存储安全敏感信息,如用户密码。您应该始终在char
数组中收集和存储安全敏感信息 。
Java编程语言安全编码指南的准则2-2,版本4.0也说了类似的东西(虽然它最初是在日志记录的上下文中):
准则2-2:不要记录高度敏感的信息
某些信息(如社会安全号码(SSN)和密码)非常敏感。即使是管理员,也不应将此信息保存的时间超过必要的时间,也不应保存在何处。例如,它不应该发送到日志文件,并且不应通过搜索检测到它的存在。一些瞬态数据可以保存在可变数据结构中,例如char数组,并在使用后立即清除。清除数据结构降低了典型Java运行时系统的有效性,因为对象在内存中透明地移动到程序员。
本指南还对低级库的实现和使用有影响,这些低级库没有他们正在处理的数据的语义知识。例如,低级字符串解析库可以记录它所处理的文本。应用程序可以使用库解析SSN。这会产生一种情况,即管理员可以使用SSN访问日志文件。
TA贡献1876条经验 获得超6个赞
char[]
通过将每个字符设置为零而不将字符串设置为零,可以在使用后清除字符数组()。如果某人可以以某种方式查看内存映像,如果使用字符串,他们可以以纯文本形式查看密码,但如果char[]
使用,则在使用0清除数据后,密码是安全的。
添加回答
举报