为什么我们不应该在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。现在它更有说服力了。非常感谢。