我已将密码存储在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()));
}
}
请解释。
答案 0 :(得分:0)
String.valueOf(char[])
的文档没有说明它interns结果字符串,但没有声明它不,无论是。一般来说,如果该方法没有说它会对字符串进行实习,那么我觉得它并不适合。
Oracle JDK中的当前实现没有,它看起来像这样:
public static String valueOf(char data[]) {
return new String(data);
}
当然,您可以直接使用new String(char[])
来避免任何歧义。
也就是说,理想情况下,根本不使用String
,因为char[]
内容已经复制,您可以&然后,当你完成密码时,覆盖副本以清除密码字符(不要求助于反射)。相反,当您从UI层获得char[]
时,尽快,在其上运行密码哈希算法并立即覆盖char[]
的内容,然后验证哈希值密码与存储的副本(例如,在DB等中)。
仅仅是因为某人要指出它:打印密码可能是比密码被中断更大的安全问题。但这看起来像测试代码......: - )