我已将密码存储在 char 数组中,在检索它们时,我直接调用 String.ValueOf(char[] array)
方法。执行此操作会将形成的 String 存储在 String 池中。如果是,我们如何在不使用散列和加密技术的情况下更安全地存储硬编码密码?
示例:
public class TestUser {
public static void main(String[] args)
{
User u1 = new User();
System.out.println("User Name is "+u1.getUserId());
System.out.println("Password is "+String.valueOf(u1.getPassword()));
}
}
请解释一下。
最佳答案
String.valueOf(char[])
的文档没有说明它 interns结果字符串,但也没有声明它不存在。一般来说,如果该方法没有说它会驻留字符串,我会很乐意假设它没有。
目前Oracle的JDK中的实现没有,它看起来像这样:
public static String valueOf(char data[]) {
return new String(data);
}
当然,您可以直接使用 new String(char[])
来避免任何歧义。
也就是说,理想情况下,根本不要使用 String
,因为 char[]
内容已复制,并且在使用完它们后您无法覆盖副本以清除密码字符(无需求助于反射)。相反,一旦从 UI 层获取 char[]
,就对其运行密码哈希算法并立即覆盖 char[]
的内容,然后根据存储的副本(例如在数据库中等)验证哈希密码。
只是因为有人会指出:打印出密码可能比密码是否被保留更大的安全问题。但这看起来像测试代码...:-)
关于java - 直接调用 String 方法是否也会将该 String 存储在 String 池中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43754324/