为什么char []比字符串更适合密码?

为什么char []比字符串更适合密码?

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

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


烙印99
浏览 1531回答 4
4回答

忽然笑

虽然这里的其他建议似乎有效,但还有另一个好的理由。简单地说,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: PasswordArray: [C@5829428e

白板的微信

引用官方文档时,Java Cryptography Architecture指南说明了这char[]与String密码(关于基于密码的加密,但当然更常见的是关于密码):在类型的对象中收集和存储密码似乎是合乎逻辑的java.lang.String。但是,这里有一点需要注意:Object类型的s String是不可变的,即没有定义的方法允许你改变(覆盖)或清除String 后用法的内容。此功能使String对象不适合存储安全敏感信息,如用户密码。您应该始终在char数组中收集和存储安全敏感信息 。Java编程语言安全编码指南的准则2-2,版本4.0也说了类似的东西(虽然它最初是在日志记录的上下文中):准则2-2:不要记录高度敏感的信息某些信息(如社会安全号码(SSN)和密码)非常敏感。即使是管理员,也不应将此信息保存的时间超过必要的时间,也不应保存在何处。例如,它不应该发送到日志文件,并且不应通过搜索检测到它的存在。一些瞬态数据可以保存在可变数据结构中,例如char数组,并在使用后立即清除。清除数据结构降低了典型Java运行时系统的有效性,因为对象在内存中透明地移动到程序员。本指南还对低级库的实现和使用有影响,这些低级库没有他们正在处理的数据的语义知识。例如,低级字符串解析库可以记录它所处理的文本。应用程序可以使用库解析SSN。这会产生一种情况,即管理员可以使用SSN访问日志文件。

HUX布斯

char[]通过将每个字符设置为零而不将字符串设置为零,可以在使用后清除字符数组()。如果某人可以以某种方式查看内存映像,如果使用字符串,他们可以以纯文本形式查看密码,但如果char[]使用,则在使用0清除数据后,密码是安全的。
打开App,查看更多内容
随时随地看视频慕课网APP