【问题标题】:How to hide password to MySQL database from people using the program如何向使用该程序的人隐藏 MySQL 数据库的密码
【发布时间】:2012-07-08 01:02:54
【问题描述】:

我用 JDBC 创建了一个 java 程序,它成功地连接到我的计算机服务器的 MySQL 数据库,如下所示:

    try
    {
        // The newInstance() call is a work around for some
        // broken Java implementations

        Class.forName("com.mysql.jdbc.Driver").newInstance();
    }
    catch (Exception ex)
    {
        // handle the error
    }

    try
    {
        conn = DriverManager.getConnection(("jdbc:mysql://191.168.1.15:3306/databasename"), "username", "password");

        // Do something with the Connection
    }
    catch (SQLException ex)
    {
        // handle any errors
        System.out.println("SQLException: " + ex.getMessage());
        System.out.println("SQLState: " + ex.getSQLState());
        System.out.println("VendorError: " + ex.getErrorCode());
    }

但是,如果有人想找出密码,使用任何 java 反编译器都非常简单。就此而言,我如何才能阻止他们找到密码或用户名?

【问题讨论】:

    标签: java mysql sql sql-server jdbc


    【解决方案1】:

    我建议使用代理,在查询后返回 json 或 xml。这样您就可以从服务器端构建安全性,设置蜜罐陷阱,为查询构建自己的编码器解码器,通过 https 发送内容以阻止侦听器。

    您还可以尝试将用户名和密码存储在字符串中,并将它们作为变量传递。 然后构建一个由相似事物组成的复杂矩阵,并用它做看似复杂的事情,以使黑客在两个小时试图找到您的代码后失去兴趣。

    您还可以考虑将密码放入本机库 dll 或 .so 中,具体取决于您的平台...

    问题依然存在,黑客只需要实现你的一段代码并且他拥有完全的访问权限,所以我强烈推荐代理。

    【讨论】:

      【解决方案2】:

      唯一的方法是使用加密密码并将其存储在单独的文件中。 要反编译它,请使用 webservice。

      或者更好的方法,如果你不想让用户知道你的代码,通过webservice创建完整的应用程序,这样客户端就可以访问外部api,你不需要把你的业务逻辑jar放在客户端机器。我认为这是实现案例的最佳方式。

      【讨论】:

        【解决方案3】:

        当您让用户直接访问您的数据库时,您必须记住您已让他们直接访问您的数据库。你无法改变这一点。再多的加密或混淆都无法消除他们对您数据库的访问权限。

        所以您需要考虑,您是否真的希望他们能够访问您的数据库?

        • 如果您确实要授予数据库访问权限,请确保权限设置正确。例如,如果他们只需要读取权限,请确保您授予他们的用户只有读取权限。

        • 如果您实际上并不希望他们直接访问数据库,但希望他们能够访问数据,那么不要将数据库密码放入您的程序中完全没有。例如,您可能希望在数据库前面设置一个 Web 服务并让您的用户查询该 Web 服务。 Web 服务有数据库密码,但您的用户没有。

        【讨论】:

        • 这是真的,但是,我怎样才能在不暴露数据的情况下输入数据并从数据库中检索数据?
        • @BradenSteffaniak:正如我所说,您可以创建一个可以访问数据库并通过 Web 服务方法公开特定数据的 Web 服务。数据库密码只存储在网络服务器上。
        • 如何创建可以访问它的网络服务?
        • 这是一个广泛的问题。你可以写一整本关于它的书(或者买一本别人写的书)。
        • @BradenSteffaniak:是的,你可以使用它。
        【解决方案4】:

        你没有。这就是静态密码不好的原因。

        您在企业环境中所做的通常是使用外部身份验证方法(例如 LDAP、Active Directory)对数据库进行身份验证,然后使用您确定用户所需访问级别的组。

        MySQL 确实支持external authentication methods。 MS SQL Server 也是如此。

        【讨论】:

          【解决方案5】:

          这取决于您的应用程序。如果您想隐藏这些信息,您可以构建一个 Web 服务或 Web 应用程序。这些数据是安全的。否则您通常不希望他们访问您的数据库,他们应该配置自己的数据库。

          否则,您授予他们访问您的数据库的权限,并且该用户应具有其所需的相应权限,并且您应检查数据库中的每个操作。

          【讨论】:

            【解决方案6】:

            将 jdbc 字符串移动到与编译的类和/或 jar 文件分开的配置文件中。这样,如果您分发代码,那么他们也需要您的配置文件。

            【讨论】:

            • 但这并不能解决问题。用户仍然需要一个(可能不同的)数据库密码,否则应用程序完全没用......
            • 同意,我认为项目不同,但@Mark Byers 的回答是更好的选择。
            猜你喜欢
            • 1970-01-01
            • 2018-06-12
            • 1970-01-01
            • 2014-08-10
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多