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