Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么我们不应该在Java中使用字符串来存储密码,而可以在C语言中使用字符串来存储密码?_Java_C - Fatal编程技术网

为什么我们不应该在Java中使用字符串来存储密码,而可以在C语言中使用字符串来存储密码?

为什么我们不应该在Java中使用字符串来存储密码,而可以在C语言中使用字符串来存储密码?,java,c,Java,C,在一次讨论中,我们的一位高级主管告诉我们,我们不应该在Java项目中使用字符串来存储密码,因为这存在安全风险。 但在C项目中是可以接受的。我不明白他为什么那样说。 有人能告诉我为什么吗?在Java中,字符串是不可变的,所以一旦使用字符串存储密码,就无法更改内容,因为任何更改都会生成新字符串。 而包含密码的字符串将在内存中可用,直到它被垃圾回收。因此,它将在内存中长时间保留,这可能会带来安全风险 但是,在C语言中,字符串是一个以空结尾的字符数组,您可以将所有数组元素设置为空或零,因此密码不会保留在

在一次讨论中,我们的一位高级主管告诉我们,我们不应该在Java项目中使用字符串来存储密码,因为这存在安全风险。 但在C项目中是可以接受的。我不明白他为什么那样说。
有人能告诉我为什么吗?

在Java中,字符串是不可变的,所以一旦使用字符串存储密码,就无法更改内容,因为任何更改都会生成新字符串。 而包含密码的字符串将在内存中可用,直到它被垃圾回收。因此,它将在内存中长时间保留,这可能会带来安全风险


但是,在C语言中,字符串是一个以空结尾的字符数组,您可以将所有数组元素设置为空或零,因此密码不会保留在内存中。

您的问题没有意义。有人会怎么告诉你谈话的人为什么说了什么?最好的提问人应该是做陈述的人。也许这就是那个人心中的原因,但根本没有说服力。@EugeneSh:这是使用
char[]
,而不是
String
,的一个众所周知的原因,对于Java中的密码数据。为什么开发人员不能像清空C中的内存一样强制Java中的垃圾收集呢?@EugeneSh。因为没有实际的方法强制垃圾收集做任何事情。
System.gc()
的契约是它向垃圾收集器建议它应该收集垃圾。此外,即使空间被垃圾收集,也绝对不能保证它会被清零。因此,在将相同的内存位置分配给其他对象之前,数据仍将在那里浮动。@realpoint Ok。现在它更有说服力了。非常感谢。