这是关于 Java 字符串常量池的。在我的一个程序中,我正在解密数据库的密码并将其存储在字符串中。我听说 Java 字符串将存储在常量池中,并且不会在 VM 重新启动或加载字符串退出的 ClassLoader 时被破坏。
如果是这种情况,我的密码将存储在字符串池中。我非常关心这个问题。有没有其他方法可以破坏这些文字或我能做的任何其他事情。
请就此提出建议,
问候,桑尼。
这里有几个不同的问题。首先,术语“常量池”指的是类文件中字符串和数字文字的一个非常特定的部分,或者是指从驻留在 JVM 中的这部分类文件生成的数据结构。密码不会存储在这里,除非它们是类文件的一部分。
但是,某些 String 对象确实通过 String 的保留在整个程序中存储和共享。任何字符串文字都会被自动实习,就像您调用 intern() 方法的任何字符串一样。但是,据我所知,没有其他字符串以这种方式存储,因此除非您自己自动实习保存密码的字符串,否则我认为您无需担心这一点。
另一个需要注意的问题是,如果您不希望密码驻留在内存中,则可能需要小心垃圾收集,因为不再引用的 String 可能仍在内存中。类似地,如果您使用某些字符串方法(如在字符串之间共享支持表示的子字符串),您可以在使用完密码字符串后保留完整的密码字符串。
但是,如果您担心的是其他 Java 代码能够看到已被保留或仍然存在于内存中的旧密码,那么您无需担心。无法迭代或查看内部字符串池的元素,也无法打开字符串以查看其支持数组。
这仅适用于您调用该intern()
方法的字符串文字和字符串。想一想:如果它应用于所有字符串,那么您将很快耗尽内存,例如处理具有不同(字符串)值的请求参数的 servlet 应用程序。
伙计,使用字符串缓冲区来获取密码并进行(大概)字符串类型的操作。
StringBuffer 将字符串存储为 char[],可以删除。或者被覆盖或者你有什么。说StringBuffer.delete(0,StringBuffer.length());
或者只是将 db 密码作为 char[] 并直接使用它 - 但我认为 StringBuffer 方式(假设你已经使用 String 方法制作了所有代码)将是一个更容易的飞跃。