正如标题所说,我正在寻找一种方法来使用char []数组来建立JDBC连接,而不是从char []数组创建一个新的String对象,并使用它来建立连接.
因为char []数组比java中的字符串更安全,所以我一直希望在处理我的JPasswordField时尽可能保证安全.
在这种特殊情况下,我将获取JPasswordField的char []数组内容并尝试建立与数据库的JDBC连接.它运行得很好,但是我必须从char []数组创建一个新的String对象来实际调用getConnection方法.
有没有办法确保至少有一些安全性这样做,或者我只是被迫创建String对象并继续在方法中使用它?
这是我的代码:
/**
* Construct a new DataManager object with it's own
* connection to the database.
*
* @param ipAddress The IP address to the server on which MySQL is running.
* @param port The port to use when connecting to MySQL.
* @param databaseName The database name of the database to connect to.
* @param username The username for a MySQL account with access to the specified database.
* @param password The password for the MySQL account specified by the specified username.
*/
public DataManager(final String ipAddress, final String port, final String databaseName, final String username, final char[] password) throws ClassNotFoundException, IllegalAccessException, InstantiationException, SQLException {
Class.forName("com.mysql.jdbc.Driver").newInstance();
String url = "jdbc:mysql://" + ipAddress + ":" + port + "/" + databaseName + "?noAccessToProcedureBodies=true"; //?noAccessToProcedureBodies=true is required for using the stored procedures.
dbConnection = DriverManager.getConnection(url, username, new String(password));
}
Run Code Online (Sandbox Code Playgroud)
对不起格式化,但线条有点长,它们换行.
这是我正在使用的DriverManager类的Java文档.我已经检查过,似乎没有一种方法可以使用char[]而不是这个String,这就是提示这篇文章的内容.
感谢您的任何帮助/提示.
正如 @DavidS 在评论中所说,我不确定使用 char[] 是否真的以有意义的方式更安全,但我确实深入研究了源代码DriverManager,看看是否可以使用。
如果您查看正在使用的方法,您getConnection()会发现它(以及其他参数变体)正在收集 a 中提供的所有连接信息java.util.Properties,这本质上是一个 String->String 哈希表。然后,Properties 对象通过一个方法传递给所需的驱动程序,该方法被定义为长期存在(因此不太可能更改)java.sql.Driver 接口的一部分,其任何实现显然都依赖于驱动程序。
在这一点上,我认为您必须自动假设某个地方的某人会复制所提供的密码字符串或将其包含在更大的字符串的组合中,因此您不能依赖反射来返回并清除该密码缓冲。例如,在 PostgreSQL JDBC 驱动程序中,根据您的身份验证设置,密码可能只是作为编码的 byte[] 存在,甚至消化它的设置仍然可能(我没有仔细查看,而且我也没有试图在这里敲打 PostgreSQL)让摘要开放以供挖掘。
即使没有人复制过密码 String 并且摘要是完全不可触及的,您仍然需要担心这样一个事实:在您的驱动程序堆栈中存在对它的悬空引用(通过 Properties 对象),并且事情可能会发生变化。以意想不到的方式打破。
无论好坏,我认为我们目前非常致力于将数据库密码存储为字符串,但我真的不相信这是一个大问题。我不认为历史经验表明,与垃圾收集器相比,程序员更容易安全地管理敏感对象的生命周期。如果 Java 能够为我们提供一种将对象注释为更积极修剪目标的方法,那就太好了,但也可能没有必要。
就在写这篇文章时,我必须经历大约 8 个级别的方法调用和对象创建,所以我想知道密码字符串是否真的足够短暂,以至于能够手动擦除它会显着减少攻击面。我认为 Java 数据库处理的人体工学便利性让我们忘记了幕后发生了多少事情。
| 归档时间: |
|
| 查看次数: |
451 次 |
| 最近记录: |