新闻资讯

新闻资讯 媒体报道

为什么 char 数组比 String 更适合存储密码?

编辑:005     时间:2020-10-14

任何与 String 相关的问题都必须对字符串的特殊属性有一些线索,比如不变性,他用它来说服访提问的人。在这里,我们将探讨为什么你应该使用char[]存储密码而不是String的一些原因。

字符串:

1)由于字符串在 Java 中是不可变的,如果你将密码存储为纯文本,它将在内存中可用,直到垃圾收集器清除它,并且为了可重用性,会存在 String 在字符串池中, 它很可能会保留在内存中持续很长时间,从而构成安全威胁。

由于任何有权访问内存转储的人都可以以明文形式找到密码,这是另一个原因,你应该始终使用加密密码而不是纯文本。

由于字符串是不可变的,所以不能更改字符串的内容,因为任何更改都会产生新的字符串,而如果你使用char[],你就可以将所有元素设置为空白或零。

因此,在字符数组中存储密码可以明显降低窃取密码的安全风险。

2)Java 本身建议使用 JPasswordField  getPassword() 方法,该方法返回一个 char[] 和不推荐使用的getTex() 方法,该方法以明文形式返回密码,由于安全原因。应遵循 Java 团队的建议, 坚持标准而不是反对它。

3)使用 String 时,总是存在在日志文件或控制台中打印纯文本的风险,但如果使用 Array,则不会打印数组的内容而是打印其内存位置。虽然不是一个真正的原因,但仍然有道理。

String strPassword =“Unknown”;   char [] charPassword = new char [] {'U''n''k''w''o''n'};  
System.out.println(“字符密码:”+ strPassword);  
System.out.println(“字符密码:”+ charPassword);

输出

字符串密码:Unknown  
字符密码:[C @110b053

我还建议使用散列或加密的密码而不是纯文本,并在验证完成后立即从内存中清除它。

因此,在Java中,用字符数组用存储密码比字符串是更好的选择。

虽然仅使用char[]还不够,还你需要擦除内容才能更安全。

本内容属于网络转载,文中涉及图片等内容如有侵权,请联系编辑删除

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。

回复列表

相关推荐