JavaRush /Java 博客 /Random-ZH /问答:为什么在 Java 中将密码存储在字符数组中而不是字符串中更好?

问答:为什么在 Java 中将密码存储在字符数组中而不是字符串中更好?

已在 Random-ZH 群组中发布
您很可能在 Java Junior 职位的面试中听到这样的问题。但我的朋友在面试技术主管职位时被问到了这个问题。
问答:为什么在 Java 中将密码存储在字符数组中而不是字符串中更好? - 1
String和字符数组都可以用来存储文本数据。但是,如果您还没有遇到类似的情况,那么有意识地为特定任务选择其中之一是很困难的。然而,正如我的朋友指出的,任何与 相关的问题String,通常都涉及字符串的一个特殊属性,称为不变性 ( Immutable),他在面试中利用了这一点。char []那么,让我们看看您应该使用而不是存储密码的几个原因String

原因 1. 字符串是不可变的

由于字符串在 Java 中是不可变的,因此您的纯文本密码将在内存中可用,直到垃圾收集器将其清除。而且由于String它们是String pool重复使用的,因此密码很有可能会长期保留在内存中,这根本不安全。
Java 字符串池是位于一个特殊位置(堆)的对象(字符串)池或集合。Java 中的字符串是最常见的数据类型之一。这不是一个原始类型,而是一个对象,因为它非常消耗资源。因此,要存储四个字符的字符串,需要分配 56 字节的内存。这就是为什么字符串像其他对象一样存储在堆上。
任何有权访问内存转储的人都可以找到纯文本形式的密码,这是使用加密密码而不是纯文本形式的一个很好的理由。由于字符串是不可变的,因此它们的内容无法更改。任何更改都会创建一个新行。但在 的情况下char [],您可以将其任何元素替换为零或空字符。因此,将密码存储在字符数组中可以明显降低密码被拦截的风险。

原因2. 作者的推荐

Java 本身(当然是通过它的创建者)建议使用getPassword ()返回. 您还可以尝试已弃用的方法。为什么不遵循语言作者的建议呢? JPasswordFieldchar []getText ()

原因3.打印

对于类型,String始终存在存储在字符串中的文本将被打印在日志文件或控制台中的危险。同时,如果使用Array,则不会打印数组的内容,而只会打印其在内存中的位置。当然,这并不是一个严肃的理由,但也有其道理。
String strPassword = "Unknown";
char [] charPassword = new char [] {'U', 'n', 'k', 'w', 'o', 'n'};
System.out.println ("String password:" + strPassword);
System.out.println ("char password:" + charPassword);

String password: Unknown
Character password: [C@110b053
当然,使用char []Java来存储密码本身并不是万能的。您需要注意安全性,例如,使用哈希值和加密密码,而不是以纯文本形式存储它们。当然,在身份验证过程结束后立即将其从内存中删除。 基于Javarevisited 的材料
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION