使用Java-JDBC连接到MySQL,而不在Java源代码中显示凭据
我试图学习如何创建Java控制台应用程序,连接(在本例中)MySQL DB并发送或检索数据,而不在Java应用程序的源代码中显示用户名和密码我目前没有问题 正在创建显示凭据的连接。使用Java-JDBC连接到MySQL,而不在Java源代码中显示凭据,java,mysql,jdbc,Java,Mysql,Jdbc,我试图学习如何创建Java控制台应用程序,连接(在本例中)MySQL DB并发送或检索数据,而不在Java应用程序的源代码中显示用户名和密码我目前没有问题 正在创建显示凭据的连接。 根据我收集到的信息,您总是需要在应用程序中的某个位置显示您的凭据。但是,如何在应用程序和数据库之间实现“安全”连接,以便其他人不会出于恶意原因滥用您的凭据?您可以使用加密用户名和密码。最好的开源加密程序(我的个人观点)是 一种方法是使用具有凭据的属性文件或将数据保存在xml文件中 创建一个如下所示的属性文件 // d
根据我收集到的信息,您总是需要在应用程序中的某个位置显示您的凭据。但是,如何在应用程序和数据库之间实现“安全”连接,以便其他人不会出于恶意原因滥用您的凭据?您可以使用加密用户名和密码。最好的开源加密程序(我的个人观点)是
一种方法是使用具有凭据的属性文件或将数据保存在xml文件中 创建一个如下所示的属性文件
// database.properties
DB_URL=jdbc:mysql://localhost:3306/UserDB
DB_USERNAME=user_name
DB_PASSWORD=password
在代码中使用此信息获取用户名和密码
Properties properties= new Properties();
FileInputStream input = null;
try{
input = new FileInputStream("database.properties");
props.load(input );
con = DriverManager.getConnection(props.getProperty("DB_URL"),props.getProperty("DB_USERNAME"),props.getProperty("DB_PASSWORD"));
}
分享我的发现 创建和使用属性文件 我创建了一个database.properties文件(普通文本文件),并将其放在Java项目的src文件夹中
JDBC_DRIVER=com.mysql.jdbc.Driver
USER=YourUser
PASS=YourPassword
DB_URL=jdbc:mysql://IP:PORT/DB
之后,我编辑了openConnection()方法,以使用属性文件加载连接的凭据
public Connection openConnection() {
Properties properties = new Properties();
Connection connection = null;
String path = System.getProperty("user.dir");
path += "/src/database.properties";
try(FileInputStream fin = new FileInputStream(path);) {
properties.load(fin);
try {
Class.forName(properties.getProperty("JDBC_DRIVER"));
// opening connection
connection = (Connection) DriverManager.getConnection(properties.getProperty("DB_URL"),properties.getProperty("USER"),properties.getProperty("PASS"));
} catch (ClassNotFoundException e) {
System.out.println("This is from openConnection method");
e.printStackTrace();
} catch (SQLException f) {
System.out.println("This is from openConnection method");
f.printStackTrace();
}
} catch (IOException io) {
System.out.println("This is from openConnection method");
io.printStackTrace();
}
return connection;
}
发送用户名和密码,Java应用程序->MySQL
从我在网上看到的情况来看,如果在将密码从Java应用程序发送到sequel服务之前对密码进行加密或散列,这一点非常重要。我发现的一个例子是sequel服务dosent有一个“receive hash method and authenticate”。即使它这样做了,散列也需要在程序中的某个地方。当程序可以访问它时,其他人也可以访问它,如果他们真的想要的话。此外,如果哈希是进行身份验证所需的内容,那么您可以返回使用明文密码的位置
然后,讨论以“什么是最佳方法”结束。有些人建议在应用程序和sequel服务之间使用keyserver/auth系统,使用服务器端的数据存储设置,使用OS“wallet”(示例Windows注册表),或者创建一个具有完成作业的最低权限的数据库用户/或只读DB“read_only=1 in my.cnf”
我尝试了第3个选项,创建了一个“DBaccess”用户,只有select权限检索数据,没有管理权限,MySQL随机生成密码。您可以使用属性文件。(也推荐)并且您可以根据需要管理该文件的权限。请参阅此链接:通过加密密码将其存储在属性文件中,然后用代码对其进行解密。还要确保属性文件的读取受到其他人的保护。感谢@VishalZanzrukia我在谷歌上搜索了属性文件并读取到它是一个普通的文本文件,您可以通过输入流读取内容,语法为“key=value”。但是,如何仅管理应用程序对此文件的权限?编辑:我觉得这篇文章很有趣,但不知道它是否仍然有效,因为它从2008年开始谢谢@Almasshaikh是否可以将密码以散列形式发送到数据库并检查其是否正确?如果在程序本身中解密密码,是否可以调试/反编译程序并获取密码?如果反编译代码,则无法获取密码。是的,如果您正在调试它,您可能会得到它。但是有一些方法可以避免……我可能遗漏了一些东西,但既然它是一个开源库,而且是一个已知库,那么每个人都不能解密它吗?我真的wondering@codequestioneer大多数加密算法都是公开的和已知的。这不是一个问题(相反:其他人可以仔细检查算法是良好安全性的必要条件);您只需要确保密码不可供其他人使用。您将如何将其与针对MySQL服务的身份验证结合使用?
JDBC_DRIVER=com.mysql.jdbc.Driver
USER=YourUser
PASS=YourPassword
DB_URL=jdbc:mysql://IP:PORT/DB
public Connection openConnection() {
Properties properties = new Properties();
Connection connection = null;
String path = System.getProperty("user.dir");
path += "/src/database.properties";
try(FileInputStream fin = new FileInputStream(path);) {
properties.load(fin);
try {
Class.forName(properties.getProperty("JDBC_DRIVER"));
// opening connection
connection = (Connection) DriverManager.getConnection(properties.getProperty("DB_URL"),properties.getProperty("USER"),properties.getProperty("PASS"));
} catch (ClassNotFoundException e) {
System.out.println("This is from openConnection method");
e.printStackTrace();
} catch (SQLException f) {
System.out.println("This is from openConnection method");
f.printStackTrace();
}
} catch (IOException io) {
System.out.println("This is from openConnection method");
io.printStackTrace();
}
return connection;
}