java - 直接调用 String 方法是否也会将该 String 存储在 String 池中?

标签 java string

我已将密码存储在 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/

相关文章:

Java 正则表达式匹配基本多语言平面之外的字符

java - 为什么 Selenium 找不到 XUL 按钮?

c++ - 你如何在 C++ 中搜索 std::string 的子字符串?

python - 'String' 模块对象没有属性 'join'

java - 如何在Java语言中使用logger.log(LEVEL.DEBUG,消息/实例)

java - 接口(interface)方法和抽象方法如何默认调用?

c++ - 获取字符串的最后一行

java - 如何将空格更改为下划线并使字符串不区分大小写?

Java/clojure : Multiple character delimiter, 并保留分隔符

java - 使用简单的 Java 客户端代码查询 Treasure Data DB