Java中的安全MySQL连接?

Java中的安全MySQL连接?,java,mysql,security,jdbc,connection,Java,Mysql,Security,Jdbc,Connection,我试试这个: Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/sonoo","root","password"); 但对某些人来说,破解用户名和密码字符串非常容易 使用zip、winrar或任何其他程序打开应用程序,如下所示并读取代码 如何保护连接?您可以用PHP(或java或其他语言)创建Web服务。此Web服务存储在服务器上,它包含对数据库的访问和查询。 使用桌面应用程序,只需向web服务发

我试试这个:

Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/sonoo","root","password");
但对某些人来说,破解用户名和密码字符串非常容易

使用zip、winrar或任何其他程序打开应用程序,如下所示并读取代码


如何保护连接?

您可以用PHP(或java或其他语言)创建Web服务。此Web服务存储在服务器上,它包含对数据库的访问和查询。 使用桌面应用程序,只需向web服务发送请求(POST、GET)。 PHP Web服务中的示例:

if (isset($_POST['getMember'])){
do a query in your database
insert result into JSON
return JSON
}

您需要决定获得您的JAR副本的人有哪些权限。他们是否具有运行数据库查询的权限

如果不应该:删除数据库连接。他们没有得到许可

如果他们应该:那么他们可以拥有密码。他们得到许可

似乎让您感到困惑的是,您正在为数据库发出root密码,因此您需要第三个选项:“他们应该能够执行一些数据库查询,但不能执行其他查询。”

JAR文件是解决该问题的错误位置。如果您试图在JAR文件级别解决这个问题,将会发生以下两种情况之一。要么你的用户一直都是值得信任的,你在使用任何精心设计的方案上浪费时间,要么你的一些最终用户不值得信任,其中一个会攻击你。如果必须的话,他们会在JVM发出查询字符串之前的最后一秒,通过在JVM中单步执行并编辑查询字符串来攻击您。你在这个级别上所做的一切都是安全的,比如在机场被搜身,这并不会让你更安全,但你很有可能会说“但是我们加密了!”你的客户可能不会在不可避免的安全漏洞后抛弃你

这个问题需要在数据库中解决,方法是创建一个用户帐户,该帐户不具有不应有的权限。当您执行
SHOW GRANTS FOR enduser@“%”
时,它将只显示允许他们执行的查询类型

在许多情况下,您希望为用户帐户提供更细粒度的权限,而不仅仅是插入、选择或更新表。例如,您可能有“您可以添加到此表,但前提是您还更新了此其他表中的数字”的逻辑。对于这些逻辑,您应该使用存储过程,可以将其权限设置为“定义者”或“调用者”:由具有适当权限的用户定义,然后调用者获得执行此特定查询的高级权限

在某些情况下,您会遇到一种糟糕的情况,即您希望将同一应用程序分发给两个不同的客户机,但它们都可以从能够读取彼此的数据中获得显著的好处(以牺牲对方为代价!)。例如,您可能是与两家竞争公司打交道的订单处理者;任何一方都希望看到另一方的订单历史。对于这些情况,您有几个选项:

  • 甚至将SELECT语句移动到存储过程中。存储过程可以调用
    user()
  • 将数据库查询移出共享JAR。就像上面@g-lulu所说的,你可以创建一个你锁定得很好的web API,或者类似的东西
  • 复制数据库,将身份验证参数移动到启动时读取的单独文件中 选项3要求您编写工具,将多个数据库作为彼此结构的完美副本来维护,这很糟糕。然而,与(1)和(2)相比,它有一个很好的优点,即共享数据库不可避免地会泄漏一些信息——例如,一个auto_increment ID列可能会泄漏全局创建的订单数量,并且可能有一些方法来确定如下内容:,“哦,他们通过这个不寻常的表访问发送他们所有的订单,所以这也会同时影响这个ID,所以我只需要检查两个ID是否都受到影响,这将显示我们竞争对手公司的订单。”