Why we should not use String for Storing password in Java but can use String for Storing password in C language?
在一个讨论中,我们的一位资深人士告诉我们,在Java项目中不应该使用String来存储密码,因为这是一个安全风险。但在C项目中是可以接受的。我不明白他为什么这么说。有人能告诉我为什么吗?
- stackoverflow.com/questions/8881291/…
- 你的问题没有道理。怎么会有人告诉你为什么和你谈话的人说了什么?
- 最好问的人是做陈述的人。
在爪哇中,字符串是不可变的,因此一旦使用字符串存储密码,就不可能更改内容,因为任何更改都会生成新字符串。并且包含密码的字符串将在内存中可用,直到它被垃圾收集为止。因此,它将长期保存在内存中,这可能是一个安全风险。
但是,在C语言中,字符串是以空结尾的字符数组,您可以将所有数组元素设置为空或零,因此密码不会保留在内存中。
- 也许这就是那个家伙想的原因,但这一点都不令人信服。
- 这是一个众所周知的原因,在Java中使用EDCOX1的0,而不是EDCOX1×1的密码数据。
- 为什么开发人员不能以同样的速度强制Java中的垃圾回收,从而取消C中的内存?
- @ EugeneSh。因为没有实际的方法强制垃圾收集执行任何操作。System.gc()的合同是建议垃圾收集者收集垃圾。此外,即使空间是垃圾收集的,也绝对不能保证它将被清零。因此,在将相同的内存位置分配给其他对象之前,数据仍将浮动在那里。
- @真怀疑论者好。现在更具说服力了。谢谢您。
- 可以将system.gc()用作提示,但无法立即强制执行。
- @尤金纳什:真正的怀疑论者所说的,加上:不仅没有保证它会被归零,而且有很好的理由它可能不会被归零(例如性能)。
- @你能不能用你上面的评论来增加你的回答?这是一个很好的补充。System.gc() can be used as a hint, but there is no way to force it immediately.