Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.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连接到MySQL,而不在Java源代码中显示凭据_Java_Mysql_Jdbc - Fatal编程技术网

使用Java-JDBC连接到MySQL,而不在Java源代码中显示凭据

使用Java-JDBC连接到MySQL,而不在Java源代码中显示凭据,java,mysql,jdbc,Java,Mysql,Jdbc,我试图学习如何创建Java控制台应用程序,连接(在本例中)MySQL DB并发送或检索数据,而不在Java应用程序的源代码中显示用户名和密码我目前没有问题 正在创建显示凭据的连接。 根据我收集到的信息,您总是需要在应用程序中的某个位置显示您的凭据。但是,如何在应用程序和数据库之间实现“安全”连接,以便其他人不会出于恶意原因滥用您的凭据?您可以使用加密用户名和密码。最好的开源加密程序(我的个人观点)是 一种方法是使用具有凭据的属性文件或将数据保存在xml文件中 创建一个如下所示的属性文件 // d

我试图学习如何创建Java控制台应用程序,连接(在本例中)MySQL DB并发送或检索数据,而不在Java应用程序的源代码中显示用户名和密码我目前没有问题 正在创建显示凭据的连接。


根据我收集到的信息,您总是需要在应用程序中的某个位置显示您的凭据。但是,如何在应用程序和数据库之间实现“安全”连接,以便其他人不会出于恶意原因滥用您的凭据?

您可以使用加密用户名和密码。最好的开源加密程序(我的个人观点)是


一种方法是使用具有凭据的属性文件或将数据保存在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;
    }