Java 中的安全 MySQL 连接?

Secure MySQL connection in Java?

我试试这个:

Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/sonoo","root","password");

但有人很容易破解用户名和密码字符串。

Opening Application with zip, winrar or any else program look like this and read code.

如何保护我的连接?

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

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

您需要决定获得您的 JAR 副本的人拥有什么权限。他们是否有权 运行 数据库查询?

如果不应该:删除数据库连接。他们没有权限。

如果他们应该:那么他们可以获得密码。他们有权限。

似乎让您感到困惑的是您给出了数据库的 root 密码,因此您需要第三个选项:"They should be able to do some database queries, but not others."

JAR 文件是尝试解决该问题的错误位置。如果您尝试在 JAR 文件级别解决此问题,将会发生以下两种情况之一。要么你的用户一直都是值得信赖的,而你在使用任何精心设计的方案上浪费了时间,要么你的一些最终用户不值得信赖,其中之一会攻击你。他们会在 JVM 发送它们之前,在最后一秒,如果绝对必要的话,通过逐步执行 JVM 并编辑您的查询字符串来攻击您。 你在这个级别所做的一切都将是安全剧院,就像在机场被搜身一样,它不会让你明显更安全,但你有很小的机会可以说 "but we encrypted it!" 并且您的客户可能不会在 inevitable 安全漏洞后抛弃您。

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

在许多情况下,您希望为用户帐户提供比 table 上的 INSERT、SELECT 或 UPDATE 更细粒度的权限。例如,您可能有逻辑 "you can add to this table, but only if you also update the numbers in this other table." 对于这些,您应该使用存储过程,可以将其权限设置为 "definer" 或 "invoker":由具有适当权限的用户定义权限,然后调用者获得执行此特定查询的高级权限。

在某些情况下,您会遇到一种令人讨厌的情况,您希望将同一个应用程序分发给两个不同的客户端,但他们都可以从能够读取彼此的数据中获益匪浅(以牺牲对方为代价!)。例如,您可能是与两家竞争公司打交道的订单处理商;任何一个都希望看到另一个的订单历史记录。对于这些情况,您有几种选择:

  1. 甚至将 SELECT 语句移动到存储过程中。存储过程可以调用 user(),它仍然可以为您提供登录用户,即使他们不是定义者。
  2. 将数据库查询移出共享 JAR。就像@g-lulu 上面说的,你可以创建一个网络API,你可以很好地锁定它,或者类似的东西。
  3. 复制数据库,将身份验证参数移动到您在启动时读取的单独文件中。

选项 3 要求您编写工具来维护多个数据库,使其成为彼此结构的完美副本,这很糟糕。然而,与 (1) 和 (2) 相比,共享数据库不可避免地会泄漏 一些 信息——例如,auto_increment ID 列可能会泄漏多少订单在全球范围内创建,可能有一些方法可以确定 "oh, they send all of their orders through this unusual table access, so that will also bump this ID at the same time, so I just need to check to see if both IDs are bumped and that'll reveal an order for our rival company" 之类的东西。