Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用JDBC时,密码是字符串还是字符[]?_Java_String_Jdbc_Passwords_Char - Fatal编程技术网

Java 使用JDBC时,密码是字符串还是字符[]?

Java 使用JDBC时,密码是字符串还是字符[]?,java,string,jdbc,passwords,char,Java,String,Jdbc,Passwords,Char,这是从安全角度考虑的。最佳实践是不要使用字符串来存储密码,而是使用char[]。这是否适用于任何时候使用密码?例如,在使用JDBC时使用字符串保存密码是可以接受的 public final void Login(String username, String password){ ... conn = DriverManager.getConnection(url, username, password); ... } 或者这里可以使用char[]来代替字符串吗?我不知道我是否接受您的假设,即

这是从安全角度考虑的。最佳实践是不要使用字符串来存储密码,而是使用char[]。这是否适用于任何时候使用密码?例如,在使用JDBC时使用字符串保存密码是可以接受的

public final void Login(String username, String password){
...
conn = DriverManager.getConnection(url, username, password);
...
}

或者这里可以使用char[]来代替字符串吗?

我不知道我是否接受您的假设,即在系统资源(例如JDBC数据库连接)的上下文中,
char[]
比字符串更安全。无论如何,您可以使用连接管理器(或连接池,以适合您的容器的为准),然后连接管理器(并且只有连接管理器)可以查看底层数据库用户名/密码。

java中的字符串是不可变的,一旦创建它,它就不能更改,因此无论何时我们说 字符串s=“abc”; s=“def”; 它们不引用相同的字符串,而是创建“abc”字符串对象,s引用它,当我们说s=“def”时,另一个字符串对象“def”由s引用,因此放弃了“abc”

所以“abc”留在堆中,现在假设这是一个高度安全的密码,漂浮在堆中,等待错误的一方访问

这就是为什么鼓励使用char[]作为密码


还有其他选择,比如StringBuffer。

由于字符串在Java中的存储方式,您不应该使用字符串来保存敏感数据。char[]通常会更安全。”准则2-2:不要记录高度敏感的信息—一些信息,如社会安全号码(SSN)密码是高度敏感的。这些信息不应保存超过必要的时间,也不应保存在管理员可以看到的地方。例如,不应将其发送到日志文件,也不应通过搜索检测到其存在。一些临时数据可能保存在可变的数据结构中,如字符数组和Cleard使用后立即”。但我不知道如何在我给出的示例中使用char[]代替string。重要的是,您要确定您指的是密码还是密钥。密码通常是字符数据,最好用字符串表示。键是二进制数据,应该是字节数组或类似的东西。@Kon-字符串和字符[]之间的“安全”差别很小。它们的内部表示基本上是相同的。“我不知道我是否接受您的前提,即char[]比字符串更安全”,您应该这么说。数组元素可以被覆盖,字符串存储在字符串池中。有很多关于为什么不使用字符串作为密码的文章。最好检查它们。如果它是在运行时加载的,并且由用户代码访问。。。它有多安全?@jeroenvanevel-是的,char[]理论上可以被覆盖。此外,它还可以在被覆盖之前复制到各种内存池中,从而使覆盖变得毫无意义。如果有东西可以访问jvm内存,那么您已经失去了所有的安全性…@jtahlborn…优化器可以消除从不跟在读取后面的写入操作…但是,除非您愚蠢到将其插入内存,否则字符串的GCed速度与数组一样快。(事实上,字符串是一个数组,有几个额外的字段。)@HotLicks Java 1.8.20引入了字符串重复数据消除,它本质上是在你不做任何事情的情况下实习你的字符串。@Ryan字符串重复数据消除,顾名思义,只有当你有重复的字符串时才有意义,换句话说,不仅是一个现有字符串,而且至少有两个字符串。与即将被垃圾收集的字符串无关。@HotLicks实际上,是否对其调用
intern()
,并不重要。它仍然会像普通数组一样立即收集垃圾。但在这两种情况下,被收集并不意味着它的内存被覆盖。当然,将
“password”
写入代码是另一回事,因为当没有创建字符串时,字符数据甚至会作为类数据的一部分存在于内存中。